@yuichirominato 2017.12.04更新 120views

Rigetti ComputingをSDK、ライブラリ、言語、チップ、会社概要まで横断的に見返す

Rigetti 量子ゲート 量子コンピュータ

はじめに

量子コンピュータは米国を中心として開発が進んでおり、各社異なる戦略や戦術で開発が進んでいます。1つのスタートアップを取り上げることで、アプリケーションからハードウェアまでをどのように包括的に取り込もうとしているのかが見えて来ますので、実際に量子プログラミングを行う際に参考になります。

Rigetti Computing(リゲッティ・コンピューティング)とは?

創業年:2013年
創業者:Chad Rigetti
所在地:カリフォルニア、バークレー、775 Heinz Avenue, Berkeley, CA 94710
ウェブサイト:https://www.rigetti.com/

カリフォルニアを拠点とする量子コンピュータベンチャー企業です。IBM出身の技術者のChad Rigettiさんによって設立され、現在ハードウェアとソフトウェアの開発を行っています。特にシリコンバレーを中心とした投資家により、高い技術力と優れたソフトウェアをいかして一気通貫の開発を行っています。


引用元:https://www.rigetti.com/about

サービス

・Forest
彼らの量子コンピュータやQVM(Quantum Virtual Machine)と呼ばれるシミュレータに接続するためには必ずクラウド経由での接続が必要となります。それらのクラウド経由での計算リソースへの接続を管理するのがForestと呼ばれるサービスです。
https://www.rigetti.com/forest

・Grove
PyQuilやForestと呼ばれるサービスを利用してクラウド経由での計算リソースへ接続したあとには、彼らのSDKツールをつかって開発を行うことができますが、それらのツールと連動した形でさまざまな参考アプリケーションがあります。それらを格納したのがGroveです。Groveから各種のゲートモデルのアプリケーションを呼び出して実行できます。
https://github.com/rigetticomputing/grove

・PyQuil
PyQuilはQuantum Instruction LanguageからとったRigetti社の開発した量子コンピュータ向けの機械言語のようなもので、量子計算と古典計算を混ぜて記述をすることで、ハイブリッド型の利用を想定されたものとなっています。
https://pyquil.readthedocs.io/en/latest/

量子ゲート方式について

2018年4月時点、日本国内の量子コンピュータ関連のニュースは多方式が混在して報道されています。Rigettiでは、下記の量子ゲートモデル方式を採用しています。各々の量子ビットと呼ばれるものが初期化され、量子ゲートと呼ばれる論理ゲートに近いものをあてがってプログラミングをおこない、測定を通して計算結果を取得します。横軸は時間で、量子ビットに時間単位でゲート操作を行います。

量子ゲート方式、超電導量子ビットのハードウェアについて

量子ゲート方式の開発方法は多種ありますが、Rigetti社では超電導量子ビットと呼ばれる人工原子を作成して計算をする方法が採用されています。これまでの半導体やメモリは電子や電荷の性質を利用して計算素子の0,1を表現していましたが、超電導量子ビットでは極低温で冷やしながらジョセフソンジャンクションなどの素子を利用してエネルギー準位の違いで0,1を表現しています。単位はより小さいスピンやクーパー対などを利用して物質波の重ね合わせの原理を利用して計算を行います。

現在超電導量子ビットの中で量子ゲートモデルで主流となっているものは「トランズモン」と呼ばれる方式で、クーパー対の単位が小さい場合にはエネルギー準位が近接して励起状態への遷移が起こりやすくなるので、安定化するために多少サイズを大きくして安定化させています。

それらを実現するために極低温を安定的に実現する必要がありますが、それを実現するのが、希釈冷凍機と呼ばれるマシンで、真空で極低温に近づけるための操作を行います。現在この希釈冷凍機を提供するのがフィンランドのblueforsと呼ばれるベンチャー企業で、Rigetti社を始めとして大手の量子コンピュータ開発メーカーも利用しています。


引用元:http://www.bluefors.com/

かれらのオフィスの写真をみると、大型の冷凍機が所狭しと並んでいて、開発が進んでいるのがわかる。構成品は通常のもので、2.5mほどのアルミの架台に上部から円筒形の筒がぶら下がっており、中は真空かつ上から順番に熱交換で温度が下がっている。腰くらいの台にモニタがついたのが温度制御用のマシンで、サーバーラックに計測機器などが入っている。あとは真空を作り出すコンプレッサーやコールドトラップ用の設備が並ぶ。

