ラズパイで量子コンピューターを動かそう！ (Qiskit導入編)

##はじめに

Raspberry Pi （通称「ラズパイ」）のセットアップ方法、そしてラズパイに量子コンピューター開発フレームワークの[Qiskit](https://qiskit.org/documentation/locale/ja_JP/getting_started.html)とJupyter Notebookをインストールするところまでをご紹介します。

ここでは、ラズパイ初心者を前提にRaspberry Pi OSインストール済みのSDカードを使った簡単な方法をご紹介します。

##準備するもの
まずは準備してほしいもの一覧です。手持ちの機器やデバイスがあれば、ぜひそれをご活用ください。

- 無線または有線LAN環境
- Raspberry Pi 4 Model B 2GB 
- microSDカード (16GB以上) ※RaspberryPi OSインストール済みのもの
- Raspberry Pi用のACアダプター(USB-C）
- USBキーボード
- USBマウス 
- 外付けモニターまたはテレビ
- Micro HDMI to HDMI変換アダプターなど、接続するモニターやテレビの入力に応じた変換アダプタ

ラズパイを初めて購入する方は、時短の観点でラズパイOSインストール済み[SDカード付のセット](https://eleshop.jp/shop/g/gJCK312/)のものがオススメです。USBキーボードとマウスも手持ちのものでＯＫです。筆者は[こちらのセット](https://www.amazon.co.jp/gp/product/B073D8VHSN/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1)を使っています。

##ラズパイに入出力デバイスを接続しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1418132/f22083ec-cc23-1108-3cdb-5be892d8a747.png)

<b>接続手順</b>は以下のとおりです。（注：電源は必ず最後です！）
1. MicroSDカードをラズパイのSDスロットに差し込みます
2. USBキーボードとマウスを差し込みます
3. Micro HDMIケーブルを(必要に応じて変換アダプタを介して）モニターまたはテレビに接続します
4. ルーターまたはモデムから有線でラズパイをネットワークに接続できる方はイーサネットケーブルを接続します。（ラズパイを無線LANにつなぐ手順は後ほどセットアップで出てきますので、無線LAN親機のSSIDと暗号化キーの確認をしておいてください。）
5. 最後にAC電源をコンセントに差し込みます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1418132/625c00a5-5cf3-0103-69a9-7f6ce852b0bc.png)
筆者の手持ちのラズパイ写真
（SENSE-HATというLED表示ディスプレイもつないでいる状態）

##セットアップ
入出力機器の接続が完了してから、電源を入れてしばらく待つと、ラズパイをつなげている外付けモニターに起動画面があらわれて、Raspberry Pi Desktop画面(Raspberry Pi 4であれば、寺院の壁紙がデフォルト設定されている以下の画面）がたちあがります。

Raspberry Pi Desktop画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1418132/83efe5bb-dd5f-4e18-c108-3d997b74bf00.png)
(1) セットアップ画面内のNextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1418132/c555b6d9-e416-0501-779a-2636efcdedfd.png)
(2) 国と言語の設定を行います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1418132/739adeb1-c1c2-9a9d-3ac7-c6495fb2012b.png)
(3) パスワードの変更をします
piユーザーのデフォルトパスワードは'raspberry'ですが、違うパスワードに変更しておきます。
(変更後のパスワードは必ず控えておきましょう）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1418132/74202c18-3380-359f-89a5-35ba1112fb2b.png)
(4) Wi-Fiパスワードの入力 
注：あらかじめ調べておいた無線LAN親機のSSIDと暗号化キーを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1418132/27a6975a-c1bb-3338-6a98-fb23b10a2759.png)


(5) ソフトウェアのアップデート
インストール済みのRaspberry Pi Oを最新にアップデートします。
注：OSのアップデートには30分ほど（ご利用のネットワーク環境によって異なります）かかりますので、ここで一息入れるか、横でインストールを走らせておきながら別の作業を行うことをオススメします☕️
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1418132/a9cb8744-94ab-c8cc-24ab-c08ccac6db81.png)

アップデートの確認です。Nextをクリックします。

(6) セットアップ完了です。Restartをクリックして再起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1418132/5be845c3-a10b-9041-70cd-4b06ebc4b6f0.png)

##ラズパイのSwap Sizeを増加しておく
ラズパイは、デフォルトのままだと仮想メモリであるSwapファイルが100MBにしか設定されていないため、Swapファイルの容量を増加しておきましょう。
ラズパイのTerminalを起ち上げます。

