らんだむな記憶

blogというものを体験してみようか!的なー

Colab で cuQuantum (1)

cuQuantum の PyPI 版 - らんだむな記憶 の続きみたいな内容。

どこに書いてあったか忘れたけど、最新の cuQuantum は Volta アーキテクチャ以降の NVIDIA GPUPython 3.8+ を要求していたはず。V100/A100 だけでなく T4 でも動くみたいだけど、Colab のランタイムが 3.7 なのが引っかかってくるはず。

これについては、ColabのランタイムタイプをPython3.8にする手順が完成しました!!|こっころ(engbjapan)|note の方法でランタイムをアップデートしたらいけると思いたい・・・。

試した:

1. 以下で T4 を掴んでいることを確認。(K80 だと多分無理)

! nvidia-smi

2. note の内容でランタイムを Python 3.8 に更新(数分かかる)する。
3. 以下などで必要なパッケージをインストールする。いま調べたら Colab では CUDA 11.2 が使われていた。

! pip3 install -U qiskit pylatexenc  cuquantum cuquantum-python cupy-cuda112

4. ランタイムを再起動してインストールしたパッケージを利用可能にする。
5. 好きなように cuQuantum で遊んだらいい:

例えば

from qiskit import QuantumCircuit, QuantumRegister
from cuquantum import CircuitToEinsum, contract
import numpy as np

qc = QuantumCircuit(1)
qc.x(0)
converter = CircuitToEinsum(qc)
expr, operands = converter.amplitude(bitstring='1')
print(expr)
for op in operands:
    print(op)
    print()
print(contract(expr, *operands))

a,ba,b->
[1.+0.j 0.+0.j]

[[0.+0.j 1.+0.j]
[1.+0.j 0.+0.j]]

[0.+0.j 1.+0.j]

(1+0j)

となるので、もつれ状態の確率振幅が計算できていることがわかる。ということで、T4 以降が掴めれば、ランタイムさえ更新すれば無料で cuQuantum で遊べる環境が得られることが分かった。

200 量子ビットの回路の単一の確率振幅を求める処理も、セルの実行時間としては 2.9 秒程度で実行できた(%%time で計測)。