翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
複数のプログラムの実行
Amazon Braket には、複数の量子プログラムを効率的に実行するための 2 つのアプローチがあります。プログラムセットと量子タスクバッチ処理です。
プログラムセットは、複数のプログラムでワークロードを実行するために推奨される方法です。これにより、複数のプログラムを単一の Amazon Braket 量子タスクにパッケージ化できます。プログラムセットは、特にプログラム実行数が 100 に近づいた場合に、プログラムを個別に送信するよりもパフォーマンスが向上し
現在、 IQMおよび Rigetti デバイスはプログラムセットをサポートしています。プログラムセットを QPUs に送信する前に、まず 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 デベロッパーガイドのプログラムセットセクションと Braket サンプル Github リポジトリのプログラムセットフォルダ
量子タスクバッチ処理は、すべての 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 の例
プログラムセットとコストについて
プログラムセットは、最大 100 個のプログラムまたはパラメータセットを 1 つの量子タスクにパッケージ化することで、複数の量子プログラムを効率的に実行します。プログラムセットでは、すべてのプログラムの合計ショットに基づいて、タスクごとに 1 つの料金とショットごとに 1 つの料金を支払うだけで、プログラムを個別に送信するよりもコストを大幅に削減できます。このアプローチは、多くのプログラムがあり、プログラムあたりのショット数が少ないワークロードに特に有益です。プログラムセットは現在、 IQM および Rigetti デバイス、および Amazon Braket Local Simulator でサポートされています。
詳細については、詳細な実装手順、ベストプラクティス、コード例については、「プログラムセット」セクションを参照してください。
量子タスクのバッチ処理とコストについて
量子タスクのバッチ処理と請求コストに関する注意点は次のとおりです。
-
デフォルトでは、量子タスクバッチ処理はすべてのタイムアウトを再試行するか、量子タスクを 3 回失敗させます。
-
qubits の 34 など、長時間実行される量子タスクのバッチではSV1、大きなコストが発生する可能性があります。量子タスクのバッチを開始する前に、
run_batch割り当て値を慎重に再確認してください。TN1 で を使用することはお勧めしませんrun_batch。 -
TN1 では、失敗したリハーサルフェーズタスクのコストが発生する可能性があります (詳細についてはTN1 の説明を参照してください)。自動再試行によりコストが増加する可能性があるため、 を使用する場合は、バッチ処理の「max_retries」の数を 0 に設定することをお勧めします TN1 (「量子タスクバッチ処理」、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-th ディクショナリは i-th タスクとペアになります。
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-th 量子タスクは、i-th 入力ディクショナリで実行される回路に対応します。
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)