在预留期间运行量子任务 - Amazon Braket

在预留期间运行量子任务

从“创建预留”中获取有效的预留 ARN 后,您可以创建要在预留期间运行的量子任务。在您的预留开始之前,这些任务将保持 QUEUED 状态。

注意

预留视 AWS 账户和设备而定。只有创建预留的 AWS 账户才能使用您的预留 ARN。

注意

对于使用预留 ARN 提交的任务和作业,队列不可见,因为只有在预留期间,您的任务才会运行。

您可以使用诸如 BraketQiskitPennyLane 之类的 Python SDKs 创建量子任务,也可以直接使用 boto3(使用 Boto3)创建量子任务。要使用预留,您必须拥有 Amazon Braket Python SDK 版本 1.79.0 或更高版本。您可以使用以下代码更新到最新的 Braket SDK、Qiskit 提供程序和 PennyLane 插件。

pip install --upgrade amazon-braket-sdk amazon-braket-pennylane-plugin qiskit-braket-provider

使用 DirectReservation 上下文管理器运行任务

在计划预留中运行任务的推荐方法是使用 DirectReservation 上下文管理器。通过指定您的目标设备和预留 ARN,上下文管理器可确保在 Python with 语句中创建的所有任务均以独占访问该设备的方式运行。

首先,定义量子电路和设备。然后,使用预留上下文并运行任务。

from braket.aws import AwsDevice, DirectReservation from braket.circuits import Circuit from braket.devices import Devices bell = Circuit().h(0).cnot(0, 1) device = AwsDevice(Devices.IonQ.Aria1) # run the circuit in a reservation with DirectReservation(device, reservation_arn="<my_reservation_arn>"): task = device.run(bell, shots=100)

只要创建量子任务时 DirectReservation 上下文处于活动状态,您就可以使用 PennyLane 和 Qiskit 插件在预留中创建量子任务。例如,使用 Qiskit-Braket 提供程序,您可以按如下方式运行任务。

from braket.devices import Devices from braket.aws import DirectReservation from qiskit import QuantumCircuit from qiskit_braket_provider import BraketProvider qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) aria = BraketProvider().get_backend("Aria 1") # run the circuit in a reservation with DirectReservation(Devices.IonQ.Aria1, reservation_arn="<my_reservation_arn>"): aria_task = aria.run(qc, shots=10)

同样,以下代码在预留期间使用 Braket-PennyLane 插件运行电路。

from braket.devices import Devices from braket.aws import DirectReservation import pennylane as qml dev = qml.device("braket.aws.qubit", device_arn=Devices.IonQ.Aria1.value, wires=2, shots=10) @qml.qnode(dev) def bell_state(): qml.Hadamard(wires=0) qml.CNOT(wires=[0, 1]) return qml.probs(wires=[0, 1]) # run the circuit in a reservation with DirectReservation(Devices.IonQ.Aria1, reservation_arn="<my_reservation_arn>"): probs = bell_state()

手动设置预留上下文

您还可以使用以下代码手动设置预留。

# set reservation context reservation = DirectReservation(device, reservation_arn="<my_reservation_arn>").start() # run circuit during reservation task = device.run(bell, shots=100)

这非常适合 Jupyter 笔记本,其中,上下文可以在第一个单元格中运行,所有后续任务都将在预留中运行。

注意

包含 .start() 调用的单元只能运行一次

要切换回按需模式,请执行以下操作:重新启动 Jupyter 笔记本,或调用以下命令将上下文改回按需模式。

reservation.stop() # unset reservation context
注意

预留有预定的开始和结束时间(请参阅创建预留)。reservation.start()reservation.stop() 方法不会开始或终止预留。这些是修改所有后续量子任务以在预留期间运行的方法。这些方法对预定的预留时间没有影响。

创建任务时明确传递预留 ARN

在预留期间创建任务的另一种方法是在调用 device.run() 时明确传递预留 ARN。

task = device.run(bell, shots=100, reservation_arn="<my_reservation_arn>")

此方法直接将量子任务与预留 ARN 关联起来,确保其在预留期内运行。对于此选项,请将预留 ARN 添加到您计划在预留期间运行的每项任务中。此外,请检查在 Qiskit 或 PennyLane 中创建的任务是否使用了正确的预留 ARN。出于这些额外考虑,建议使用前两种方法。

直接使用 boto3 时,请在创建任务时将预留 ARN 作为关联传递。

import boto3 braket_client = boto3.client("braket") kwargs["associations"] = [ { "arn": "<my_reservation_arn>", "type": "RESERVATION_TIME_WINDOW_ARN", } ] response = braket_client.create_quantum_task(**kwargs)