本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
运行多个程序
Amazon Braket 提供了两种高效运行多个量子程序的方法:程序集和量子任务批处理。
程序集是使用多个程序运行工作负载的首选方式。它们允许您将多个程序打包成单个 Amazon Braket 量子任务。与单独提交程序相比,程序集可以提高性能
目前IQM,Rigetti设备支持程序集。在向提交程序集之前 QPUs,建议先在 Amazon Braket 本地模拟器上进行测试。要检查设备是否支持程序集,您可以使用 Amazon Brak et SDK 查看设备的属性
以下示例说明如何运行程序集。
from math import pi from braket.devices import LocalSimulator from braket.program_sets import ProgramSet from braket.circuits import Circuit program_set = ProgramSet([ Circuit().h(0).cnot(0,1), Circuit().rx(0, pi/4).ry(1, pi/8).cnot(1,0), Circuit().t(0).t(1).cz(0,1).s(0).cz(1,2).s(1).s(2), ]) device = LocalSimulator() result = device.run(program_set, shots=300).result() print(result[0][0].counts) # The result of the first program in the program set
要详细了解构造程序集(例如,使用单个程序从多个可观察对象或参数构造程序集)和检索程序集结果的不同方法,请参阅 Amazon Braket 开发者指南中的程序集部分和 Braket 示例 Github 存储库中的程序集
每台 Amazon Braket 设备都支持@@ 量子任务批处理。批处理对于在按需模拟器(DM1或TN1)上运行的量子任务特别有用SV1,因为它们可以并行处理多个量子任务。批处理允许您并行启动量子任务。例如,如果您希望进行需要10个量子任务的计算,并且这些量子任务中的程序相互独立,则建议使用任务批处理。在不支持程序集的设备上运行包含多个程序的工作负载时,请使用量子任务批处理。
以下示例显示如何运行一批量子任务。
from braket.circuits import Circuit from braket.devices import LocalSimulator bell = Circuit().h(0).cnot(0, 1) circuits = [bell for _ in range(5)] device = LocalSimulator() batch = device.run_batch(circuits, shots=100) print(batch.results()[0].measurement_counts) # The result of the first quantum task in the batch
有关批处理的更多具体信息,请参阅上的 Amazon Braket 示例
关于计划集和费用
程序集通过将多达 100 个程序或参数集打包到单个量子任务中来高效运行多个量子程序。对于节目集,您只需支付每项任务的费用加上基于所有节目的总镜头的每次拍摄费用,与单独提交节目相比,可以大大降低成本。这种方法对于有许多程序且每个程序的镜头数量少的工作负载特别有益。目前,IQM和Rigetti设备以及 Amazon Braket 本地模拟器都支持程序集。
有关更多信息,请参阅程序集部分,了解详细的实现步骤、最佳实践和代码示例。
关于量子任务批处理和成本
关于量子任务批处理和计费成本,请记住一些注意事项:
-
默认情况下,量子任务批处理重试全部超时或量子任务失败 3 次。
-
一批长时间运行的量子任务(qubits例如 SV1 34 for)可能会产生高昂的成本。在开始一批量子
run_batch任务之前,请务必仔细检查分配值。我们不建议TN1搭配使用run_batch。 -
TN1可能因排练阶段的任务失败而产生费用(有关更多信息,请参阅 TN1 说明)。自动重试可能会增加成本,因此我们建议在使用时将批处理时的 “max_retries” 次数设置为 0TN1(参见 Quantum Task
Batching,第 186 行)。
量子任务批处理和 PennyLane
在 Amazon Braket PennyLane 上使用时,通过parallel = True设置实例化 Amazon Braket 设备的时间,充分利用批处理功能,如以下示例所示。
import pennylane as qml # Define the number of wires (qubits) you want to use wires = 2 # For example, using 2 qubits # Define your S3 bucket my_bucket = "amazon-braket-s3-demo-bucket" my_prefix = "pennylane-batch-output" s3_folder = (my_bucket, my_prefix) device = qml.device("braket.aws.qubit", device_arn="arn:aws:braket:::device/quantum-simulator/amazon/sv1", wires=wires, s3_destination_folder=s3_folder, parallel=True)
有关批处理的更多信息 PennyLane,请参阅量子电路的并行优化。
任务批处理和参数化电路
提交包含参数化电路的量子任务批处理时,您可以提供inputs字典(用于批次中的所有量子任务)或输入字典,在这种情况下,第-th 字典与i第-th 个任务配对,如以下示例所示。list i
from braket.circuits import Circuit, FreeParameter, Observable from braket.aws import AwsQuantumTaskBatch, AwsDevice # Define your quantum device device = AwsDevice("arn:aws:braket:::device/quantum-simulator/amazon/sv1") # Create the free parameters alpha = FreeParameter('alpha') beta = FreeParameter('beta') # Create two circuits circ_a = Circuit().rx(0, alpha).ry(1, alpha).cnot(0, 2).xx(0, 2, beta) circ_a.variance(observable=Observable.Z(), target=0) circ_b = Circuit().rx(0, alpha).rz(1, alpha).cnot(0, 2).zz(0, 2, beta) circ_b.expectation(observable=Observable.Z(), target=2) # Use the same inputs for both circuits in one batch tasks = device.run_batch([circ_a, circ_b], inputs={'alpha': 0.1, 'beta': 0.2}) # Or provide each task its own set of inputs inputs_list = [{'alpha': 0.3, 'beta': 0.1}, {'alpha': 0.1, 'beta': 0.4}] tasks = device.run_batch([circ_a, circ_b], inputs=inputs_list)
您还可以为单个参数电路准备输入字典列表,然后将其作为量子任务批量提交。如果列表中有 N 个输入字典,则该批次包含 N 个量子任务。i第 n 个量子任务对应于使用i第-t 个输入字典执行的电路。
from braket.circuits import Circuit, FreeParameter # Create a parametric circuit circ = Circuit().rx(0, FreeParameter('alpha')) # Provide a list of inputs to execute with the circuit inputs_list = [{'alpha': 0.1}, {'alpha': 0.2}, {'alpha': 0.3}] tasks = device.run_batch(circ, inputs=inputs_list, shots=100)