翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
複数のプログラムを実行する
Amazon Braket は、複数の量子プログラムを効率的に実行するための 2 つのアプローチとして、プログラムセットと量子タスクバッチ処理を提供しています。
プログラムセットは、複数のプログラムでワークロードを実行する場合に使用をお勧めする方法です。プログラムセットにより、複数のプログラムを単一の Amazon Braket 量子タスクにパッケージ化できます。プログラムセットは、特にプログラム実行数が 100 に近づいた場合に、プログラムを個別に送信するよりもパフォーマンスが向上し
現在、プログラムセットは IQM および Rigetti デバイスでサポートされています。プログラムセットを QPU に送信する前に、まず Amazon Braket Local Simulator でテストすることをお勧めします。デバイスがプログラムセットをサポートしているかどうかを確認するには、Amazon Braket 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
プログラムセットのさまざまな構築方法 (例えば、1 つのプログラムで多数のオブザーバブルまたはパラメータからプログラムセットを構築する方法) と、プログラムセットの結果を取得する方法に関する詳細は、「Amazon Braket デベロッパーガイド」の「program sets」セクションと、Braket サンプル Github リポジトリの「program sets folder
量子タスクバッチ処理は、すべての Amazon Braket デバイスで使用できます。バッチ処理は、複数の量子タスクを並行して処理できるため、オンデマンドシミュレーター (SV1、DM1 または TN1) で実行する量子タスクで特に便利です。バッチ処理を使用すると、量子タスクを並行して起動できます。例えば、回路が互いに独立している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
バッチ処理の具体的な詳細については、GitHub の「Amazon Braket examples
プログラムセットとコストについて
プログラムセットは、最大 100 個のプログラムまたはパラメータセットを 1 つの量子タスクにパッケージ化することで、複数の量子プログラムを効率的に実行します。プログラムセットでは、タスクごとに 1 つの料金を支払うとともに、すべてのプログラムのショット総数に基づいてショットごとに 1 つの料金を支払うだけであり、プログラムを個別に送信するよりもコストを大幅に削減できます。このアプローチは、多くのプログラムがあってプログラムあたりのショット数が少ないワークロードに特に有益です。プログラムセットは現在、 IQM および Rigetti デバイス、および Amazon Braket Local Simulator でサポートされています。
詳細な実装手順、ベストプラクティス、コード例など詳細については、「Program sets」セクションを参照してください。
量子タスクのバッチ処理とコストについて
量子タスクのバッチ処理と請求コストに関して留意すべきいくつかの注意点を以下に挙げます。
-
デフォルトでは、量子タスクのバッチ処理はすべてのタイムアウトまたは失敗した量子タスクを 3 回再試行します。
-
SV1 の 34 qubitsなど、長時間実行される量子タスクのバッチでは、大きなコストが発生する可能性があります。量子タスクのバッチを開始する前に、「
run_batch」の割り当て値を入念にチェックしてください。TN1 をrun_batchと一緒に使用することはお勧めしません。 -
TN1 では、失敗したリハーサルフェーズタスクのコストが発生する可能性があります (詳細については「the TN1 description」を参照してください)。自動再試行によりコストが増加する可能性があるため、TN1 を使用する場合は、バッチ処理の「max_retries」の数を 0 に設定することをお勧めします (「Quantum Task Batching」、186 行目
を参照)。
量子タスクのバッチ処理と PennyLane
Amazon Braket で PennyLane を使用する際にバッチ処理を利用するには、Amazon Braket デバイスをインスタンス化する際に、次の例に示すように parallel = True を設定します。
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ディクショナリ、または入力ディクショナリのlistを提供することができます。後者の場合、次の例に示すように、i 番目のディクショナリは 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 番目の量子タスクは、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, shots=100)