引用元:https://www.rigetti.com/about

19量子ビットQPUチップ

現在彼らはベンチャー企業ながら19量子ビットの超電導量子ビットのチップの開発に成功しています。この実機を使って機械学習を行なった論文が話題となっています。

A quantum processing unit (QPU) is a physical device that contains a number of interconnected qubits. This page presents technical details and average performance of Acorn, the 19Q Rigetti QPU device that is made available for quantum computation through the cloud. This device has been designed, fabricated and packaged at Rigetti Computing.

問題の入力から量子ゲートチップまでの実行

Rigetti社からは具体的な実行のプロセスを見つけることができなかったので、一般的な量子ゲートモデルの実行のプロセスを紹介しておく。

通常は問題の入力を行い、それらを「アルゴリズムレイヤー」と呼ばれる量子ゲートを並べたレイヤーに問題入力する。将来的な量子ゲートモデルで誤り訂正が実装されたマシンはこの誤り訂正方式に変換され、論理量子ビットから物理量子ビットに変換される。時系列の物理量子ビットの実行形式が定まると、それらはインターフェイスのPCに入り、実際にFPGAでパルスの形に変換され、マイクロ波制御によって量子ゲートチップ上の量子ビットに短時間で連続的に処理される。最終的に読み出し回路を通じて、結果を取り出され、この測定を通じて、内部では確率的に行われていた波動の計算が確定し計算結果として取り出される。

量子シミュレーション(Google社の例)

Rigetti社からは見つからなかったので、こちらはGoogle社の論文からの抜粋ですが、実際に設計した量子ゲートと対応する形でパルス波形がチップの複数の量子ビットに作用して、シミュレーション計算が進む様子が表現されています。


引用元:https://arxiv.org/ftp/arxiv/papers/1511/1511.03316.pdf

Fab-1(量子ゲート半導体工場)

Rigetti社の特徴は量子ゲートモデルの超電導量子ビットのチップを社内にファブリケーションを持って作成をしているということです。3次元実装を実現する試作工場でチップを作成しているとのことで、メディアにもその様子が公開されています。

The company operates a rapid prototyping fabrication (“fab”) lab called Fab-1, designed to quickly create integrated circuits. Lab engineers design and generate experimental designs for 3D-integrated quantum circuits for qubit-based quantum hardware.


引用元:https://spectrum.ieee.org/tech-talk/computing/software/rigetti-launches-fullstack-quantum-computing-service-and-quantum-ic-fab

Forest+PyQuilの概要

Rigetti社はForestというAPIとpyquilというSDKを公開しています。計算リソースにアクセスするためにAPIの申請も必要です。
https://www.rigetti.com/forest

Rigetti社のAPIにアクセスし、計算を行うためのオープンソースのpythonライブラリがpyQuilです。Githubを通じて公開されており、ドキュメントも揃っています。

Githubのリポジトリ:https://github.com/rigetticomputing/pyQuil
ドキュメント:http://pyquil.readthedocs.io/en/latest/

実際に少し使用方法を確認してみます。詳しい内容は下記の記事から。
https://qiita.com/YuichiroMinato/items/9de89b4467e3341c9dbd

まずはPyQuilのインストール方法です。

pythonとpipがインストールされている状態で下記でインストールできます。

pip install pyquil

続いてAPIの申請方法です

Rigetti社の計算リソースを利用するためにはAPI経由で彼らのサーバーに接続をして計算をする必要があります。これらは実機、シミュレーター共に必要です。(2018年4月段階)

RigettiのクラウドのAPIに接続するためにはAPIキーの申請が必要です。
https://www.rigetti.com/forest
のページの下部にAPI申請用のEmailフォームがあるので、そこで申請をするとメールでAPIキーが送られてきます。

セットアップ方法

基本的なセットアップやインストール方法は
http://pyquil.readthedocs.io/en/latest/getting_started.html#installation
のページにあります。

最初は設定ファイルをつくります。コンソールから、

pyquil-config-setup

