

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

# 在预留期间运行量子任务
<a name="braket-run-quantum-task-with-reservation"></a>

从“[创建预留](https://docs.aws.amazon.com/braket/latest/developerguide/braket-reservations.html#braket-create-a-reservation)”中获取有效的预留 ARN 后，您可以创建要在预留期间运行的量子任务。使用预留 ARN 提交的量子任务和混合任务不会显示在设备队列中。在预约开始时间之前提交的任务将保持该`QUEUED`状态，直到您的预订开始。

**注意**  
预订视 AWS 账户和设备而定。只有创建预留的 AWS 账户才能使用您的预订 ARN。  
在预约期间，既可以创建预留任务，也可以创建常规任务。要验证创建的 Braket 量子任务是否与预留关联，请在 Braket 控制台中查看量子任务页面上的 “预留 ARN” 字段，或者使用 SDK 查询任务元数据中的相同字段。本页的其余部分将介绍如何指定哪些任务与预留相关联。

您可以使用Python SDKs诸如 [Brak](https://docs.aws.amazon.com/braket/latest/developerguide/braket-references.html) et、、、之类的量子任务 [https://github.com/NVIDIA/cuda-quantum](https://github.com/NVIDIA/cuda-quantum)，也可以直接使用 boto3（[使用](https://docs.aws.amazon.com/braket/latest/developerguide/braket-using-boto3.html) Boto3）创建量子任务。要使用预留，您必须拥有 [Amazon Braket Python SDK](https://github.com/amazon-braket/amazon-braket-sdk-python) 版本 [1.79.0](https://github.com/amazon-braket/amazon-braket-sdk-python/releases/tag/v1.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 
```

**注意**  
 预订有预先确定的开始和结束时间（参见[创建预订](https://docs.aws.amazon.com/braket/latest/developerguide/braket-reservations.html#braket-create-a-reservation)）。`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)
```