メインコンテンツまでスキップ

Braketの量子コンピュータ実機でのサンプリング

ここでは、Amazon Braketのバックエンドと、QURI Partsが提供するBraket特有の機能を紹介します。

前提条件

このセクションでは、前のセクション(Samplerサンプリング推定SamplingBackend)で説明したトピックを必要とするので、このセクションの前にそれらを先に読んでください。

ここでは、実際の量子コンピュータを利用したプラットフォームとして、Amazon Braketを利用します。AWSで提供されているBraketデバイスを利用するためには、AWSアカウントを取得し、Braketサービスを有効にする必要があります。詳しくはAmazon Braket Documentationを参照してください。ここでは代わりに、AWSアカウントを必要としないAmazon Braket SDKに含まれるローカルシミュレータを使用します。AWSで提供されているBraketデバイスとローカルシミュレータのインターフェースは同じなので、単純に置き換えることができます。

このチュートリアルで使用するQURI Partsモジュール:quri-parts-circuitquri-parts-corequri-parts-braket

以下のようにインストールできます:

!pip install "quri-parts[braket]"

BraketSamplingBackend

SamplingBackendオブジェクトの作成方法は、使用するバックエンドによって異なります。Braketデバイスの場合、(Amazon Braket SDKによって提供される)braket.devices.Deviceオブジェクトを渡すことで、BraketSamplingBackendを作成できます:

from braket.aws import AwsDevice
from braket.devices import LocalSimulator

# A device for QPU provided on AWS
# device = AwsDevice("arn:aws:braket:us-west-1::device/qpu/rigetti/Aspen-M-2")

# A device for the local simulator
device = LocalSimulator()
from quri_parts.braket.backend import BraketSamplingBackend

# Create a SamplingBackend with the device
backend = BraketSamplingBackend(device)

このサンプリングバックエンドを使って、サンプリングバックエンドチュートリアルのサンプリングバックエンドとサンプラーのセクションとまったく同じコードを実行できます。

量子ビットマッピング

ここでは、Braketが提供するデバイスを使用する際に知っておくべき詳細について説明します。サンプリングバックエンドチュートリアルのコードに従って、次のような量子ビットマッピングのサンプリングを考えます。

from numpy import pi
from quri_parts.circuit import QuantumCircuit
from quri_parts.core.sampling import create_sampler_from_sampling_backend

circuit = QuantumCircuit(4)
circuit.add_X_gate(0)
circuit.add_H_gate(1)
circuit.add_Y_gate(2)
circuit.add_CNOT_gate(1, 2)
circuit.add_RX_gate(3, pi/4)

backend = BraketSamplingBackend(device, qubit_mapping={0: 3, 1: 2, 2: 0, 3: 1})
sampler = create_sampler_from_sampling_backend(backend)
sampling_result = sampler(circuit, 1000)
print(sampling_result)
#output
{3: 432, 5: 425, 11: 79, 13: 64}

デバイスからの測定結果は、元の量子ビットのインデックスで解釈できるように逆向きにマッピングされるため、結果は量子ビットのマッピングがないものと似ています。

注記

上記のマッピングは元の量子ビットインデックスの並べ替えであり、インデックスが33より大きいデバイス量子ビットは含まれていないことに気づいているでしょう。このようなマッピングを選択した理由は、LocalSimulatorのエラーを避けるためです。LocalSimulatorは連続しない量子ビットインデックスを受け付けません。一方、SamplingBackendの量子ビットマッピング機能は、以下に示すように、そのようなマッピングを受け入れます。

AWSで提供されているデバイスにqubitマッピングを適用する場合、デバイスにdisable_qubit_rewiring=Trueを渡して手動でのqubit割り当てを有効にする必要があります。このような引数(braket.devices.Deviceオブジェクトのrunメソッドのキーワード引数)は、BraketSamplingBackendオブジェクトのrun_kwargs引数で指定できます:

# Commented out because it requires an access to a real device on AWS

# device = AwsDevice("arn:aws:braket:us-west-1::device/qpu/rigetti/Aspen-M-2")
# backend = BraketSamplingBackend(
# device,
# qubit_mapping={0: 10, 1: 13, 2: 17, 3: 21},
# run_kwargs={"disable_qubit_rewiring": True},
# )
# sampler = create_sampler_from_sampling_backend(backend)
# sampling_result = sampler(circuit, 1000)
# print(sampling_result)

実行前の回路変換

デフォルトで実行されるトランスパイルはバックエンドに依存します。BraketSamplingBackendの場合、すべてのデバイスに対してquri_parts.braket.circuit.BraketSetTranspilerを使用し、quri_parts.braket.backend.transpilerで定義されたデバイス固有のトランスパイルも実行します。BraketSamplingBackendcircuit_transpiler引数を与えることで、前者(デバイスに依存しないトランスパイル)を変更することが可能です。