

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 複数のプログラムを実行する
<a name="braket-batching-tasks"></a>

Amazon Braket は、複数の量子プログラムを効率的に実行するための 2 つのアプローチとして、プログラムセットと量子タスクバッチ処理を提供しています。

**プログラムセット**は、複数のプログラムでワークロードを実行する場合に推奨される方法であり、複数のプログラムを単一の Amazon Braket 量子タスクにパッケージ化できます。プログラムセットは、特にプログラム実行数が 100 に近づいた場合に、プログラムを個別に送信するよりも[パフォーマンスの向上](https://aws.amazon.com/blogs/quantum-computing/amazon-braket-introduces-program-sets-enabling-customers-to-run-quantum-programs-up-to-24x-faster/)とコストの削減を実現します。

現在、プログラムセットは IQM および Rigetti デバイスでサポートされています。プログラムセットを QPU に送信する前に、まず [Amazon Braket Local Simulator でテスト](https://docs.aws.amazon.com/braket/latest/developerguide/braket-send-to-local-simulator.html)することをお勧めします。デバイスがプログラムセットをサポートしているかどうかを確認するには、Amazon Braket SDK を使用して[デバイスのプロパティ](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/braket_features/Getting_Devices_and_Checking_Device_Properties.ipynb)を表示するか、[Amazon Braket コンソール](https://console.aws.amazon.com/braket/)でデバイスページを表示します。

次の例は、プログラムセットの実行方法を示しています。

```
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 デベロッパーガイド」の「[プログラムセット](https://docs.aws.amazon.com/braket/latest/developerguide/braket-constructing-circuit.html#braket-program-set)」セクションと、Braket サンプル Github リポジトリの[プログラムセットのフォルダー](https://github.com/amazon-braket/amazon-braket-examples/tree/main/examples/braket_features/program_sets)を参照してください。

**量子タスクバッチ処理**は、すべての 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](https://github.com/amazon-braket/amazon-braket-examples)」を参照してください。

**Topics**
+ [プログラムセットとコストについて](#braket-program-sets-costs)
+ [量子タスクのバッチ処理とコストについて](#braket-batching-costs)
+ [量子タスクのバッチ処理と PennyLane](#braket-batching-pennylane)
+ [タスクバッチ処理とパラメータ化された回路](#braket-batching-parametrized-circuits)

## プログラムセットとコストについて
<a name="braket-program-sets-costs"></a>

プログラムセットは、最大 100 個のプログラムまたはパラメータセットを 1 つの量子タスクにパッケージ化することで、複数の量子プログラムを効率的に実行します。プログラムセットでは、タスクごとに 1 つの料金を支払うとともに、すべてのプログラムのショット総数に基づいてショットごとに 1 つの料金を支払うだけであり、プログラムを個別に送信するよりもコストを大幅に削減できます。このアプローチは、多くのプログラムがあってプログラムあたりのショット数が少ないワークロードに特に有益です。プログラムセットは現在、IQM および Rigetti デバイス、および Amazon Braket Local Simulator でサポートされています。

詳細な実装手順、ベストプラクティス、コード例など詳細については、「[プログラムセット](https://docs.aws.amazon.com/braket/latest/developerguide/braket-constructing-circuit.html#braket-program-set)」セクションを参照してください。

## 量子タスクのバッチ処理とコストについて
<a name="braket-batching-costs"></a>

量子タスクのバッチ処理と請求コストに関して留意すべきいくつかの注意点を以下に挙げます。
+ デフォルトでは、量子タスクのバッチ処理はすべてのタイムアウトまたは失敗した量子タスクを 3 回再試行します。
+ SV1 の 34 qubitsなど、長時間実行される量子タスクのバッチでは、大きなコストが発生する可能性があります。量子タスクのバッチを開始する前に、「`run_batch`」の割り当て値を入念にチェックしてください。TN1 を `run_batch` と一緒に使用することはお勧めしません。
+  TN1 では、失敗したリハーサルフェーズタスクのコストが発生する可能性があります (詳細については [TN1 の説明](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html#braket-simulator-tn1)をご覧ください)。自動再試行によりコストが増加する可能性があるため、TN1 を使用する場合は、バッチ処理の「max\_retries」の数を 0 に設定することをお勧めします ([量子タスクバッチ処理のページの 186 行目](https://github.com/aws/amazon-braket-sdk-python/blob/4c7c3b28e5a17b8f0cddf94377b7734fcbe2ebfc/src/braket/aws/aws_quantum_task_batch.py#L186)を参照)。

## 量子タスクのバッチ処理と PennyLane
<a name="braket-batching-pennylane"></a>

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 を使用したバッチ処理の詳細については、「[量子回路の並列化最適化](https://github.com/aws/amazon-braket-examples/blob/main/examples/pennylane/1_Parallelized_optimization_of_quantum_circuits/1_Parallelized_optimization_of_quantum_circuits.ipynb)」を参照してください。

## タスクバッチ処理とパラメータ化された回路
<a name="braket-batching-parametrized-circuits"></a>

パラメータ化された回路を含む量子タスクバッチを送信する場合、バッチ内のすべての量子タスクに使用される `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)
```