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-circuit
とquri-parts-core
とquri-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}
デバイスからの測定結果は、元の量子ビットのインデックスで解釈できるように逆向きにマッピングされるため、結果は量子ビットのマッピングがないものと似ています。
上記のマッピングは元の量子ビットインデックスの並べ替えであり、インデックスがより大きいデバイス量子ビットは含まれていないことに気づいているでしょう。このようなマッピングを選択した理由は、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
で定義されたデバイス固有のトランスパイルも実行します。BraketSamplingBackend
にcircuit_transpiler
引数を与えることで、前者(デバイスに依存しないトランスパイル)を変更することが可能です。