Amazon Web Services ブログ
Qiskit provider for Amazon Braket のご紹介
この記事は、Introducing the Qiskit provider for Amazon Braket を翻訳したものです。
お客様からよくいただくリクエストである、Qiskit provider for Amazon Braket についてお伝えできることを嬉しく思います。 多くのユーザーに使用されているオープンソースの量子プログラミング SDK である Qiskit の既存のアルゴリズムを使って、数行のコードを書くだけで Amazon Braket で直接実行できます。qiskit-braket-provider は現在、Rigetti と Oxford Quantum Circuits からの超伝導量子処理装置 (QPU、Quantum Processing Unit)、IonQ のイオントラップ QPU、および Braket のオンデマンドシミュレータ (SV1、TN1、DM1) へのアクセスをサポートしています。
qiskit-braket-provider は、Qiskit Advocate Mentorship Program の一環として、オープンソースの寄稿者 David Morcuende によって開発されました。この開発には、Amazon Braket チームも協力しています。Braket Python SDK と Braket Examples GitHub リポジトリがオープンソースである理由は、まさにこのようなプロジェクトを後押しするためです。私たちは、量子コンピューティングコミュニティの誰もが、この分野の将来に貢献し、影響を与えることができるようにしたいと考えています。貢献したいユーザーは、期待する量子アルゴリズムやソフトウェア機能の例、量子アプリケーションの開発を容易にするツールやプラグインを定義できます。さらに新しい量子アルゴリズムを考案することもできます。Amazon Braket に関するオープンソースプロジェクトのアイデアがあれば、Braket examples レポジトリ または Braket Python SDK リポジトリに issue を提出してください。そうすれば、最終的には qiskit-braket-provider のようなツールを作り上げることになるかもしれません。
Qiskit コードを Braket 量子デバイスで実行するには
このチュートリアルでは、Qiskit 回路を実行して、ローカルマシンから Amazon Braket で利用可能な複数の異なる QPU に、Jupyter Notebook またはお気に入りの IDE のいずれかで、エンタングル状態を生成する方法を学習します。このガイドに従い、pip
経由で qiskit-braket-provider をインストールすることで、Braket のマネージドノートブックを使用することもできます。
セットアップとインストール
AWS アカウントを持っていない場合、または AWS ユーザーだが Amazon Braket を使用したことがない場合は、QPU などの Braket リソースにアクセスできるようにローカル開発環境をセットアップする必要があります。これは、このチュートリアルのステップ 1~5 に従って実行できます。このセットアップを完了すると、1) AWS アカウント、2) AWS アクセスキー ID とシークレットアクセスキー、3) Braket サービスとサードパーティデバイス (QPU) が有効化されます。またローカル環境に 4) AWS コマンドラインインターフェイス (CLI) がインストールされ、AWS リソースへのプログラムによるアクセスが許可されます。さらにローカル環境に 5) Amazon Braket SDK がpip
インストールされます。
次に、ターミナルからローカル環境に qiskit-braket-provider をpip install
します。
provider が適切にインストールされたか確かめるには、Python を立ち上げてライブラリをインポートします。
provider が正常にインストールされているなら、プロンプトには空の出力が返されるはずです。これで、量子プログラムを作成する準備ができました。
Qiskit でエンタングル状態を生成する
量子コンピュータの「Hello, World!」プログラムでは、2 量子ビットのエンタングル状態であるベル状態を作ることが一般的です。より多くの量子ビットを同じようにエンタングルさせると、GHZ 状態と呼ばれるものを生成できます。以下では、qiskit-braket-provider を使用して、Amazon Braket 上の複数のバックエンドに対して回路を実行する方法を紹介します。Qiskit では、3 量子ビットの GHZ 状態を生成するコードは以下のようになります。
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
# Apply H-gate to the first qubit:
qc.h(0)
# Apply a CNOT to each qubit:
for qubit in range(1, 3):
qc.cx(0, qubit)
以下のようにして回路を可視化できます。
qc.draw('mpl')
この回路では、初めに 0 番目の量子ビットにアダマールゲートをかけて重ね合わせ状態にします。その後、0 番目の量子ビットを制御ビット、他の 2 量子ビットをそれぞれターゲットビットとした制御 X ゲートを作用させます。これにより、全ての量子ビットが互いにエンタングルした量子状態となります。もしこの回路をシミュレートした場合、量子ビットの間に完全に相関のある測定結果を常に得ることができます。およそ半分の測定で量子ビットは全て 0 と測定され、もう半分では全て 1 と測定されます。量子力学は本来確率的なものであるため、回路の測定回数(ショット数)を増やせば増やすほど、000 状態と 111 状態を得られる確率は 1/2 に近づいていきます。それでは、qiskit-braket-provider を用いた Braket ローカルシミュレータ上で、この回路を 1000 ショットで実行してみましょう。
from qiskit_braket_provider import BraketLocalBackend
local_simulator = BraketLocalBackend()
task = local_simulator.run(circuit, shots=1000)
測定結果を確認するため、Qiskit から便利なプロット関数を呼び出し、それぞれの状態を測定する確率をプロットしてみましょう。
from qiskit.visualization import plot_histogram
plot_histogram(task.result().get_counts())
予想したように、およそ 50-50 の確率で、量子ビットが全て 0 か全て 1 の状態のみを観測します。
実機の量子コンピュータ上で回路を実行する
もし GHZ 回路を一つの(もしくは複数の)実機の量子コンピュータ上で実行したくなった場合でも、バックエンドを指定するだけです。
from qiskit_braket_provider import AWSBraketProvider
provider = AWSBraketProvider()
# devices
ionq_device = provider.get_backend("IonQ Device")
rigetti_device = provider.get_backend("Aspen-M-1")
oqc_device = provider.get_backend("Lucy")
ここでは、イオントラップ QPU と超伝導 QPU にアクセスします。これらの QPU は 24 時間 365 日いつでも利用できるものではないため、Braket はタスクをキューに入れ、QPU が利用可能になった時に実行します。タスクの Amazon Resource Name (ARN) を使って、測定結果にアクセスすることができます。
注意 : 実機の量子コンピュータを実行すると、AWS アカウントにコストが発生します。学生や研究者の方は、AWS Cloud Credits for Research の応募をご検討ください。
ionq_task = ionq_device.run(circuit, shots=100)
ionq_arn = ionq_task.job_id()
注意 : Amazon Braket では、「ジョブ」という用語はハイブリッドジョブを意味します。ハイブリッドジョブは、変分量子アルゴリズムに最適化された量子古典ワークロードオーケストレーションを提供する Braket サービスの機能です。Qiskit では、「ジョブ」という用語は Amazon Braket の「タスク」と呼ばれるものを意味します。したがって、このチュートリアルで複数のショットを実行している単一の回路は、Braket の言語では「タスク」と見なされ、Qiskit の言語では「ジョブ」と見なされます。
タスクは ARN で取得することができ、そのステータスを確認できます。
ionq_retrieved = ionq_device.retrieve_job(job_id=ionq_arn)
ionq_retrieved.status()
Braket のデバイスページで、QPU が次に利用可能になる時刻を確認し、タスクが処理される時間を見積もることができます。
タスクが終わると、retrieved_task.status()
が “Done:” となります。
タスクが終わった際に Amazon EventBridge 経由で通知を受け取るには、このチュートリアルを参照してください。
これでシミュレーションの時と同様に、測定結果をプロットすることができます。
plot_histogram(retrieved_job.result().get_counts())
実機の量子コンピュータにはノイズがあるため、理想的な 000 や 111 の GHZ 状態以外の状態も見つかります。さらに、ノイズと少ないショット数 (100) という 2 つの原因により、測定の分布は量子力学が予言する 50-50 の分布とは大きく異なります。それでも、メリーランド州にあるイオントラップでエンタングルメントを生成することに成功しました!
次に、同じ回路を Rigetti の Aspen-M-1 超伝導量子コンピュータで実行してみましょう。このデバイスは 80 量子ビットから構成されますが、今回のデモで使うのは 3 量子ビットのみです。
rigetti_task = rigetti_device.run(circuit, shots=100)
# retrieve task by ID
rigetti_retrieved = rigetti_device.retrieve_job(job_id=rigetti_task.job_id())
もう一度、測定結果を待ち、後で戻ってくる必要があるかもしれません。与えられたタスクのステータスは、どの QPU で実行しているかに関わらず、同じ APIrigetti_retrieved.status()
を介して利用できます。
タスクが終わると、先ほどと全く同じ方法で結果をプロットできます。
# plot results
plot_histogram(rigetti_retrieved.result().get_counts())
このプロットを見ると、IonQ とは違った分布になっていることがわかります。これはハードウェアの違いと、それに起因するハードウェア固有のノイズ特性の違いによるものです。
最後に、GHZ 状態を Oxford Quantum Circuits (OQC) の超伝導量子コンピュータ、Lucy で生成してみましょう。Rigetti と OQC を切り替えるには、コードを 1 行だけ書き換えるだけで良いのです。
oqc_task = oqc_device.run(circuit, shots=100)
# retrieve task by ID
oqc_retrieved = oqc_device.retrieve_job(job_id=oqc_task.job_id())
タスクが終わると、先ほどと同じように測定結果のヒストグラムをプロットできます。
plot_histogram(oqc_retrieved.result().get_counts())
このプロットは IonQ、Rigetti のいずれとも異なる分析結果を示していますが、これもハードウェアの違いに起因するものです。Lucy と Aspen-M-1 はどちらも超伝導量子ビットをベースにしていますが、量子ビットの数や全体のトポロジー(量子ビット間の接続性)が異なります。またどちらも、海を隔てた研究所で製造されました。
まとめ
このチュートリアルを終えることで、全てを Qiskit でコーディングし、エンタングルした量子ビットを Amazon Braket を通して 3 つの異なる量子コンピュータで実行できたことになります。さらに qiskit-braket-providerの example notebooks もチェックし、私たちのオープンソースである Amazon Braket GitHub のリポジトリに貢献することも検討してみてください。新機能または新しい例題のアイデアをお持ちの場合、該当するレポジトリ (Amazon Braket Examples か Amazon Braket SDK Python) の GitHub issue から機能リクエストを提出することができます。Qiskit slack workspace で Amazon Braket チームと繋がるには、Jordan Sullivan、Zia Mohammad、Poulami Das、Jon Best を検索してみてください。
翻訳は Solutions Architect の高木裕登が担当しました。