Amazon Braket を利用して手軽に量子コンピュータを動かす
はじめに
こんにちは、yoshi です。ナビタイムジャパンでサーバサイド開発を担当しています。
2020年8月、AWS 上から量子コンピュータの実機へ処理を投げることのできる Amazon Braket がローンチされました。今回は Amazon Braket の使い方を簡単に紹介しながら、最適化問題を量子アニーリングで解き、古典コンピュータで実装されている複数のソルバーと結果を比較してみます。
Amazon Braketとは
Amazon Braket は 2020年8月に一般公開されており、Rigetti、IonQ、D-Wave が提供している3種類の量子コンピューターを AWS 上から手軽に利用することができるサービスです。
AWS Management Console 上の Jupyter Notebook で利用でき、実行結果は S3 へ保存されます。Amazon Braket SDK がプリインストールされた EC2 インスタンスで Jupyter Notebook を使い、 D-Wave Ocean SDK を直接利用することも可能となっています。
今回は Amazon Braket を利用して、D-Wave へアクセスし、量子アニーリングで最適化問題を解こうと思います。
Amazon Braket以外でD-Waveへアクセスする方法
今回は Amazon Braket を利用して量子アニーリングを行いますが、その他の方法として、D-Waveが提供している D-Wave Leap というクラウドサービスを利用する方法もあります。
D-Wave Leap は 2018/10/04 に D-Wave 社から発表され、発表当初はアメリカとカナダ限定のサービスでしたが、現在は日本でも利用可能となりました。
D-Wave Ocean SDK を使い、D-Wave Leap で取得できるトークンによって量子アニーリングマシンへアクセスできるようになります。もちろん最新の5000量子ビットの量子アニーリングマシンにもアクセスできます。
使い方はこちらで紹介していますのでもう少し詳しく知りたい方はご参照ください。
Amazon Braketの構成
全体の構成としては、下の図の通り、 User が Amazon Braket notebook 上でAmazon Braket SDK、もしくは D-Wave Ocean SDK などを利用して量子コンピュータへアクセスします。
量子コンピュータから得られた結果は S3 に保存され、その結果を Amazon Braket notebook で取得する流れとなります。
How Amazon Braket works - Amazon Braket より引用
Amazon Braket の使い方
Amazon Braket の使い方を簡単に説明します。より詳しく知りたい方はこちらの公式ドキュメントを参照ください。
1. 以下のいずれかのリージョンに移動 (Amazon Braket Regions and endpoints - Amazon Braket)
・米国東部 (バージニア北部)
・米国西部 (北カリフォルニア)
・米国西部 (オレゴン)
2. Amazon Braket の初期設定をする (Enable Amazon Braket - Amazon Braket)
・(事前に AmazonBraketFullAccess の IAM ポリシーを設定しておく)
・AWSコンソールで Amazon Braket のページを開く
・画面の指示に従って、保存先の S3 等を指定して Braket を有効化
Amazon Braket のページは上の画像のように D-Wave、IonQ、rigetti のそれぞれの量子コンピュータのステータスが表示されています。
3. Notebook の作成 (Create an Amazon Braket notebook instance - Amazon Braket)
・Amazon Braket Console から Notebooks → Create notebook
・必要項目を埋めて作成
・Amazon Braket SDK がインストールされた notebook インスタンスが作成される
4. 作成された nobebook を開く
・例として、Braket examples → quantum_annealing → Dwave_MaximumCut.ipynb を開いて S3 バケットを指定して実行すると結果がバケット内に結果が格納される
このように、AWS の画面上でコード実装から量子コンピュータでの実行までを通して行うことができます。
AWS からの実行する際の実際のコードは以下のようになっています(QUBO の算出部分は割愛しています)。S3 バケット名の指定や、AWS Braket からのアクセスであることの設定をすることで AWS 上から実行が可能になります。
_bucket = "S3バケット名"
my_prefix = "結果出力フォルダ名"
s3_folder = (my_bucket, my_prefix)
sampler = BraketDWaveSampler(s3_folder,'arn:aws:braket:::device/qpu/d-wave/Advantage_system1')
sampler = EmbeddingComposite(sampler)
response = sampler.sample_qubo(Q, chain_strength=chainstrength, num_reads=numruns)
今回解く最適化問題
今回解く問題としては集合被覆問題を選びました。選んだ理由としては以下の点が挙げられます:
◆比較的シンプルな問題で実装・チューニングが簡単
・制約項の種類が多い問題などではパラメータの組み合わせが指数的に増大するのでチューニングが手間になる
◆配送計画問題への応用が見込まれる
・被覆すべき集合全体を訪問すべき地点、個々のサブ集合を一台の自動車が訪問する地点集合とみなすことで訪問地点の振り分けタスクが実施できそう
◆実行不可能解しか得られなくても受け入れられる
・実行可能解が狭い問題(例:巡回経路)は量子アニーリングの最適化と相性が悪いことが知られている
・先述の配送計画問題の例であれば、量子マシンでの最適化後に古典計算機上で解を微調整する、といった使い方も可能なため
小規模版を解く
集合被覆問題を最適化問題として定式化すると QUBO 行列が全結合となりますが、現状の D-Wave ではハードウェア上の制約で 60 変数程度の全結合までしか扱えないため、まずは以下のような問題を解いてみました。
◆頂点は全部で 60 点
・各頂点にはランダムに x,y 座標を付与
◆サイズ10の部分集合を 60 個用意
・各地点から直線距離が近い順に 10 地点を選び作成
定式化した数式は以下のようになります。
結果 (小規模版)
上の図が Amazon Braket 経由で実際に D-Wave から返ってきた結果になります。unvisited はどのサブ集合にも属することができなかった頂点です。
ある程度きれいに地点が分割されているのですが、5~6地点どのグループにも属さない頂点が存在する結果となりました。
古典ソルバーとの比較
得られた D-Wave での結果を古典ソルバーと比較してみます。今回は、焼きなまし法と東芝SBMを比較に使いました。
焼きなまし法は量子コンピュータ用ライブラリである blueqat の シミュレーテッドアニーリングを利用します。東芝SBMは GPU を利用した非量子的なソルバーです。詳しくは利用方法についてまとめたこちらを参照ください。
上の表が結果になります。エネルギーが小さいほど解として良いということを表しています。焼きなまし法(シミュレーテッドアニーリング)、東芝SBMが D-Wave のエネルギーより小さいものが得られる結果となりました…
エネルギーが小さいと言っても、どのソルバーについても5~6地点どのグループにも属さない頂点が存在する結果自体に変わりはありませんでした。
※量子アニーリングの実行時間についてですが、QPU 自体の処理時間(QPU_ACCESS_TIME:実際に問題を解いている時間) は 30msec 程度ですが、D-Wave Leap API の処理時間はトータルでこの程度の時間になりました。おそらく実機が少ないため、リクエストの処理に時間がかかっているものと考えられます。
大規模版を解く
◆頂点は全部で 1000 点
・各頂点にはランダムに x,y 座標を付与
◆サイズ100の部分集合を 1000 個用意
・各地点から直線距離が近い順に 100 地点を選び作成
サイズが大きくなっても定式化した式は変わらないため、そのまま解いてみます。
結果 (大規模版)
D-Wave では大規模版をそのまま解くことは現時点で難しいため、唯一実行できた焼きなまし法(シミュレーテッドアニーリング)の結果のみになります。
小規模版(60地点)と傾向は変わらず、どのサブ集合にも属さない頂点が存在する結果となっています。これはサブ集合の選び方である程度改善する余地はあるかなと思っています。
まとめ
Amazon Braket を利用して、D-Wave の量子アニーリングを使って最適化問題を解いてみました。クラウド上で手軽に量子アニーリングへアクセスできるため、量子コンピューティングの敷居は以前よりも低くなったと感じました。今後も、新しいパラダイムである量子コンピュータを学んでいこうと思います。
ちなみに気になる利用料金ですが、Amazon Braket 上から D-Wave を実行した際の価格情報はこちらにありました。shots=1000 だと 0.3$ + $0.00019*1000 = $0.49 となります。つまり、1回の実行で $0.49 かかる計算です。