你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
快速入门:使用 Azure Quantum 笔记本通过 Qiskit 提交线路
了解如何使用 Azure Quantum 服务将 Qiskit 量子线路提交给 IonQ 或 Quantinuum 量子计算目标。 本示例使用 Azure Quantum 笔记本和内置的 azure-quantum Python 包 - 无需安装或配置。 有关详细信息,请参阅量子线路。
先决条件
- 具有活动订阅的 Azure 帐户。 免费创建帐户。
- 创建 Azure Quantum 工作区。 有关详细信息,请参阅创建 Azure Quantum 工作区。
在工作区中创建一个新笔记本
- 登录到 Azure 门户并选择在上一步中创建的工作区。
- 在左侧边栏选项卡中,选择“笔记本”。
- 单击“我的笔记本”,然后单击“新增”。
- 在“内核类型”中选择“IPython”。
- 键入文件的名称(例如 Qiskit.ipynb),然后单击“创建文件”。
打开新笔记本时,会自动根据订阅和工作区信息创建第一个单元的代码。
from azure.quantum import Workspace
workspace = Workspace (
subscription_id = <your subscription ID>,
resource_group = <your resource group>,
name = <your workspace name>,
location = <your location>
)
注意
除非另有说明,否则应按照单元的创建顺序运行每个单元,以避免任何编译问题。
单击单元左侧的三角形“播放”图标以运行代码。
加载所需的导入项
首先需要导入一些附加模块。
单击“+ 代码”添加一个新的单元,然后添加并运行以下代码:
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from qiskit.tools.monitor import job_monitor
from azure.quantum.qiskit import AzureQuantumProvider
连接到 Azure Quantum 服务
接下来,使用 AzureQuantumProvider 构造函数创建连接到 Azure Quantum 工作区的 provider 对象。 使用以下代码添加一个新单元,但暂时不要运行它:
provider = AzureQuantumProvider(
resource_id="",
location=""
)
在运行此单元之前,程序需要资源 ID 和 Azure Quantum 工作区的位置:
- 单击“保存”以保存你的笔记本。
- 单击“概述”以查看工作区属性。
- 将鼠标悬停在“资源 ID”字段上,然后单击“复制到剪贴板”图标。
- 单击“笔记本”并打开你的 Qiskit 笔记本。
- 将资源 ID 粘贴到 resource_id 的值中,然后将第一个单元中的位置字符串添加到 location 中。
- 运行单元。

