Qiskitを利用した量子プログラムの実行バックエンドについてまとめる(ローカル、Qiskit Runtime、Quantum Platform)

Qiskitを使って量子回路を構築し、その量子回路の実行結果を取得するためには、量子回路を実行するバックエンドを指定する必要があります。
このバックエンドには、Pythonのライブラリ`qiskit-aer`をインポートすれば使えるもの、IBM Cloudの[Qiskit Runtime](https://cloud.ibm.com/docs/quantum-computing?topic=quantum-computing-get-started, "Qiskit Runtime Start Guide")サービスを利用するもの、[IBM Quantum Platform](https://quantum.ibm.com/, "IBM Quantum Platform")サービスを利用するものがあります。
バックエンドにも色々と種類があり使用するときに困りそうだったので、簡単ではありますが調べたことをまとめたいと思います。
（2024/05時点、`qiskit-aer`は0.14.1）

## 実行環境の準備

### qiskit-aer

以下のコマンドを実施して、ライブラリをインストールすれば使用できるようになります。

```console
python -m pip install qiskit-aer
```

ライブラリの詳細な利用方法については今回は省きますが、公式ドキュメントの[チュートリアル](https://qiskit.github.io/qiskit-aer/tutorials/index.html)などが参考になるかと思います。

### Qiskit Runtime

Qiskit RuntimeとIBM Quantum Platformを利用するにはIBMidが必要です。(IBMidの取得方法については @kifumi さんの下記の記事で詳しく説明してくださっています)

https://qiita.com/kifumi/items/7ac33ab7939d2dd796d0

IBMidを作成したら、[IBM Cloud](https://cloud.ibm.com/login)にログインします。
ログインしたら画面上部のリソース検索バーに`qiskit`と入力して`Qiskit Runtime`を探します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775770/7eec5a27-c757-808c-efde-e2f95de17d3d.png" width="300px">

画像赤枠の部分をクリックして`Qiskit Runtime`のカタログを表示したら、料金プランを選択し、利用規約にチェックを入れて作成します。（今回は無料の範囲で使用したいのでLiteプランで作成します。）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775770/75220d5e-e1a0-21f6-3f68-21a6171ebafe.png" width="300px">

リソース作成後、リソースリストで`Qiskit Runtime`のステータスが **アクティブ** になっていればサービスが利用できるようになっています。あとは`QiskitRuntimeService()`に作成したサービスの情報を指定すれば利用できます。
具体的には、Qiskit Runtimeリソース画面のCRNとIBM CloudのAPI Key(作成していなければ[API Key発行画面](https://cloud.ibm.com/iam/apikeys)にアクセスして作成する必要があります)を以下のコードの`qiskit_ibm_runtime`に指定します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775770/7fbd266d-92d4-f6a2-26be-e9cf26b4c635.png" width="300px">

```python
from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService(channel="ibm_cloud", token="<IBM Cloud API key>", instance="<IBM Cloud CRN>")
```

### IBM Quantum Platform

IBMidを作成したら、[IBM Quantum Platform](https://quantum.ibm.com/)にログインすることでサービスを使用可能になります。
具体的な使用方法は、画面に表示されているAPI Tokenを、以下のコードの`qiskit_ibm_runtime`に指定します。

```python
from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService(channel="ibm_quantum", token="<IQP_API_TOKEN>")
```

:::note info
実際にコードを書いて実行してみたい方

この記事ではバックエンドの詳しい実行方法については記載しませんが、以下の記事を参考に、バックエンドの部分だけ変更して実施すると試すことができるかなと思います。

https://docs.quantum.ibm.com/run/primitives-get-started

:::


## 実行環境の差異

各ツールについて、量子プログラムが実行される場所と、その実行されるバックエンドについて表にすると以下のようになります。

| ツール | 実行場所 | 実行環境（太字は実機） |
|:-:|:-:|:-:|
| qiskit-aer | ローカルPC上 | AerSimulator <br> StatevectorSimulator <br> UnitarySimulator |
| Qiskit Runtime | リモート | ibmq_qasm_simulator <br> simulator_stabilizer <br> simulator_mps <br> simulator_extended_stabilizer <br> simulator_statevector |
| IBM Quantum Platform | リモート | ibmq_qasm_simulator <br> simulator_stabilizer <br> simulator_mps <br> simulator_extended_stabilizer <br> simulator_statevector <br> **ibm_brisbane** <br> **ibm_sherbrooke** <br> **ibm_kyoto** <br> **ibm_osaka** | 

`qiskit-aer`はローカルで実行できる分、`Qiskit Runtime`や`IBM Quantum Platform`と異なり**すぐに導入できるうえ、リモートでの処理を待つことがないので気軽に試す**ことができます。ただし量子回路に設定する量子ビットの個数を増やすと処理が目に見えて重くなってしまうので、**少ない量子ビットの回路に限定**されてしまうという問題はあります。

`Qiskit Runtime`のライトプランは、実行環境がシミュレーターに限定されているものの、**最大3時間まで無料で利用できます**。（Standardプランにして利用した分の料金を払えば`IBM Quantum Platform`と同じように実機を使用することもできます。）

`IBM Quantum Platform`は現状使用可能なすべてのシミュレーターと実機を無料で利用できるものの、**1ヶ月で最大10分しか利用できません**。

<details><summary>Qiskit RuntimeとIBM Quantum Platformの利用可能時間について</summary>

`Qiskit Runtime`と`IBM Quantum Platform`は同じシミュレーターが利用できるので、それぞれの利用可能時間は共有されているのか疑問に思い、実行して調べてみましたが、それぞれ別の環境となっているようでした。そのため、シミュレーターを利用したい場合は`Qiskit Runtime`、実機を利用したい場合は`IBM Quantum Platform`を利用するようにすると良いかなと思います。

</details>

## まとめ

量子回路のバックエンドについて、使う判断基準を簡単にまとめると以下のようになるかなと思います。

- `qiskit-aer`
    - 量子回路の実行を試してみたい場合
    - 基本はこれで十分
- `Qiskit Runtime`
    - qiskit-aerより多くの量子ビットを使用するシミュレーションを実行したい場合
- `IBM Quantum Platform`
    - 無料で量子回路の実機実行をしたい場合

もっと詳しい情報や、記述内容の間違い、実行環境の構築が上手くできないなどございましたら、コメント等で指摘いただけるとありがたいです。