你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

会话入门

会话是混合量子计算的关键功能,可用于将多个量子计算作业组合在一起。 会话是提交到单个 target作业的一个或多个作业的逻辑分组。 每个会话都具有附加到该会话中每个作业的唯一 ID。 如果要按顺序运行多个量子计算作业,且能够在量子作业之间运行经典代码,会话非常有用。

本文介绍混合量子计算中的会话体系结构以及如何创建新会话。

先决条件

若要创建会话,需要满足以下先决条件:

  • 具有活动订阅的 Azure 帐户。 如果没有 Azure 帐户,请免费注册并注册 即用即付订阅

  • 工作区 Azure Quantum 。 有关详细信息,请参阅 “创建 Azure Quantum 工作区”。

  • 安装了 Python 的 Python 环境。

  • azure-quantumPython 。 如果要使用Qiskit或Cirq,您需要安装带有qiskitcirq额外功能的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管理。

  1. 在 VS Code中,打开 “视图 ”菜单,然后选择 “命令面板”。

  2. 输入并选择创建:新建Jupyter Notebook

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

  4. 在笔记本的第一个单元中,运行以下代码:

    from qdk.azure import Workspace
    
    workspace = Workspace(
        resource_id = "", # add your resource ID
        location = "", # add your location, for example "westus"
    )
    
  5. 在笔记本中添加一个新单元格并导入 qsharpPython 包:

    from qdk import qsharp
    
  6. 选择 量子 target。 在此示例中, target 是 IonQ 模拟器

    target = workspace.get_targets("ionq.simulator")
    
  7. 选择配置文件的配置target

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

    注意

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

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

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

目标行为

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

Quantinuum

如果选择将会话中的作业提交到 Quantinuum target,则只要在一分钟内将作业排成队列,会话就有权访问硬件。 之后,任务将被接受并使用标准的排队和优先级处理逻辑进行处理。