你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
会话入门
会话是混合量子计算的关键功能,可用于将多个量子计算作业组合在一起。
本文介绍混合量子计算中的会话体系结构以及如何创建新会话。
先决条件
若要创建会话,需要满足以下先决条件:
具有活动订阅的 Azure 帐户。 如果没有 Azure 帐户,请免费注册并注册 即用即付订阅。
Azure Quantum 工作区。 有关详细信息,请参阅创建 Azure Quantum 工作区。
安装了 Python 和 Pip 的 Python 环境。
Azure Quantum
azure-quantum
包。 如果要使用 Qiskit 或 Cirq,则需要使用 [qiskit] 或 [cirq] 标记安装azure-quantum
包。pip install --upgrade azure-quantum[qiskit]
什么是会话?
会话是提交到单个 target作业的一个或多个作业的逻辑分组。 每个会话都具有附加到该会话中每个作业的唯一 ID。
在会话中,客户端计算资源可能会移到云中,从而导致延迟较低,并且能够重复使用不同的参数执行量子线路。 作业可以按逻辑方式分组为一个会话,并且该会话中的作业可以优先于非会话作业。 尽管量子比特状态不会在作业之间保留,但会话允许作业的队列时间缩短,并且运行时间更长。
会话允许你组织多个量子计算作业,并能够在量子作业之间运行经典代码。 你将能够运行复杂的算法,以便更好地组织和跟踪单个量子计算作业。
在会话中可能需要合并作业的关键用户方案是 参数化 量子算法,其中一个量子计算作业的输出会通知下一个量子计算作业的参数。 此类算法的最常见示例是 Variational Quantum Eigensolvers (VQE) 和 Quantum Approximate Optimization Algorithms (QAOA)。
支持的硬件
所有量子计算硬件提供程序都支持会话。 在某些情况下,在会话中提交的作业优先于该 target会话的队列中。 有关详细信息,请参阅 Target 行为。
如何创建会话
若要创建会话,请执行以下步骤:
此示例演示如何在 Visual Studio Code 中使用 Jupyter Notebook 创建包含 Q# 内联代码的会话。 还可以使用调用相邻Q#程序的 Python 程序创建会话。
注意
会话使用 Python 进行管理,即使在运行 Q# 内联代码时也是如此。
在 VS Code 中,选择“视图 > 命令面板”,然后选择“创建:新 Jupyter Notebook”。
在右上角,VS Code 将检测并显示为笔记本选择的 Python 版本和虚拟 Python 环境。 如果有多个 Python 环境,可能需要使用右上角的内核选取器选择内核。 如果未检测到任何环境,请参阅 VS Code 中的 Jupyter Notebook 以获取设置信息。
在笔记本的第一个单元格中,运行
import azure.quantum workspace = azure.quantum.Workspace( resource_id = "", # add your resource ID location = "", # add your location, for example "westus" )
单击“+ 代码”以在笔记本中添加新单元格并导入
qsharp
Python SDK。import qsharp
选择所选的量子target。 在此示例中,你将 IonQ 模拟器 用作 target.
target = workspace.get_targets("ionq.simulator")
选择配置文件的配置,或
Adaptive_RI
Unrestricted
Base
。targetqsharp.init(target_profile=qsharp.TargetProfile.Base) # or qsharp.TargetProfile.Adaptive_RI, qsharp.TargetProfile.Unrestricted
注意
Adaptive_RI
target 目前,Quantinuum targets支持配置文件作业。 有关详细信息,请参阅 集成混合量子计算。Q#编写程序。 例如,以下 Q# 程序生成随机位。 为了说明输入参数的使用,此程序采用整数和
n
角度angle
数组作为输入。%%qsharp import Std.Measurement.*; import Std.Arrays.*; operation GenerateRandomBits(n: Int, angle: Double[]) : Result[] { use qubits = Qubit[n]; // n parameter as the size of the qubit array for q in qubits { H(q); } R(PauliZ, angle[0], qubits[0]); // arrays as entry-points parameters R(PauliZ, angle[1], qubits[1]); let results = MeasureEachZ(qubits); ResetAll(qubits); return results; }
接下来,创建会话。 假设你要运行
GenerateRandomBit
操作三次,因此,你使用target.submit
数据提交 Q# 操作target
,并且重复代码三次 - 在实际方案中,你可能想要提交不同的程序,而不是相同的代码。angle = [0.0, 0.0] with target.open_session(name="Q# session of three jobs") as session: target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 1", shots=100) # First job submission angle[0] += 1 target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 2", shots=100) # Second job submission angle[1] += 1 target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 3", shots=100) # Third job submission session_jobs = session.list_jobs() [session_job.details.name for session_job in session_jobs]
重要
将参数作为参数传递给作业时,调用时
qsharp.compile
会将参数格式化为Q#表达式。 这意味着需要注意将参数的格式设置为 Q# 对象。 在此示例中,由于 Python 中的数组已打印为 [item0, item1, ...],因此输入参数与格式匹配 Q# 。 对于其他 Python 数据结构,可能需要进行更多处理才能以兼容方式插入 Q# 字符串值。创建会话后,可用于
workspace.list_session_jobs
检索会话中所有作业的列表。 有关详细信息,请参阅 如何管理会话。
Target 行为
每个量子硬件提供程序定义自己的启发式,以最好地管理会话中作业的优先级。
Quantinuum
如果选择将会话中的作业提交到 Quantinuum target,只要在彼此之间一分钟内将作业排在队列中,你的会话将具有对硬件的独占访问权限。 之后,将使用标准队列和优先级逻辑接受和处理作业。