量子プログラミング用SDK PennyLane を推す

# 量子プログラミング用SDK 
量子ゲート型コンピュータでは、量子回路の記述、シミュレーターの実装、数値最適化などを行うための
SDK (Software Development Kit) が多数リリースされています。
言語としてはPythonで書かれたものが多いです。[^1]

SDK毎に特色があります。ここでは”推しSDK"である *PennyLane* を紹介します。
https://pennylane.ai/
PennyLaneは**量子機械学習**に特化した、素晴らしいSDKです。
Pythonで動いています。

PennyLaneを気に入りすぎて、最近はひたすらQiitaで記事を書いています。20件ぐらいになりました。
https://qiita.com/tags/pennylane

# PennyLaneについて
## 開発元
開発しているのはカナダのXanadu Quantum Technologiesです。単にXanaduと呼びます。[^2]
https://www.xanadu.ai/

## インストール
`pip install pennylane` ですぐ使うことが出来ます。

## 特徴

### 実践的なデモが豊富
PennyLaneの公式サイトでは、実践的なデモが豊富に用意されています。
https://pennylane.ai/qml/demos_qml.html
知識がなくとも、簡単に、具体的な量子機械学習（量子ニューラルネットワークや量子サポートベクターマシン）を試すことが出来ます。
ユーザーが投稿したデモもあります。
デモの質、実用性、楽しさは、PennyLaneの魅力を語る上で外せません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/3bc27cba-8814-3a01-de7b-c53c632e1927.png)

### 量子機械学習との親和性
PennyLaneは量子機械学習を前提として設計されています。
具体的には、

- Tensorflow や Pytorch といった古典機械学習SDKとの接続(インターフェース)が用意されている。
これらが使える人であれば、最短ルートで量子機械学習を実装できる。

- ニューラルネットワーク等の複雑なモデルの学習に重要な**誤差逆伝搬法の量子版**が用意されている。
パラメータ数が多くなると、誤差逆伝搬法は計算時間を劇的に減らしてくれる。
[PennyLaneによる量子機械学習 ~勾配計算の匠~](https://qiita.com/notori48/items/14655a7aa9306ec80e26)

IBMのQiskit等でも、もちろん量子機械学習を実装することは出来ます。
ただ、PennyLaneほど簡潔に書くことは難しいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/ee8bf6d5-78e8-8311-1461-0753113fb2ae.png)

### 複数のシミュレーター、実機との互換性
PennyLaneは、複数のシミュレーター・実機をわずかなコードの変更で切り替えられます。
PennyLaneでは、量子計算は 実行するデバイス(dev)と量子回路(circuit)のペアで作られた**Qnode** という単位で管理されます。
そのため、Qnode(dev_ibmq, circuit)　のようにかけば、IBMQの実機[^3]で処理されますし、Qnode(dev_simulator, circuit)　のようにかけば、同じ回路がシミュレーターで処理されます。
別のSDKに翻訳して、そのSDKのシミュレーターを使うことすら出来ます。
このような「デバイス互換性」は、今では様々なSDKでサポートされる機能ではありますが、PennyLaneでは早い段階から実装されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/c2e94f15-9ca6-bcb1-66b7-c05d164b45da.png)

### AWSのクラウド実機との連携
AmazonはAWSを用いたクラウドアクセスで複数の量子コンピュータ実機やシミュレーターにアクセスできる環境を提供しています。
SimulatorとしてはStatevector simulator (SV1)、Tensor simulator(TN1)、Density matrix simulator(DM1)
実機としてはIonQ、Rigetti
が使えます。
全て有料かつ実機としてIBMQが無いのは残念ですが、高性能なシミュレーターマシンと実機を切り替えて使えるのはメリットです。
コーディング環境もクラウド上にあるので、その点も人によっては便利かもしれません。

AWS上にあるマシンを叩く方法として、Amazonは自前の amazon-braket というSDKを提供しています。
amazon-braketも悪くないのですが、個人的には、あまり機能が豊富ではなく、**わざわざAWS上のマシンを使うためだけにamazon-braketで書き直す**というのもしんどいと思います。

しかし、PennyLaneは PennyLane-braket というプラグインを使うことでAWS上のマシンを叩くことが出来ます。例えば、
[Pennylane-braket でqueueに積まれたAWSタスクを読み込む方法](https://qiita.com/notori48/items/e221194303271cb7f84d)
つまり、極端なことを言えば**「PennyLaneが書ければそれでいい」**のです。

### 回路図描画
デバッグの段階だと、量子回路の回路図をグラフィカルに欲しくなります。
グラフィカルな表示ができるSDKはかなり限られています。
PennyLaneは、それ単体ではアスキー表示しか出来ませんが、Qiskitと連携できるので
Qiskitの回路描画機能を借りて使うことが出来ます。やり方は以下を参照。
[PennyLaneのtemplate circuits](https://qiita.com/notori48/items/34f56e57f289a516bb74)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/36882d2a-ea08-ffb1-8f4b-84cf224ade7e.png)

### ローカルシミュレーターが早い
PennyLaneで書いた回路を手元（ローカルシミュレーター）で実行する場合もメリットがあります。
PennyLaneはC++で書かれた独自のバックエンドをdevとして指定できます。[^4]
[PennyLaneをC++バックエンドで高速に動かす](https://qiita.com/notori48/items/e16daf8da8b63a199d96)
また、Qunasys製のC++で書かれた高速なQulacs SDK をdevとして指定することも出来ます。

ただし、プログラム全体が早く終わるかどうかは、オーバーヘッドや計算アルゴリズム等に依存するので、常にPennyLaneが早いとは言えないかもしれません。
なぜ遅いのか？　を調べると、それも勉強になります。

### Q&Aサイトが充実
PennyLaneは、公式サイト上にQ&Aが出来る場があります(Slackもありますが)。
https://discuss.pennylane.ai/
ここでは、質問に対してトップレベルの研究者・開発者が丁寧にレスしてくれます。

## デメリット
PennyLaneの良いところばかり紹介してきました。デメリットも少しあって、

- 記法がやや独特(Qnodeという概念があるため）。
- qiskitほど「何でも出来る」わけではない。qiskitにあって、PLにない機能もある。[^5]
- 日本語化されていない。

このあたりでしょうか。

## まとめ
PennyLaneには、デメリットを補って余りあるメリットがあると思います。
日本でPennyLane user に出くわしたことが無い[^6]のですが、、もっと流行っていいと思います。
素晴らしいSDKです。
`pip install pennylane`　お願いします。
一緒に量子ニューラルネットワークや量子サポートベクターマシンやりましょう！


[^1]: Julia, Q#などもあります。
[^2]: XanaduのSDKとしては、PennyLaneの他にStrawberry fieldsもあります。こちらは光を用いた連続量量子計算と呼ばれるもの用のSDKです。光を用いた連続量量子計算については、ハードウェアの開発もやっており、既に無料でクラウドアクセスまで出来ます。
[^3]: pennyLane-qiskit プラグインを入れるだけでOK。
[^4]: 現在は、pennylane-lightning プラグインはpennylane本体に巻き取られました。
[^5]: 例えば、回路の途中の状態ベクトルのスナップショットを取る機能は、デフォルトではありません。また、barrierゲートもありません。ただ、このあたりは今後実装されていく可能性が高いと思われます。
[^6]: そもそも量子コンピュータのプログラミングをしている人自体が珍しいわけですが・・・