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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在预留期间运行量子任务

从“创建预留”中获取有效的预留 ARN 后,您可以创建要在预留期间运行的量子任务。使用预留 ARN 提交的量子任务和混合任务不会显示在设备队列中。在预约开始时间之前提交的任务将保持该QUEUED状态,直到您的预订开始。

注意

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

在预约期间,既可以创建预留任务,也可以创建常规任务。要验证创建的 Braket 量子任务是否与预留关联,请在 Braket 控制台中查看量子任务页面上的 “预留 ARN” 字段,或者使用 SDK 查询任务元数据中的相同字段。本页的其余部分将介绍如何指定哪些任务与预留相关联。

您可以使用Python SDKs诸如 Brak et、、、之类的量子任务 CUDA-QPennyLaneQiskit,也可以直接使用 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 语句中创建的所有任务均以独占访问该设备的方式运行。

首先,定义量子电路和设备。然后,使用预留上下文并运行任务。确保您的整个工作负载都在with区块内运行;在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.ForteEnterprise1) # run the circuit in a reservation with DirectReservation(device, reservation_arn="<my_reservation_arn>"): task = device.run(bell, shots=100)

只要创建量子任务时DirectReservation上下文处于活动状态 CUDA-QPennyLane,就可以使用、和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) qpu = BraketProvider().get_backend("Forte Enterprise 1") # run the circuit in a reservation with DirectReservation(Devices.IonQ.ForteEnterprise1, reservation_arn="<my_reservation_arn>"): qpu_task = qpu.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.ForteEnterprise1.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.ForteEnterprise1, reservation_arn="<my_reservation_arn>"): probs = bell_state()

手动设置预留上下文

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

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

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

注意

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

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

reservation_context.stop() # unset reservation context
注意

预订有预先确定的开始和结束时间(参见创建预订)。reservation_context.start()reservation_context.stop() 方法不会开始或终止预留。相反,当上下文处于活动状态时,您创建的任何量子任务都将与您的预留相关联,并且仅在您的计划预留期间运行。预订上下文对预定预订时间没有影响。

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

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

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

此方法直接将量子任务与预留 ARN 关联起来,确保其在预留期内运行。对于此选项,请将预留 ARN 添加到您计划在预留期间运行的每项任务中。但是,请注意,在使用第三方库(例如Qiskit或)时PennyLane,可能很难确保提交的任务使用的是正确的预留 ARN。因此,建议使用 DirectReservation 上下文管理器。

直接使用 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)