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

如何使用 Cirq 将线路提交到 Azure Quantum

了解如何使用 azure-quantumPython 包提交 Cirq 量子线路。 可以通过使用本地计算机上的 Azure Quantum 开发工具包(QDK)、Jupyter Notebook 和 Visual Studio Code(VS Code)将 Cirq 电路提交到 Azure Quantum。

有关详细信息,请参阅量子线路

先决条件

有关安装详细信息,请参阅 设置 QDK 扩展

  • 在您的 Azure 订阅中创建一个 Azure Quantum 工作区。 若要创建工作区,请参阅创建 Azure Quantum 工作区

  • 安装了 Python 的 Python 环境。

  • 安装了 Azure Quantum 开发工具包PythonJupyter 扩展的 VS Code。

  • 带有 [cirq] 标记的 Azure Quantum azure-quantum 包,以及 qsharpipykernel 包。

    python -m pip install --upgrade azure-quantum[cirq] qsharp ipykernel 
    

    注意

    如果未检测到 Jupyter Python 内核 ipykernel ,VS Code 将提示你安装它。

创建新的 Jupyter Notebook

  1. 在 VS Code 中,选择“视图 > 命令面板”,然后选择“创建:新 Jupyter Notebook”。
  2. 在右上角,VS Code 将检测并显示笔记本选择的 Python 版本和虚拟 Python 环境。 如果有多个 Python 环境,可能需要使用右上角的内核选取器选择内核。 如果未检测到任何环境,请参阅 VS Code 中的 Jupyter Notebook 以获取设置信息。

加载所需的导入项

在笔记本的第一个单元中,运行以下代码以加载所需的导入:

import azure.quantum
from azure.quantum.cirq import AzureQuantumService

连接到 Azure Quantum 服务

若要连接到 Azure Quantum 服务,程序将需要资源 ID 和 Azure Quantum 工作区的位置。

  1. 登录到 Azure 帐户, https://portal.azure.com

  2. 选择 Azure Quantum 工作区,然后导航到 “概述”。

  3. 复制字段中的参数。

    Visual Studio Code 的屏幕截图,其中显示了如何展开 Quantum 工作区的概述窗格。

添加一个新单元格,并使用您的帐户信息创建 WorkspaceAzureQuantumService 对象以连接到 Azure Quantum 工作区。

workspace = Workspace(  
    resource_id = "", # Add the resourceID of your workspace
    location = "" # Add the location of your workspace (for example "westus")
    )

service = AzureQuantumService(workspace)

列出所有 targets

使用 targets() 方法列出工作区中所有可以运行线路的 targets,包括当前排队时间和可用性。

注意

你工作区中的targets可能不会全部列出 - 此处仅会列出可以接受 Cirq 或 OpenQASM 电路的targets。

print(service.targets())
[<Target name="quantinuum.qpu.h2-1", avg. queue time=0 s, Degraded>,
<Target name="quantinuum.sim.h2-1sc", avg. queue time=1 s, Available>,
<Target name="quantinuum.sim.h2-1e", avg. queue time=40 s, Available>,
<Target name="ionq.simulator", avg. queue time=3 s, Available>,
<Target name="ionq.qpu.aria-1", avg. queue time=1136774 s, Available>]

创建简单线路

接下来,创建要运行的简单的 Cirq 电路。 此线路使用 IonQ 硬件系统固有的 X 门平方根。

import cirq

q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
    cirq.X(q0)**0.5,             # Square root of X
    cirq.CX(q0, q1),              # CNOT
    cirq.measure(q0, q1, key='b') # Measure both qubits
)
print(circuit)
0: ───X^0.5───@───M────────
              │   │
1: ───────────X───M────────

选择 target 来运行程序

在 IonQ 模拟器上运行

现在,可以通过 Azure Quantum 服务运行程序并获取结果。 以下单元格提交一个作业(到默认的 IonQ 模拟器),该作业会运行线路 100 次,请等待作业完成并返回结果。

result = service.run(program=circuit, repetitions=100, target="ionq.simulator")

这会返回一个 cirq.Result 对象。

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

估算作业成本

在 QPU 上运行作业之前,应估算运行的成本。

有关最新定价详细信息,请参阅 IonQ 定价,或通过以下网页找到你的工作区并查看该工作区的“提供商”选项卡中的定价选项:aka.ms/aq/myworkspaces

在 IonQ QPU 上运行

上一个作业在默认模拟器 "ionq.simulator" 上运行。 但是,你也可以在 IonQ 的硬件处理器(Quantum 处理器单位 (QPU))上运行它。 若要在 IonQ QPU 上运行,请提供 "ionq.qpu.aria-1" 作为 target 参数:

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.qpu.aria-1",
    timeout_seconds=500 # Set timeout to accommodate queue time on QPU
)

这会再次返回一个 cirq.Result 对象。

print(result)
b=0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111, 0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111

使用作业的异步模型

对于长期运行的线路,异步运行它们可能会很有用。 service.create_job 方法会返回 Job 对象,在作业成功运行后,可以将该对象用于获取结果。

job = service.create_job(
    program=circuit,
    repetitions=100,
    target="ionq.simulator"
)

若要检查作业状态,请使用 job.status()

print(job.status())
'completed'

若要等待作业完成并获取结果,请使用阻止调用 job.results()

result = job.results()
print(result)
00: 0.5
11: 0.5

注意,这不会返回 cirq.Result 对象。 而是返回一个特定于 IonQ 模拟器的结果对象,使用状态概率而不是测量数据。

type(result)
cirq_ionq.results.SimulatorResult

若要将此对象转换为 cirq.Result 对象,请使用 result.to_cirq_result()

print(result.to_cirq_result())
b=1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100, 1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100