と打ち込み、指示に従って送られてきたメール通りの情報を格納します。終了すると自動的に設定ファイルが作成されます。または、自分で設定ファイルを作成して打ち込むこともできます。そちらの方法は下記から参照してください。
https://qiita.com/YuichiroMinato/items/1ec13b7fc7bf574c9267

バージョン

アップデートが早いので、バージョンがあってないと頻繁にエラーが出ますので、適宜アップデートをかけてください。

pip install -U pyquil

Forest+PyQuilを使った具体的なプログラミング方法

SDKを使ってpythonでプログラミングしてみます。
準備をして、サーバーに接続し、具体的にゲート回路を記述し、結果を取り出します。
下記の例題を見てみます。example.py

from pyquil.quil import Program
import pyquil.api as api
from pyquil.gates import *

qvm = api.QVMConnection()

p = Program()
p.inst(H(0), CNOT(0, 1))

wavefunction = qvm.wavefunction(p)

print(wavefunction)

少し分解してみてみます。
まずは各種モジュールの読み込みexample.py

from pyquil.quil import Program
import pyquil.api as api
from pyquil.gates import *

つぎにapiへの接続準備example.py

qvm = api.QVMConnection()

そしてProgramオブジェクトをつくって、example.py

p = Program()

早速書いていきます。ここではアダマールゲートとCNOTゲートを適用しています。
使用する量子ビット数などはこの場合指定しなくても勝手にやってくれるようです。example.py

p.inst(H(0), CNOT(0, 1))

今使用しているのはバーチャルマシンなので波動関数を取得することができます。
せっかくなので表示してみます。example.py

wavefunction = qvm.wavefunction(p)
print(wavefunction)

そうすると無事結果を下記の通り得ることができました。

(0.7071067812+0j)|00> + (0.7071067812+0j)|11>

量子ゲートモデル用のライブラリGrove

彼らは様々な量子ゲートモデルのアルゴリズムのライブラリを公開しています。

・Grove
https://github.com/rigetticomputing/grove

2018年4月現在主要なアルゴリズムは下記の通りです。
・The Variational-Quantum-Eigensolver (VQE)
・The Quantum Approximate Optimization Algorithm (QAOA)
・The Quantum Fourier Transform (QFT)
・Phase Estimation Algorithm

ドキュメント類も充実していますので、
http://grove-docs.readthedocs.io/en/latest/
から手に入れることができます。

インストールも簡単で、下記の通りです。こちらで使い始めることができます。

pip install quantum-grove

主要アルゴリズムを見てみる。

・The Variational-Quantum-Eigensolver (VQE)
・The Quantum Approximate Optimization Algorithm (QAOA)
・The Quantum Fourier Transform (QFT)
・Phase Estimation Algorithm

現在公開されている主なアルゴリズムは上記です。それぞれの概要を少し見ていきたいと思います。これらのアルゴリズムはRigetti社特有のものというわけではないので、簡単に触れて終わりにしたいと思います。

The Variational-Quantum-Eigensolver (VQE)

量子化学計算で分子の軌道エネルギーの基底状態の計算を行う際に、それまで想定されていたPEAアルゴリズムの代替として提案された、古典計算機と量子計算機のハイブリッド方式を利用したアルゴリズムです。ハミルトニアンと呼ばれるエネルギー式を古典的な数式変形を数度行い、最終的に量子計算できるようにJW変換など行なった上で、ansatzと呼ばれる試行波動関数を入力してゲートモデルでエネルギー固有値を求めます。その求まったエネルギー固有値を再度古典計算機に入力し、変分法でより精度を高めるために更新されたansatzを準備し、再度量子計算機で計算を行います。それらを繰り返すことで最終的に正しいエネルギー基底に近づけていきます。これらの古典計算機と量子計算機を交互に利用したハイブリッドアルゴリズムはVQEとかQVEと呼ばれています。

http://grove-docs.readthedocs.io/en/latest/vqe.html

The Quantum Approximate Optimization Algorithm (QAOA)

D-waveのような量子アニーリング方式は組み合わせ最適化問題と呼ばれる組合せ爆発を起こす問題を効率的に高速に解くということを目的としています。それらの組み合わせ最適化問題を量子ゲートモデルで解こうというのがQAOAです。QAOAでは、「コストハミルトニアン」と呼ばれる解きたいハミルトニアンと「ドライバーハミルトニアン」と呼ばれる探索用のハミルトニアンを組み合わせてゲートモデルで組み合わせ最適化問題を解きます。

