ローカル環境に量子プログラミングの実行環境を作ろう（Qiskit 1.0, Windows）

近頃、量子コンピュータについて聞くことも増えてきて、詳細までは分からないけれど面白そうと思う人も多いのではないでしょうか。
量子コンピュータに興味を持った方の中には、量子コンピュータの中で実行できる量子プログラミングを実際に書いてみたいと思う方もいると思います。
興味を持った方が簡単にWEBブラウザ上で量子プログラムを実行できる ~~[Quantum Lab](https://quantum.ibm.com/lab "Quantum Lab")~~ を提供していたのですが、2024/5/15に提供を終了してしまうそうです[^1]。IBMが公開している量子プログラミングの[公式ドキュメント](https://docs.quantum.ibm.com/ "IBM Quantum Documentation")では、自分のパソコンの中に実行環境を用意することを推奨しており、その手順を紹介していますが、各人のパソコン環境は違うために環境構築でつまずいてしまう方もいるかもしれません。
この記事では、Windowsユーザーが誰でも量子プログラミングの環境構築を作れるように、様々な実行環境の構築手順をご紹介します。量子プログラミングの実行環境としては、IBMが提供する量子計算フレームワークのQiskitを利用します。

## 目標
公式ドキュメントの[Hello World](https://docs.quantum.ibm.com/start/hello-world)章のStep1が実行できる環境を構築します。

## 環境
- Windows11
- Python 3.12.6
    - pip 24.2
- Rancher Desktop 1.19.0

環境構築作業は「src」という名前でファルダを好きな場所に作り、そのフォルダの中で作業します。

## 環境構築手順
環境構築は公式ドキュメントの[インストールガイド](https://docs.quantum.ibm.com/start/install "Install Qiskit")を元に行います。
環境構築方法としては、1.ローカル環境に全体で利用できる環境を構築する方法、2.Pythonの仮想環境(venv)を利用する方法、3.コンテナ環境を利用する方法の3つをそれぞれ紹介しようと思います。私のおすすめは2番と3番の方法です。（Pythonのライブラリをまとめて管理できるようになるので）

### ローカル環境に全体で利用できる環境を構築する方法
#### Pythonのインストール

stableをダウンロードしておけば問題ないと思います。
> https://www.python.org/downloads/windows/
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775770/5f8ab284-0a37-9ac5-3172-3120f0a4bbb7.png" width="300px">

ダウンロードしたインストーラの指示に沿ってパソコンにPythonをインストールします。ターミナル（CMDまたはPowerShell、Gitbashなど）を起動して以下のコマンドを実行したとき、Pythonのバージョンが出ればインストールは完了です。
```console
python --version
```
#### Pythonライブラリのインストール

次に量子プログラミングに必要なPythonのライブラリを導入します。ターミナルを起動して以下のコマンドを1行ずつ実行します。
```console
python -m pip install qiskit
python -m pip install qiskit-ibm-runtime
python -m pip install jupyter
```
また、[インストールガイド](https://docs.quantum.ibm.com/start/install "Install Qiskit")にはありませんが、[Hello World](https://docs.quantum.ibm.com/start/hello-world)のプログラムを実行するために追加で以下のライブラリも導入します。
```console
python -m pip install matplotlib
python -m pip install pylatexenc
```
:::note info
導入したライブラリの説明を簡単に記載します。
| ライブラリ名 | 説明 |
|:-:|:-:|
| qiskit | 量子プログラミング環境の構築ツール(SDK) |
| qiskit-ibm-runtime | qiskitのプログラムを実行するときに必要なツール |
| jupyter | pythonをブラウザで実行できる開発環境 |
| matplotlib | グラフを作図するためのツール |
| pylatexenc | プログラミングを書くための補助ツール |
:::

#### jupyter notebookの起動

ライブラリのインストールが完了したら、予め作成しておいたsrcフォルダにターミナルを使って移動し、以下のコマンドを実行してjupyter notebookを起動します。
```console
jupyter notebook .
```
jupyter notebookが正常に起動すると下の画面がブラウザで立ち上がると思うので、赤枠で囲んだFileから「New>Notebook」を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775770/bb86c783-18b9-7d85-a197-842aa30a875a.png" width="500px">
notebookが別ウインドウで起動するので、python3となっていることを確認して「Select」を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775770/364f85d9-aec1-0f84-3887-e45f9919fcc0.png" width="500px">

#### 量子プログラムの作成、実行
画面中央のボックスにプログラムを書いて、三角マークを押すと量子プログラムを実行することができます。
以下の画像は[Hello World](https://docs.quantum.ibm.com/start/hello-world)の一番最初に記載されている量子プログラムを実行したものになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775770/e16f9191-6776-3353-cb7f-95fa15c2ca78.png" width="500px">

#### jupyter notebookの終了
`jupyter notebook .`を実行したターミナルで**ctrl+c**を押下することでjupyter notebookの起動を終了することができます。

以上で「ローカル環境に全体で利用できる環境を構築する方法」は終了です。
<details><summary>qiskitのバージョン1.0より前にローカルでqiskitの環境構築をしていた場合</summary>
qiskit v0.44などの昔のバージョンを用いて環境を構築していた場合、単純にqiskitと`qiskit-ibm-runtime`のバージョンを上げただけではjupyter notebookで実行したときに以下のようなエラーが発生します。

```terminal
ImportError: Qiskit is installed in an invalid environment that has both Qiskit >=1.0 and an earlier version. You should create a new virtual environment, and ensure that you do not mix dependencies between Qiskit <1.0 and >=1.0. Any packages that depend on 'qiskit-terra' are not compatible with Qiskit 1.0 and will need to be updated. Qiskit unfortunately cannot enforce this requirement during environment resolution. See https://qisk.it/packaging-1-0 for more detail.
```

これは元々インストールしていた他のqiskitのライブラリが原因になっているので、一度全てのqiskit関係のライブラリをアンインストールした後に、qiskitとqiskit-ibm-runtimeを再インストールしてください。
</details>

### Pythonの仮想環境(venv)を利用する方法
Pythonの仮想環境を作るモジュールであるvenvは、[インストールガイド](https://docs.quantum.ibm.com/start/install "Install Qiskit")でも利用が推奨されています（venvで作成した仮想環境のフォルダ内でライブラリのバージョンを管理できて便利であるため）。ここではvenvを利用した環境構築方法について記載します。

#### Pythonのインストール
「ローカル環境に全体で利用できる環境を構築する方法」と同様にPythonをインストールしてください。

#### 仮想環境フォルダの作成
ターミナルを起動し、以下のコマンドを実行してsrcフォルダを対象に仮想環境を構築します。
```console
python -m venv ${srcフォルダのパス}
```
上記コマンドを実行すると、srcフォルダ配下が以下のようになります。
```
src/
  ├─Include/
  ├─Lib/
  ├─pyvenv.cfg
  └─Scripts/
    ├─activate
    ├─activate.bat
      ︙
```
Scriptsフォルダ配下に作られる、`activate`、`activate.bat`のどちらかのファイルを実行することで仮想環境を起動できます。

:::note warn
使用しているコンソールがCMDとPowerShellで実行できるファイルが若干異なるので注意が必要です。
activateファイルの方であれば差異を気にせず実行できるので以下のコマンドで実行するのをおススメします。
（以下のコマンドは、コンソールでsrcフォルダに移動していることを前提にしています。）
```console
.\Scripts\activate
```

:::

コンソールの先頭に`(src)`のようにフォルダ名がついていれば仮想環境の起動は完了です。

以降は、「ローカル環境に全体で利用できる環境を構築する方法」の「Pythonライブラリのインストール」~「量子プログラムの作成、実行」の手順を、仮想マシンを起動したコンソール上で実施すれば同様にjupyter notebookが立ち上がり、量子プログラミングを実行できるようになります。

#### 仮想環境の停止
仮想マシンを起動したコンソール上で**deactivate**と入力することで仮想環境を停止することができます。（コンソールの先頭から`(src)`がなくなっていれば停止できています。）

#### 仮想環境の削除
もう量子プログラミングできる環境が必要なくなった時は、仮想環境を設定したフォルダ（ここではsrcフォルダ）を削除することで、量子プログラミングの実行環境をきれいに削除することができます。

以上で「Pythonの仮想環境(venv)を利用する方法」は終了です。

### コンテナ環境を利用する方法
「Pythonの仮想環境(venv)を利用する方法」で環境を構築すれば、他のPythonライブラリの影響を受けないので、基本は問題なく実行できると思いますが、仮想環境構築がやや複雑なので失敗する方もいるかもしれません。
そこで別の構築手段としてコンテナを利用する方法も記載します。これはDocker環境を構築できれば、後は簡単に量子プログラミングの環境を構築できるため個人的にはおすすめします。（ローカル環境に何か残って悪さをする可能性も少ないです。）
Docker環境の構築も、[Rancher Desktop](https://rancherdesktop.io/ "Rancher Desktop")をインストールすればよく、インストール自体も簡単です。

#### Rancher Desktopのインストール
Rancher Desktopのインストールについては良いサイトがあるので、こちらの方法を見て導入してみてください。（基本的には公式サイトでインストーラを入手して実行するだけで終わるものではあります。）

https://dev.classmethod.jp/articles/rancherdesktop-install/

インストールできましたら、Rancher Desktopをアプリから起動して、コンソールで`docker --help`コマンドを実行してエラーにならないことを確認しておいてください。

#### コンテナ環境構築準備
コンテナを利用する場合は、ローカル環境にPythonをインストールする必要はありませんが、srcフォルダの中にコンテナの設計書を用意しておく必要があります。
以下の図のように、srcフォルダ内にフォルダとファイルを作成してください。

- 2024/05/13フォルダ構造を修正
以下のフォルダ構造がcompose.ymlで指定しているフォルダ構造と異なっておりエラーが発生しておりました。appフォルダ配下にsrcフォルダを作成してください。

```
src/
  ├─app/
  | ├─src/ (jupyterで作成したソースコードが格納されるフォルダ)
  | ├─Dockerfile
  | └─requirements.txt
  └─compose.yml
```

各ファイルには以下の内容をコピペします。
<details><summary>Dockerfile</summary>

```Dockerfile
FROM python:3

COPY requirements.txt .
RUN pip install --upgrade pip && \
	pip install --no-cache-dir -r ./requirements.txt

ENV APP_HOME /app
COPY ./src ${APP_HOME}
WORKDIR ${APP_HOME}

ENV PORT 8888
EXPOSE ${PORT}
```

</details>

<details><summary>requirements.txt</summary>

```text
qiskit
qiskit-ibm-runtime
jupyter
matplotlib
pylatexenc
```

</details>
<details><summary>compose.yml</summary>

```yml
version: "3.8"

services:
  jupyter:
    container_name: "jupyter-temp"
    build: ./app
    command: jupyter notebook --port=8888 --ip=0.0.0.0 --allow-root --NotebookApp.token=''
    restart: always
    tty: true
    volumes:
      - ./app/src:/app
    ports:
      - "8888:8888"
```

</details>

#### コンテナ環境の起動
ファイルの準備ができたら、コンソールでsrcフォルダに移動してから以下のコマンドを実行します。

```console
docker compose up -d --build
```
色々と表示されますが、最後に以下のような文字が表示され、コンソールに文字が入力できるようになっていればコンテナ環境は起動しています

```console
 ✔ Network qiskit-beginner_default  Created
 ✔ Container jupyter-temp           Started
```
コンテナ環境が起動したら http://localhost:8888 にアクセスすると、jupyter notebookの画面が表示されるので、後は「ローカル環境に全体で利用できる環境を構築する方法」の「量子プログラムの作成、実行」と同様に量子プログラミングを実行できます。

#### コンテナ環境の停止・削除
アプリケーションを停止したいときは、コンソールでsrcフォルダに移動してから以下のコマンドを実行します。
```console
docker compose down
```
このコマンド一つで、コンテナを使って作成した量子プログラミングの実行環境が削除されます。後は必要がなくなったときにsrcフォルダを削除すれば全てきれいに削除できます。

## ローカル環境のクリーンアップ
もし量子プログラミングの実行環境が必要なくなり、PythonとRancher Desktopをきれいに削除したい場合は、以下の記事を参考にしてアプリを削除するときれいに削除することができます。

- Pythonのクリーンアップ

https://aizine.ai/python-uninstall0227/#toc3

- Rancher Desktopのクリーンアップ
    - 以下の記事の「対応方法>WSLを再起動」まで実施すればクリーンアップは完了です。

https://qiita.com/takanori-azegami-jp/items/0ba7d456f40eb963c994

## まとめ
この記事では1.ローカル環境に全体で利用できる環境を構築する方法、2.Pythonの仮想環境(venv)を利用する方法、3.コンテナ環境を利用する方法の三種類の方法で量子プログラミンの実行環境を作成する方法をご紹介させて頂きました。
この記事の内容で何か間違いがあったり、環境構築がうまくできないなどございましたらコメント等でお教えいただけると幸いです。

では、皆様良い量子プログラミング開発をお送りください。

[^1]: https://docs.quantum.ibm.com/announcements/product-updates/2024-03-22-announcement-cloud-simulators-and-lab