因みに、ラズパイのメモリ容量とSwapsizeは<code>free –m</code>で確認することができます。
<code><b>pi$</b> free –m

以下のコマンドを順番に実行してSwapsizeを1Gに増やしておきましょう。
<code><b>pi$</b> sudo sed -i 's/CONF_SWAPSIZE=100/CONF_SWAPSIZE=1024/' /etc/dphys-swapfile
<code><b>pi$</b> sudo /etc/init.d/dphys-swapfile stop
<code><b>pi$</b> sudo /etc/init.d/dphys-swapfile start

Swapsizeが無事増えたことをもう一度<code>free –m</code>で確認しておきましょう。
<code><b>pi$</b> free –m

これで一安心です。


##Pythonのバーチャル環境の準備
Pythonバーチャル環境の準備を行います。
<code><b>pi$</b> ( echo; echo '##### added for rasqberry #####';
<b>></b><code>echo 'export PATH=/home/pi/.local/bin:$PATH';
<b>></b><code>echo "alias rasqberry='source ~/rasqberry/bin/activate'" ) >> ~/.bashrc
<b>></b><code>. ~/.bashrc


pipのインストールとアップグレードを行います
<code><b>pi$</b> pip3 install --upgrade pip   

仮想想環境作成用モジュールのインストールを行います
<code><b>pi$</b> python3 -m pip install virtualenv　

rasqberryという名前のvirtual env(仮想環境)を作成します
<code><b>pi$</b> python3 -m virtualenv rasqberry   

作成した仮想環境に切り替えます
<code><b>pi$</b> rasqberry　

コマンドプロンプトが<code><b>(rasqberry) pi$</b></code>に切り替わったことを確認しましょう
今後のQiskitのインストールもこのrasqberryという仮想環境で行います。

##Qiskitをインストールするための準備

Qiskitをインストールする前に、Qiskitに依存する言語やライブラリを先にインストールしておきましょう。この対応をしておかないと、Qiskitのインストール中にたくさんのエラーが起きてしまいますので、ちょっと手間ですが、やっておいて損はありません。

注：一度Terminalを閉じてしまった方は、必ず前ステップで作成した仮想環境に切り替えて(i.e. <code><b>pi$</b> rasqberry</code> ) から以下実行ください。今後、デフォルトの環境とQiskitインストール用に作成したraspberry仮想環境は<code><b>pi$</b></code>と<code><b>(rasqberry) pi$</b></code>で区別します。

それでは依存する言語やライブラリを順番にインストールしていきます。

(1) <b>rust</b>言語の環境をインストールします
<code><b>(rasqberry) pi$</b> cd ~/rasqberry
<code><b>(rasqberry) pi$</b> pip install setuptools-rust
<code><b>(rasqberry) pi$</b> curl -o get_rustup.sh -s https://sh.rustup.rs
<code><b>(rasqberry) pi$</b> sh ./get_rustup.sh -y

(2) <b>retworkx</b>をインストールします
<code><b>(rasqberry) pi$</b> source ~/.cargo/env
<code><b>(rasqberry) pi$</b> pip install --prefer-binary retworkx

(3) Qiskit Aquaが必要とする<b>libcint</b>をインストールします
<code><b>(rasqberry) pi$</b> sudo apt -y install cmake libatlas-base-dev git
<code><b>(rasqberry) pi$</b>　cd ~/rasqberry
<code><b>(rasqberry) pi$</b>　git clone　https://github.com/sunqm/libcint.git
<code><b>(rasqberry) pi$</b>　mkdir -p libcint/build && cd libcint/build
<code><b>(rasqberry) pi$</b>　cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/ ..
<code><b>(rasqberry) pi$</b>　sudo make install

(4) そして最後に<b>pyscf</b> と <b>cython</b>もインストールしておきます
<code><b>(rasqberry) pi$</b> pip install --prefer-binary pyscf cython

##Qiskitをインストールする
さあ、お待たせしました。いよいよラズパイにQiskitをインストールします！

注：2021年4月29日現在,Qiskit最新リリースは0.25.3となります。Qiskit0.25.0より、Qiskit AquaがDeprecatedとなり、新しいパッケージ:<code>qiskit-optimization</code>, <code>qiskit-nature</code>, <code>qiskit-machine-learning</code>, <code>qiskit-finance</code>にそれぞれ分割されました。モジュールを指定して個別にインストールすることも可能ですが(i.e. <code>pip install qiskit-nature</code>)、ここでは完パケでインストールしていきますので<code>qiskit</code>と指定します。