http://grove-docs.readthedocs.io/en/latest/qaoa.html

The Quantum Fourier Transform (QFT)

http://grove-docs.readthedocs.io/en/latest/qft.html下記の英語説明にある通り、離散フーリエ変換の量子バージョンで、波動関数の振幅を使って実装します。shorのアルゴリウズムなどにも利用されています。

The quantum Fourier transform is the quantum implementation of the discrete Fourier transform over the amplitudes of a wavefunction.

Phase Estimation Algorithm

http://grove-docs.readthedocs.io/en/latest/phaseestimation.html

位相推定アルゴリズムと呼ばれ、固有ベクトルの固有値を求めるためのサブルーチンです。

PyQuilについて

http://pyquil.readthedocs.io/en/latest/

pyQuil is an open source Python library developed at Rigetti Computing that constructs programs for quantum computers. Quil is an opinionated quantum instruction language — its basic belief is that in the near term quantum computers will operate as coprocessors, working in concert with traditional CPUs. This means that Quil is designed to execute on a Quantum Abstract Machine that has a shared classical/quantum architecture at its core.

PyQuilは当面量子コンピュータは古典コンピュータと併用して使用されるということを事前に想定して構築されている実装言語ということです。

Quil programs can be executed on a cloud-based Quantum Virtual Machine (QVM). This is a classical simulation of a quantum processor that can simulate various qubit operations. The default access key allows you to run simulations of up to 26 qubits. These simulations can be run through either synchronous API calls, or through an asynchronous job queue for larger programs.

基本的なプログラムはQVMと呼ばれる量子バーチャルマシンで実行され、古典計算機で最大26量子ビットが処理できます。APIは即時応答で処理したり、大きな問題ではジョブとして処理を投げることもできます。

In addition to the QVM, we offer the ability to run programs on our superconducting quantum processors, or Quantum Processing Units (QPUs), at our lab in Berkeley, California. To request upgraded access to our 19Q QPU, please fill out the request form with a brief summary of what you hope to use it for. For more information on QPUs, check out The Rigetti QPU.

QVMの他に実機の量子コンピュータチップであるQPUに接続することもでき、事前申請で割り当てがあるとのことです。

実際にQuilは古典計算と量子計算の処理を同時に記述することができ、コンパイル時に自動的に量子計算と古典計算の分岐を処理するように設計されています。他の量子計算機ではこのような構成を取っているところはあまりないので、記述したプログラミングを他社に移植する際には注意が必要です。

まとめ

ベンチャー企業にも関わらず多岐にわたるソフトウェアやハードウェアの品揃えと、豊富なライブラリ、
そしてクラウド経由での提供を考慮したビジネス性などの方向性がはっきりしています。自社ファブを構えるという覚悟もあり、注目の企業です。PyQuilベースで作成されたアプリケーションは古典計算を混ぜると他のハードウェアでは使用できないことがあるので、プラットフォーム選択にも多少の考慮は必要です。

SDK

Rigetti社はForestというSDKを公開しています。SDKを通じて計算リソースにアクセスするためにはAPIの申請も必要です。forestのURLは2017年12月段階でこちらです。
https://www.rigetti.com/forest

pyQuil

Rigetti社のAPIにアクセスし、計算を行うためのオープンソースのpythonライブラリがpyQuilです。Githubを通じて公開されており、ドキュメントも揃っています。

Githubのリポジトリ:
https://github.com/rigetticomputing/pyQuil

ドキュメント:
http://pyquil.readthedocs.io/en/latest/

pyQuilのインストール方法

pythonとpipがインストールされている状態で下記でインストールできます。

pip install pyquil

APIの申請方法

RigettiのクラウドのAPIに接続するためにはAPIキーの申請が必要です。
https://www.rigetti.com/forest
のページの下部にAPI申請用のEmailフォームがあるので、そこで申請をするとメールでAPIキーが送られてきます。

APIキー

APIの申請をするととてもシンプルです。APIキーとユーザーIDだけが送られてきます(2017年12月現在)ので、そのAPIキーと先ほどインストールしたpyquilを使用して量子ゲートモデルの回路をプログラミングできます。

