最初の回路を構築する
ノートブックインスタンスが起動したら、作成したノートブックを選択して、標準の Jupyter インターフェイスでインスタンスを開きます。
Amazon Braket ノートブックインスタンスは、Amazon Braket SDK とそのすべての依存関係があらかじめインストールされています。conda_braket カーネルを使用して新しいノートブックを作成することから始めます。
シンプルな「こんにちは、世界!」という 例から始めることができます。まず、ベル状態を準備する回路を構築し、その回路を異なるデバイスで実行して結果を取得します。
まず、Amazon Braket SDK モジュールをインポートし、simpleBRAKETlong SDK モジュールを定義して、基本的なベル状態回路を定義します。
import boto3 from braket.aws import AwsDevice from braket.devices import LocalSimulator from braket.circuits import Circuit # Create the circuit bell = Circuit().h(0).cnot(0, 1)
回路を視覚化するには、次のコマンドを使用します。
print(bell)
T : │ 0 │ 1 │ ┌───┐ q0 : ─┤ H ├───●─── └───┘ │ ┌─┴─┐ q1 : ───────┤ X ├─ └───┘ T : │ 0 │ 1 │
[ローカルシミュレーターで回路を実行する]
次に、回路を実行する量子デバイスを選択します。Amazon Braket SDK には、ラピッドプロトタイピングとテスト用のローカルシミュレーターが付属しています。ローカルシミュレーターは、最大 25 qubits (ローカルハードウェアによって異なります) の小さい回路に使用することをお勧めします。
ローカルシミュレーターをインスタンス化するコードは次のとおりです。
# Instantiate the local simulator local_sim = LocalSimulator()
次に、回路を実行するコードは次のとおりです。
# Run the circuit result = local_sim.run(bell, shots=1000).result() counts = result.measurement_counts print(counts)
次のような結果が表示されます。
Counter({'11': 503, '00': 497})
準備した特定のベル状態は |00> と |11> の等しい重ね合わせであり、期待どおり、測定結果として 00 と 11 (shotノイズまで含めて) がほぼ等しい分布となりました。
オンデマンドシミュレーターで回路を実行する
Amazon Braket は、より大きな回路を実行するためのオンデマンドのハイパフォーマンスシミュレーター SV1 へのアクセスも提供します。SV1 は、最大 34 qubitsで構成される量子回路のシミュレーションを可能にするオンデマンドの状態ベクトルシミュレーターです。SV1 の詳細については、「サポートされるデバイス」セクションおよび AWS コンソールでご覧になれます。SV1 (および TN1 または QPU) でタスクを実行する場合、量子タスクの結果はアカウントの S3 バケットに保存されます。バケットを指定しない場合、Braket SDK によりデフォルトのバケット amazon-braket-{region}-{accountID} が作成されます。詳細については、「Amazon Braket へのアクセスの管理」を参照してください。
注記
実際の既存のバケット名を入力します。次の例では、バケット名として amazon-braket-s3-demo-bucket が表示されます。Amazon Braket のバケット名は常に amazon-braket- で始まり、追加した他の識別文字が続きます。S3 バケットを設定する方法に関する情報が必要な場合は、「Amazon S3 の開始方法」を参照してください。
# Get the account ID aws_account_id = boto3.client("sts").get_caller_identity()["Account"] # The name of the bucket my_bucket = "amazon-braket-s3-demo-bucket" # The name of the folder in the bucket my_prefix = "simulation-output" s3_folder = (my_bucket, my_prefix)
SV1 で回路を実行するには、.run() コールの位置引数として前に選択した S3 バケットの場所を指定する必要があります。
# Choose the cloud-based on-demand simulator to run your circuit device = AwsDevice("arn:aws:braket:::device/quantum-simulator/amazon/sv1") # Run the circuit task = device.run(bell, s3_folder, shots=100) # Display the results print(task.result().measurement_counts)
Amazon Braket コンソールには、量子タスクに関する詳細情報が表示されます。コンソールの [量子タスク] タブに移動します。量子タスクはリストの上部にあるはずです。または、一意の量子タスク ID またはその他の条件を使用して量子タスクを検索することもできます。
注記
90 日後、Amazon Braket は、量子タスクに関連付けられているすべての量子タスク ID およびその他のメタデータを自動的に削除します。詳細については、「データ保持期間」を参照してください。
QPU で実行する
Amazon Braket を使用すると、1 行のコードを変更するだけで、物理量子コンピュータで前の量子回路の例を実行できます。Amazon Braket により、IonQ、IQM、QuEra、および Rigetti が QPU デバイスにアクセスできるようになりました。さまざまなデバイスおよび可用性ウィンドウに関する情報は、[サポートされるデバイス] セクション、および AWS コンソールの [デバイス] タブにあります。次の例は、IQM デバイスのインスタンス化方法を示しています。
# Choose the IQM hardware to run your circuit device = AwsDevice("arn:aws:braket:eu-north-1::device/qpu/iqm/Garnet")
または、次のコードで IonQ デバイスを選択するという方法もあります。
# Choose the Ionq device to run your circuit device = AwsDevice("arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1")
デバイスを選択してからワークロードを実行するまでの間に、次のコードを使用してデバイスキューの深さをクエリし、量子タスクまたはハイブリッドジョブの数を確認できます。また、カスタマーは Amazon Braket Management Consoleの [デバイス] ページでもデバイス固有のキューの深さを確認できます。
# Print your queue depth print(device.queue_depth().quantum_tasks) # Returns the number of quantum tasks queued on the device # {<QueueType.NORMAL: 'Normal'>: '0', <QueueType.PRIORITY: 'Priority'>: '0'} print(device.queue_depth().jobs) # Returns the number of hybrid jobs queued on the device # '2'
タスクを実行すると、Amazon Braket SDK が結果をポーリングします (デフォルトのタイムアウトは 5 日後です)。このデフォルトを変更するには、以下の例に示すように .run() コマンドの poll_timeout_seconds パラメータを変更します。ポーリングタイムアウトが短すぎると、QPU が利用できない場合など、ポーリング時間内に結果が返されない場合があり、ローカルタイムアウトエラーが返されることに注意してください。ポーリングを再開するには、task.result() 関数を呼び出します。
# Define quantum task with 1 day polling timeout task = device.run(bell, s3_folder, poll_timeout_seconds=24*60*60) print(task.result().measurement_counts)
また、キューの位置を確認するには、量子タスクまたはハイブリッドジョブを送信した後で queue_position() 関数を呼び出します。
print(task.queue_position().queue_position) # Return the number of quantum tasks queued ahead of you # '2'