你当前正在访问 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# 内联代码时也是如此。

  1. 在 VS Code 中,选择“视图 > 命令面板”,然后选择“创建:新 Jupyter Notebook”。

  2. 在右上角,VS Code 将检测并显示为笔记本选择的 Python 版本和虚拟 Python 环境。 如果有多个 Python 环境,可能需要使用右上角的内核选取器选择内核。 如果未检测到任何环境,请参阅 VS Code 中的 Jupyter Notebook 以获取设置信息。

  3. 在笔记本的第一个单元格中,运行

    import azure.quantum
    
    workspace = azure.quantum.Workspace(
        resource_id = "", # add your resource ID
        location = "", # add your location, for example "westus"
    )
    
  4. 单击“+ 代码以在笔记本中添加新单元格并导入 qsharp Python SDK。

    import qsharp
    
  5. 选择所选的量子target。 在此示例中,你将 IonQ 模拟器 用作 target.

    target = workspace.get_targets("ionq.simulator")
    
  6. 选择配置文件的配置,或Adaptive_RIUnrestrictedBasetarget

    qsharp.init(target_profile=qsharp.TargetProfile.Base) # or qsharp.TargetProfile.Adaptive_RI, qsharp.TargetProfile.Unrestricted
    

    注意

    Adaptive_RItarget 目前,Quantinuum targets支持配置文件作业。 有关详细信息,请参阅 集成混合量子计算

  7. Q#编写程序。 例如,以下 Q# 程序生成随机位。 为了说明输入参数的使用,此程序采用整数和 n角度 angle数组作为输入。

    %%qsharp
    open Microsoft.Quantum.Measurement;
    open Microsoft.Quantum.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;
    }
    
  8. 接下来,创建会话。 假设你要运行 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# 字符串值。

  9. 创建会话后,可用于 workspace.list_session_jobs 检索会话中所有作业的列表。 有关详细信息,请参阅 如何管理会话

Target 行为

每个量子硬件提供程序定义自己的启发式,以最好地管理会话中作业的优先级。

Quantinuum

如果选择将会话中的作业提交到 Quantinuum target,只要在彼此之间一分钟内将作业排在队列中,你的会话将具有对硬件的独占访问权限。 之后,将使用标准队列和优先级逻辑接受和处理作业。