[Rigetti Forest] 
key: ************************************ 
user_id: ********************************

セットアップ方法

基本的なセットアップやインストール方法は
http://pyquil.readthedocs.io/en/latest/getting_started.html#installation
のページにあります。

最初は設定ファイルをつくります。コンソールから、

pyquil-config-setup

と打ち込み、指示に従って送られてきたメール通りの情報を格納します。終了すると自動的に設定ファイルが作成されます。

バージョン

バージョンが古いとエラーが発生することがあるので、以前にpyquilを入れていた人でも、念のためアップデートすることをお勧めします。

pip install -U pyquil

準備完了

ここまできたら準備完了です。かなり最先端のマシンにしてはSDKなどしっかり作られているので容易に準備を完了することができました。あとはpythonからSDKを呼び出してコードを書くと無事動かすことができます。

モジュールの読み込み

example.pyのように適当なファイルを用意してみます。
インストールガイドによると最初にいくつかのモジュールを呼び出すよう書いています。
基本的には、基本のquil、クラウドサーバーに接続するためのapi、ゲート操作を読み込むためのgates、そして数値計算ライブラリのnumpyです。

from pyquil.quil import Program
import pyquil.api as api
from pyquil.gates import *
import numpy as np

QVM(Quantum Virtual Machine)への接続方法

現状(2017年12月現在)では本物の量子コンピュータである実機への接続はQPUConnectionを通じて提供されますが、私たちはバーチャルマシンを使うしかなさそうです。QVMというシミュレータに接続することができます。QVMへの接続は下記の通りです。

qvm = api.QVMConnection()

簡単なファイルでお試し

実際にテストコードを書いて実行してみました。
まずは各種モジュールの読み込みexample.py

from pyquil.quil import Program
import pyquil.api as api
from pyquil.gates import *

つぎにapiへの接続準備example.py

qvm = api.QVMConnection()

そしてProgramオブジェクトをつくって、example.py

p = Program()

早速書いていきます。ここではアダマールゲートとCNOTゲートを適用しています。
使用する量子ビット数などはこの場合指定しなくても勝手にやってくれるようです。example.py

p.inst(H(0), CNOT(0, 1))

今使用しているのはバーチャルマシンなので波動関数を取得することができます。
せっかくなので表示してみます。example.py

wavefunction = qvm.wavefunction(p)
print(wavefunction)

まとめて書くとこんな感じです。example.py

from pyquil.quil import Program
import pyquil.api as api
from pyquil.gates import *
qvm = api.QVMConnection()
p = Program()
p.inst(H(0), CNOT(0, 1))
wavefunction = qvm.wavefunction(p)
print(wavefunction)

そうすると無事結果を下記の通り得ることができました。

(0.7071067812+0j)|00> + (0.7071067812+0j)|11>

値の測定

Forestの書式はたくさんあります。いくつか例があるようですが、簡単な例をやってみます。
http://pyquil.readthedocs.io/en/latest/getting_started.html#some-program-construction-featuresexample2.py

from pyquil.quil import Program
import pyquil.api as api
from pyquil.gates import *

qvm = api.QVMConnection()
p = Program()
p.inst(X(0),Y(1)).measure(0,0).measure(1,1)
print(p)

一部抜粋すると、example2.py

p.inst(X(0),Y(1)).measure(0,0).measure(1,1)

ここでは、0番目の量子ビットにXゲート、1番目の量子ビットにYゲートを適用しています。
最後に測定をして0番目の量子ビットをレジスタ0に、1番目の量子ビットをレジスタ1に格納しています。
その際初期値はそれぞれ0と1です。

実行した結果は下記のとおりでした。適用したゲートの種類と測定結果が結果として出力されます。result

X 0
Y 1
MEASURE 0 [0]
MEASURE 1 [1]

QFT(量子フーリエ変換)もできる。

量子コンピュータ Advent Calendar 2017 4日目に量子フーリエ変換を3量子ビットで行う例がありましたが、
https://qiita.com/piyo7/items/d6f95876c7ec0188f991

それをRigettiでやってみる例もありました。
Quantum Fourier Transform (QFT)
http://pyquil.readthedocs.io/en/latest/getting_started.html#quantum-fourier-transform-qft

