翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
量子タスクのバッチ処理
量子タスクバッチ処理は、ローカルシミュレーターを除くすべての Amazon Braket デバイスで使用できます。バッチ処理は複数の量子タスクを並行して処理できるため、オンデマンドシミュレーター (TN1 または SV1) で実行する量子タスクに特に役立ちます。さまざまな量子タスクのセットアップに役立つように、Amazon Braket にはサンプルノートブックが用意されています
バッチ処理を使用すると、量子タスクを並行して起動できます。例えば、10 個の量子タスクを必要とする計算を行い、それらの量子タスクの回路が互いに独立している場合は、バッチ処理を使用することをお勧めします。これにより、ある量子タスクが完了するのを待ってから別のタスクを開始する必要がなくなります。
次の例は、量子タスクのバッチを実行する方法を示しています。
circuits = [bell for _ in range(5)] batch = device.run_batch(circuits, s3_folder, shots=100) print(batch.results()[0].measurement_counts) # The result of the first quantum task in the batch
詳細については、GitHub のAmazon Braket の例
量子タスクのバッチ処理とコストについて
量子タスクのバッチ処理と請求のコストについて留意すべきいくつかの注意事項:
-
デフォルトでは、量子タスクバッチ処理はすべてのタイムアウトを再試行するか、量子タスクを 3 回失敗させます。
-
qubits の 34 など、長時間実行される量子タスクのバッチではSV1、大きなコストが発生する可能性があります。量子タスクのバッチを開始する前に、
run_batch
割り当て値を注意深く再確認してください。TN1 で を使用することはお勧めしませんrun_batch
。 -
TN1 では、失敗したリハーサルフェーズタスクのコストが発生する可能性があります (詳細についてはTN1 の説明を参照してください)。自動再試行によってコストが増加する可能性があるため、 を使用する場合は、バッチ処理の「max_retries」の数を 0 に設定することをお勧めします TN1 (「量子タスクバッチ処理」、186 行
目を参照)。
量子タスクのバッチ処理と PennyLane
次の例に示すように、Amazon Braket で PennyLane を使用している場合は、Amazon Braket デバイスをインスタンス化parallel = True
するときに を設定して、バッチ処理を活用します。
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
ディクショナリ、または入力ディクショナリlist
の を指定できます。この場合、次の例に示すように、i
-th ディクショナリは i
-th タスクとペアになります。
from braket.circuits import Circuit, FreeParameter, Observable from braket.aws import AwsQuantumTaskBatch # 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
-番目の量子タスクは、i
-番目の入力ディクショナリで実行される回路に対応します。
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)