你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
会话是混合量子计算的关键功能,可用于将多个量子计算作业组合在一起。 会话是提交到单个 target作业的一个或多个作业的逻辑分组。 每个会话都具有附加到该会话中每个作业的唯一 ID。 如果要按顺序运行多个量子计算作业,且能够在量子作业之间运行经典代码,会话非常有用。
本文介绍混合量子计算中的会话体系结构以及如何创建新会话。
先决条件
若要创建会话,需要满足以下先决条件:
具有活动订阅的 Azure 帐户。 如果没有 Azure 帐户,请免费注册并注册 即用即付订阅。
工作区 Azure Quantum 。 有关详细信息,请参阅 “创建 Azure Quantum 工作区”。
安装了 Python 的 Python 环境。
包
azure-quantumPython 。 如果要使用Qiskit或Cirq,您需要安装带有qiskit或cirq额外功能的azure-quantum软件包。pip install --upgrade azure-quantum[qiskit]或
pip install --upgrade azure-quantum[cirq]
什么是会话?
在会话中,客户端计算资源可能会移到云中,从而导致延迟较低,并且能够重复使用不同的参数执行量子线路。 作业可以按逻辑方式分组为一个会话,并且该会话中的作业可以优先于非会话作业。 尽管量子比特状态不会在作业之间保留,但会话允许作业的队列时间缩短,并且运行时间更长。
会话允许你组织多个量子计算作业,并能够在量子作业之间运行经典代码。 你将能够运行复杂的算法,以便更好地组织和跟踪单个量子计算作业。
在会话中可能需要合并作业的关键用户方案是 参数化 量子算法,其中一个量子计算作业的输出会通知下一个量子计算作业的参数。 此类算法的最常见示例是 Variational Quantum Eigensolvers (VQE) 和 Quantum Approximate Optimization Algorithms (QAOA)。
支持的硬件
所有量子计算硬件提供商均支持会话。 在某些情况下,会话中提交的作业在该 target 队列中被优先处理。 有关详细信息,请参阅 目标行为。
如何创建会话
若要创建会话,请执行以下步骤:
此示例演示如何使用Q#内联代码在Jupyter Notebook中创建Visual Studio Code(VS Code)会话。 还可以使用Python调用相邻Q#程序的程序创建会话。
注意
即使在运行Q#内联代码时,会话也受Python管理。
在 VS Code中,打开 “视图 ”菜单,然后选择 “命令面板”。
输入并选择创建:新建Jupyter Notebook。
在右上角,VS Code 将检测并显示笔记本选择的 Python 版本和虚拟 Python 环境。 如果有多个 Python 环境,可能需要使用右上角的内核选取器选择内核。 如果未检测到任何环境,请参阅 Jupyter Notebook 在 VS Code 中的设置信息。
在笔记本的第一个单元中,运行以下代码:
from qdk.azure import Workspace workspace = Workspace( resource_id = "", # add your resource ID location = "", # add your location, for example "westus" )在笔记本中添加一个新单元格并导入
qsharpPython 包:from qdk import qsharp选择 量子 target。 在此示例中, target 是 IonQ 模拟器。
target = workspace.get_targets("ionq.simulator")-
qsharp.init(target_profile=qsharp.TargetProfile.Base) # or qsharp.TargetProfile.Adaptive_RI, qsharp.TargetProfile.Unrestricted注意
Adaptive_RItarget 目前,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检索会话中所有作业的列表。 有关详细信息,请参阅 如何管理会话。
目标行为
每个量子硬件提供程序定义自己的启发式,以最好地管理会话中作业的优先级。
Quantinuum
如果选择将会话中的作业提交到 Quantinuum target,则只要在一分钟内将作业排成队列,会话就有权访问硬件。 之后,任务将被接受并使用标准的排队和优先级处理逻辑进行处理。