QFTをRigettiで試してみる

せっかくなので、Rigettiのページを翻訳しながらやり方を見ていきたいと思います。

Quantum Fourier Transform (QFT)
http://pyquil.readthedocs.io/en/latest/getting_started.html#quantum-fourier-transform-qft

まず、
[0, 1, 0, 0, 0, 0, 0, 0]
の量子ビットを量子フーリエ変換します。

手順は、
1、qft3という3量子ビットの量子フーリエ変換の量子プログラムを書く。
2、状態を準備する
3、シミュレータで量子プログラミングを実行する。

前のチュートリアル手順を踏まず、いきなり量子フーリエ変換にチャレンジする方は、
色々読み込みと事前準備があります。
下記が事前準備です

from pyquil.quil import Program
import pyquil.api as api
from pyquil.gates import *
qvm = api.QVMConnection()

では、まず早速チュートリアル通りにqft3を用意します。

from math import pi

def qft3(q0, q1, q2):
    p = Program()
    p.inst( H(q2),
            CPHASE(pi/2.0, q1, q2),
            H(q1),
            CPHASE(pi/4.0, q0, q2),
            CPHASE(pi/2.0, q0, q1),
            H(q0),
            SWAP(q0, q2) )
    return p

quilの書き方によると、上記の関数はQFTを直接計算するものではなくて、
QFTを計算する回路を書き出すためのもののようです。
確かに最後の return p を確認するために、

print(qft3(0, 1, 2))

を実行してみると、

H 2
CPHASE(1.5707963267948966) 1 2
H 1
CPHASE(0.7853981633974483) 0 2
CPHASE(1.5707963267948966) 0 1
H 0
SWAP 0 2

のように特定の書式でQFTの処理の内容が出てきました。

次に量子ビットの準備をします。
これは簡単のようです。
0の量子ビットにXゲートをかけます。

state_prep = Program().inst(X(0))

そして実行をしますが、波動関数を得られればいいらしいですが、
ここでダミー量子ビットを用意しないと3量子ビットの波動関数がえられませんので、
ダミー量子ビットを用意します。

add_dummy_qubits = Program().inst(I(1), I(2))
wavefunction = qvm.wavefunction(state_prep + add_dummy_qubits)
print(wavefunction)

実行すると下記が得られます。

(1+0j)|001>

では、実行ですが、Rigetti Forestでは量子プログラミングを足し算で足し合わせて実行ができるとのことで、
初期状態を用意して、

wavefunction = qvm.wavefunction(state_prep + qft3(0, 1, 2))
print(wavefunction.amplitudes)

amplitudeは振幅なので、波動関数の各状態の振幅が得られます。結果は、

array([  3.53553391e-01+0.j        ,   2.50000000e-01+0.25j      ,
         2.16489014e-17+0.35355339j,  -2.50000000e-01+0.25j      ,
        -3.53553391e-01+0.j        ,  -2.50000000e-01-0.25j      ,
        -2.16489014e-17-0.35355339j,   2.50000000e-01-0.25j      ])

となりました。
これを確認するために、Numpyの高速フーリエ変換を使い、

from numpy.fft import ifft
ifft([0,1,0,0,0,0,0,0], norm="ortho")

を実行し、

array([ 0.35355339+0.j        ,  0.25000000+0.25j      ,
        0.00000000+0.35355339j, -0.25000000+0.25j      ,
       -0.35355339+0.j        , -0.25000000-0.25j      ,
        0.00000000-0.35355339j,  0.25000000-0.25j      ])

となりました。これで波動関数が得られたので量子フーリエ変換ができました。

今後の展開

sdk自体はpythonで書かれていますので、自分でアプリケーションを作成したり、他のアプリケーションとの統合が容易です。shorのアルゴリズムやgroverのアルゴリズムなど、QFTと呼ばれる量子フーリエ変換の回路も色々なところで公開されているので、それらを組み合わせることで色々なアプリケーションを実装することができます。

Recommended


CONTACT

info@mdrft.com

ブログトップへ Wikiへ移動

量子コンピュータ一般

量子ゲートアルゴリズム

量子アニーリング一般

量子アニーリングアルゴリズム

BlueqatSDKの使い方