定义简单线路
在新的单元中创建一个 circuit 对象。 此示例是一个简单的量子随机比特生成器。 添加以下代码以定义并显示线路:
# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(3, 3)
circuit.name = "Qiskit Sample - 3-qubit GHZ circuit"
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure([0, 1, 2], [0, 1, 2])
# Print out the circuit
circuit.draw()
┌───┐ ┌─┐
q_0: ┤ H ├──■───────┤M├──────
└───┘┌─┴─┐ └╥┘┌─┐
q_1: ─────┤ X ├──■───╫─┤M├───
└───┘┌─┴─┐ ║ └╥┘┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
└───┘ ║ ║ └╥┘
c: 3/════════════════╩══╩══╩═
0 1 2
列出所有目标
现在可以显示工作区中可用的所有量子计算目标或后端。 添加一个新单元并运行以下行:
print("This workspace's targets:")
for backend in provider.backends():
print("- " + backend.name())
This workspace's targets:
- quantinuum.hqs-lt-s1
- quantinuum.hqs-lt-s1-apival
- quantinuum.hqs-lt-s2
- quantinuum.hqs-lt-s2-apival
- quantinuum.hqs-lt-s1-sim
- ionq.qpu
- ionq.simulator
选择一个目标以运行程序
若要在实际的量子硬件上运行代码之前检查该代码,可以使用 IonQ 量子模拟器 ionq.simulator。
添加新的单元并创建一个对象来表示 IonQ 量子模拟器目标:
# Get IonQ quantum simulator target:
simulator_backend = provider.get_backend("ionq.simulator")
在 IonQ 模拟器上运行
若要在模拟器上运行线路,请添加以下代码。该代码使用目标的 run 方法提交你的作业,然后监视作业状态。
# Submit the circuit to run on Azure Quantum
job = simulator_backend.run(circuit, shots=100)
job_id = job.id()
print("Job id", job_id)
# Monitor job progress and wait until complete:
job_monitor(job)
将实时显示作业状态:
Job id 7d909574-98d4-11ec-b382-00155d957f5d
Job status: job is queued
Job status: job is actively running
Job status: job has successfully run
成功运行作业后,获取并显示作业结果:
# Get the job results:
result = job.result()
print(result)
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='7d909574-98d4-11ec-b382-00155d957f5d', success=True, results=[ExperimentResult(shots=100, success=True, meas_level=2, data=ExperimentResultData(counts=defaultdict(<class 'int'>, {'000': 50, '111': 50}), probabilities=defaultdict(<class 'int'>, {'000': 0.5, '111': 0.5})), header=QobjExperimentHeader(meas_map='[0, 1, 2]', name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])
由于此 result 类型是 Qiskit 包的原生对象,你可以使用 Qiskit 的 result.get_counts 和 plot_histogram 来可视化结果。 若要确保表示所有可能的位字符串标签,请将它们添加到 counts。
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
{'000': 50, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 50}

估算作业成本
在实际的量子硬件或量子处理单元 (QPU) 上运行作业之前,可以估算其运行成本。
首先,再次获取可用提供商的列表:
print("This workspace's targets:")
for backend in provider.backends():
print("- " + backend.name())
This workspace's targets:
- quantinuum.hqs-lt-s1
- quantinuum.hqs-lt-s1-apival
- quantinuum.hqs-lt-s2
- quantinuum.hqs-lt-s2-apival
- quantinuum.hqs-lt-s1-sim
- ionq.qpu
- ionq.simulator
接下来,创建一个对象来表示 IonQ 量子计算机:
qpu_backend = provider.get_backend("ionq.qpu")
若要估算在 QPU 上运行作业的成本,请使用目标的 estimate_cost 方法添加并运行一个新单元:
cost = qpu_backend.estimate_cost(circuit, shots=100)
print(f"Estimated cost: {cost.estimated_total}")
这会显示以美元为单位的估算成本。
有关最新定价详细信息,请参阅 IonQ 定价,或找到你的工作区并查看该工作区的“提供商”边栏选项卡中的定价选项。
在 IonQ QPU 上运行
在 IonQ 模拟器上成功运行并估算 QPU 成本后,可以在硬件上运行线路。
注意
在 QPU 上运行线路所需的时间因当前队列时间而异。 可以通过选择工作区的“提供商”边栏选项卡查看目标的平均队列时间。
使用前面在 API 验证程序中使用的相同 run 方法和运算来提交并监视作业:
# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, shots=1024)
job_id = job.id()
print("Job id", job_id)
# Monitor job progress and wait until complete:
job_monitor(job)
Job id 54e8c740-98d9-11ec-b382-00155d957f5d
Job Status: job has successfully run
成功运行作业后,如前所述获取作业结果并在图表中显示结果:
result = job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Job id 910b5ac8-98cd-11ec-b3ba-00155d5528cf
Job Status: job has successfully run
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='Job id 54e8c740-98d9-11ec-b382-00155d957f5d', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'0': 505, '1': 6, '2': 1, '3': 1, '4': 1, '5': 10, '6': 11, '7': 488}, probabilities={'0': 0.4932, '1': 0.0059, '2': 0.001, '3': 0.001, '4': 0.001, '5': 0.0098, '6': 0.0117, '7': 0.4766}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])
{'000': 505, '001': 6, '010': 1, '011': 1, '100': 1, '101': 10, '110': 11, '111': 488}

