銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

IBM Q をQ#から動かしてみる

量子コンピューター Advent CalendarとひとりAdvent Calendar 3日目の記事です。

qiita.com

adventar.org

別の記事を予定していたのですが、面白そうなネタを見つけたのでこちらに変えました。Q#で書いた量子アルゴリズムを、Q#側は変更せずにIBM Qで動かそうというものです。

Quantum/Samples/src/Qiskit at release/v0.3.1811.203 · Microsoft/Quantum · GitHub

IBM QはIBMの提供する量子コンピューターの実機で、なんと無料でお試しすることができます。アカウントの作成から実行まではこの記事がわかりやすいと思います。

www.ibm.com

アカウントを作ったらこのページにアクセスしてAPIキーを取得しておきます。

quantumexperience.ng.bluemix.net

こんな画面です。この左上のibmqx4という実機にアクセスするので、ここにmaintenanceなどの表示があるときは使えません。

f:id:tanaka733:20181130142742p:plain

実行する場合ですが、IBM QのためのPython製SDKIBMQuantumExperienceを使うため、Python3がインストールされていないといけません。また、このライブラリの既知の問題からWindowsのPythonでは動かないらしくWindowsの場合はWSL上のPythonを使うことをすすめられています。今回はFedoraを使っています。SDKのインストールはpipを使います。requirements.txtがありますがフォーマットが違うっぽいので、フォーマット変更して使うか、下記コマンドで直接指定してインストールします。

$ pip3 install IBMQuantumExperience --user

取得したAPIキーはDriver.csの該当行に記入しておきます。

Quantum/Driver.cs at release/v0.3.1811.203 · Microsoft/Quantum · GitHub

あとはこのディレクトリに移動して、dotnet runを実行するとIBM Qに問い合わせて実行されます。

f:id:tanaka733:20181130143504p:plain

maintenance状態の場合はstatue code 403が帰ってきます。

f:id:tanaka733:20181130143608p:plain

実行されているQ#のコードはこのプロジェクトではなく、参照しているこちらのQ#コードを実行しています。

Quantum/Measurement.qs at release/v0.3.1811.203 · Microsoft/Quantum · GitHub

簡単に実行できたので、なぜこんなことができるのかを調べてみましょう。

Q#は量子プログラミングの為の言語ですが、実際にはC#のコードから実行します。C#のコードでは、Q#で書かれたアルゴリズムをターゲットとなる量子コンピューターに送信して実行してもらい結果を受け取ります。

https://docs.microsoft.com/en-us/quantum/media/concepts_stack.png?view=qsharp-preview

画像は以下のドキュメントからリンク。 Software stack | Microsoft Docs

まだMicrosoftは実機を一般提供していないため、ローカルコンピューターで実行できるシミュレーターを提供しています。Q#の特徴として、Q#のコードが実行される場所が実機の場合でもシミュレーターの場合でもQ#側はそのままに、Driverと呼ばれるクラスを差し替えれば動くようにすることが挙げられます。

docs.microsoft.com

今回はそのDriverクラスをIBM Q向けに実装しているということになります。IBM QのSDKはQISKitですが、量子アルゴリズムの記述にOpenQASM (量子アセンブリ言語)をつかっています。IBM Qは量子アルゴリズムのためにグラフィカルなエディタを用意していますが、最終的にOpenQASMで記述されているようです。日本語ではこの記事がわかりやすかったです。

qiita.com

OpenQASMそのものについては論文が公開されています。

[1707.03429] Open Quantum Assembly Language

Driver.csを見ると、IbmQx4が実行しているDriverクラスです。このクラスはQiskitDriverを継承していて、実機のパラメーターのみを定義しています。次にQiskitDriverを見ると、抽象クラスOpenQasmDriverを継承していて、ほとんどの処理はOpenQasmDriver側に書かれていることがわかります。

Quantum/IbmQx4.cs at release/v0.3.1811.203 · Microsoft/Quantum · GitHub

Quantum/QiskitDriver.cs at release/v0.3.1811.203 · Microsoft/Quantum · GitHub

Quantum/OpenQasmDriver.cs at release/v0.3.1811.203 · Microsoft/Quantum · GitHub

これを読むと、OpenQASMがテキストベースなので、Q#のoperationをひとつずつOpenQASMのコマンド文字列として出力しています。コマンドを実行する部分は抽象メソッドRunQasmでQiskitDriverが実装しています。これによると入力コマンドをinput.txtに出力して、QiskitInterface.py というPythonのコードをpython3コマンドで実行しています。このPythonコードでIBM Qへの問い合わせを行い、output.txtを読み取っています。

Quantum/QiskitInterface.py at release/v0.3.1811.203 · Microsoft/Quantum · GitHub

Quick and dirty Simulatorbaseとコメントに書いているのと、実装されていない部分もあるのでこのまま全部いけるかはまだわかりませんが、Q#のコンセプトとして、Microsoftの量子コンピューター以外でも動くことができるという一例になっているのではないでしょうか。