<code><b>(rasqberry) pi$</b> pip install --prefer-binary qiskit


注：Qiskitの完パケインストールは時間が30分ほど（お使いの環境によってはもっと長く）かかりますので、ここで一息☕️入れるか、横でインストールを走らせておきながら別の作業を行うことをオススメします。


インストールが完了したら、最新のQiskitとパッケージが導入されたことを確認して終了です。
<code><b>(rasqberry) pi$</b> pip list | grep qiskit </code>

qiskit 0.25.3
qiskit-aer 0.8.2
qiskit-aqua 0.9.1
qiskit-ibmq-provider 0.12.3
qiskit-ignis 0.6.0
qiskit-terra 0.17.1
(2021/04/29時点のVersion一覧)

無事にインストールできましたでしょうか？

##ラズパイにJupyter Notebookをインストールする
最後に、PythonなどをWebブラウザ上で記述・実行できる統合開発環境「Jupyter Notebook」をインストールしておきます。

<code><b>(rasqberry) pi$</b> pip install jupyter

インストールが完了したら以下のコマンドでjupyter notebooを立ち上げてみましょう。

<code><b>(rasqberry) pi$</b> jupyter notebook

Jupyter Notebookが無事たちあがったことを確認しましょう。

##リモートからラズパイを操作する
外付けモニター、USBキーボードとマウスをつながずに、手持ちのPCからラズパイを操作できるようになると便利です。ここでは二つの方法をご紹介します。
## (1) SSHで接続する方法
bootフォルダの直下にsshファイルを作成します。

<code><b>(rasqberry) pi$</b> sudo touch /boot/ssh

ファイルを作成したらRaspberry Piを再起動します。（再起動後にアラートが表示された場合、そのまま 「OK」をクリックして進みます。）

Raspberry Pi Desktop画面の上部メニュー > 「設定」 > 「Raspberry Piの設定」を開き、「インターフェース」タブでSSHとVNCの療法を「有効」に設定しておきます。（VNC接続の方法ものちほどご紹介するため、予めVNCも「有効」にしています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1418132/608b1b95-8109-29ed-8a1a-9757d905647a.png)

こちらでRaspberry Pi側からのSSH接続の準備は完了です。

つづいて、別のPCからSSHコマンドでRaspberry Piに接続してみましょう。

Raspberry Pi のIPアドレスを調べるには同一ネットワークに接続しているPCのターミナルから以下のコマンドを実行します。
<code>$</b> arp -a

表示されるリストのなかにRaspberry PiのIPアドレスに注目しましょう。以下のような行がみつかるはずです。

raspberrypi (<b>xxx.xxx.xxx.xxx</b>) at dc:a6:32:9f:37:ca on en0 ifscope [ethernet]

ターミナルから以下のようにSSHコマンドを入力します。

<code>$</b> ssh 【Raspberry Piのユーザー名】@【Raspberry PiのIPアドレス】

仮にユーザー名が「pi」で、IPアドレスが「192.168.1.11」の場合、以下のようになります。

<code>$</b> ssh pi@192.168.1.11</code>

実行後パスワードを求められますので、piユーザーのパスワードを入力してください。無事にログインできればSSH接続の設定は完了です。

##(2) VNCで接続する方法
PCに[VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/)をダウンロードしてインストールします。
VNC Viewerを起動後、Raspberry PiのIPアドレスを指定して、ユーザー名とパスワードを入力してリモート接続を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1418132/11d66798-4ad4-1e0f-4521-bc5a6e56a480.png)
上記のSSH接続、またはVNC接続により、同一ネットワークにつながったPCからであれば、どこからでもRaspberry Piに接続できるようになりました。


##おわりに

まずは2021年4月30日時点の最新のQiskitをラズパイに導入するための手順をご紹介しました。内容について、わかりにくい点や誤りがありましたら、お知らせください。ありがとうございました。

※次回はQiskitをインストールしたラズパイに、ラズパイの拡張基板である[SENSE-HAT](https://www.raspberrypi.org/products/sense-hat/)という8×8フルカラーLEDディスプレイをつないで量子状態を表現するところまでを試してみた様子をご紹介したいと思います。

##参考文献
[RasQberry: Quantum Computing is the Coolest Project for Raspberry Pi](https://medium.com/qiskit/rasqberry-quantum-computing-is-the-coolest-project-for-raspberry-pi-3f64bec5a133)