选择一个目标以运行程序
若要在实际的量子硬件上运行代码之前检查该代码,可以使用 Quantinuum API 验证程序 honeywell.hqs-lt-s1-apival。
添加新的单元并创建一个对象来表示 Quantinuum API 验证程序目标:
# Get Quantinuum's API validator target:
apival_backend = provider.get_backend("quantinuum.hqs-lt-s1-apival")
在 API 验证程序上运行
若要在 API 验证程序上运行线路,请添加以下代码。该代码使用目标的 run 方法提交你的作业,然后监视作业状态。
# Submit the circuit to run on Azure Quantum
job = apival_backend.run(circuit, count=100)
job_id = job.id()
print("Job id", job_id)
# Monitor job progress and wait until complete:
job_monitor(job)
将实时显示作业状态:
Job id 89511b08-9691-11ec-be32-00155d00ae89
Job status: job is queued
Job status: job is actively running
Job status: job has successfully run
成功运行作业后,获取并显示作业结果:
# Get the job results:
result = job.result()
print(result)
Result(backend_name='quantinuum.hqs-lt-s1-apival', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='89511b08-9691-11ec-be32-00155d00ae89', success=True, results=[ExperimentResult(shots=100, success=True, meas_level=2, data=ExperimentResultData(counts={'000': 100}, probabilities={'000': 1.0}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit'))])
由于此 result 类型是 Qiskit 包的原生对象,你可以使用 Qiskit 的 result.get_counts 和 plot_histogram 来可视化结果。 若要确保表示所有可能的位字符串标签,请将它们添加到 counts。
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
{'000': 100, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 0}

查看直方图,你可能会注意到,随机数生成器每次都返回 0,因此算不上随机。 这是因为,虽然 API 验证程序可确保代码在 Quantinuum 硬件上成功运行,但每次量子测量时它也会返回 0。 对于真正的随机数生成器,需要在量子硬件上运行线路。
估算作业成本
在实际的量子硬件或量子处理单元 (QPU) 上运行作业之前,可以估算其运行成本。
首先,再次获取可用提供商的列表:
print("This workspace's targets:")
for backend in provider.backends():
print("- " + backend.name())
This workspace's targets:
- quantinuum.hqs-lt-s1
- quantinuum.hqs-lt-s1-apival
- quantinuum.hqs-lt-s2
- quantinuum.hqs-lt-s2-apival
- quantinuum.hqs-lt-s1-sim
- ionq.qpu
- ionq.simulator
接下来,创建一个对象用于表示由 Honeywell 提供支持的 Quantinuum System Model H1:
qpu_backend = provider.get_backend("quantinuum.hqs-lt-s1")
若要估算在 QPU 上运行作业的成本,请使用目标的 estimate_cost 方法添加并运行一个新单元:
cost = qpu_backend.estimate_cost(circuit, count=100)
print(f"Estimated cost: {cost.estimated_total}")
Estimated cost: 5.72
这将显示 H-System Quantum 额度 (HQC) 中的估算成本。
有关最新定价详细信息,请参阅由 Honeywell 提供支持的 System Model H1,或查看工作区的“提供商”边栏选项卡中的定价选项。 若要查看当前额度状态和用量,请选择“额度和配额”。
在 Quantinuum QPU 上运行
在 API 验证程序中成功运行并估算 QPU 成本后,可以在硬件上运行线路。
注意
在 QPU 上运行线路所需的时间取决于当前队列时间。 可以通过选择工作区的“提供商”边栏选项卡查看目标的平均队列时间。
使用前面在 API 验证程序中使用的相同 run 方法和运算来提交并监视作业:
# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, count=100)
job_id = job.id()
print("Job id", job_id)
# Monitor job progress and wait until complete:
job_monitor(job)
Job id 48282d18-9c15-11ec-bfbd-00155d6373ba
Job Status: job has successfully run
成功运行作业后,如前所述获取作业结果并在直方图中显示结果:
result = job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
可以看到,结果应大致在 0 和 1 之间划分。
Result(backend_name='quantinuum.hqs-lt-s1', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='48282d18-9c15-11ec-bfbd-00155d6373ba', success=True, results=[ExperimentResult(shots=100, success=True, meas_level=2, data=ExperimentResultData(counts={'111': 53, '101': 1, '000': 46}, probabilities={'111': 0.53, '101': 0.01, '000': 0.46}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit'))])
{'000': 46, '001': 0, '010': 0, '011': 0, '100': 0, '101': 1, '110': 0, '111': 53}

重要
当前不支持在单个作业中提交多个线路。 作为一种变通方法,可以调用 backend.run 方法来异步提交每个线路,然后提取每个作业的结果。 例如:
jobs = []
for circuit in circuits:
jobs.append(backend.run(circuit, shots=N))
results = []
for job in jobs:
results.append(job.result())
后续步骤
在寻找更多示例以供运行? 查看 Azure Quantum 的示例目录。
最后,如果你想要详细了解如何编写 Q# 程序,请参阅 Q# 编程语言用户指南。