common.title
Cloud support

Nobisuke

Dekisugi

RAG


autoQAOA
RAG for dev
Fortune telling app

Overview
Service overview
Terms of service

Privacy policy

Contact
Research

Sign in
Sign up
common.title

Google Colab や blueqat cloud (GPU) で Qiskit の GPU シミュレーションをしてみる

derwind

2023/04/16 06:06

1

目標

以前に Qiskit Aer で cuQuantum (cuStateVec) を利用する方法 という記事を書きましたが、大きな問題点として「ターゲット環境でビルドするため物凄い手間」というものがあります。今回はターゲットでビルドするのではなく、予めビルドした .whl をターゲットでインストールする方法をとります。この方法は、事前にターゲット環境に合わせた開発環境を構築する必要があります。今回は、

    • Google Colab
    • blueqat cloud (GPU)

上で利用可能な「cuQuantum の対応 Qiskit」をビルドしてみたいと思います。なお、「cuQuantum の対応 blueqat SDK」に関しては Google Colabなど、GPU環境でblueqat + cuQuantum の記事が既にあるのでこちらをご参照ください。

背景

量子ギグワーカーのためのblueqat club(ブルーキャットクラブ)開始のお知らせ が最近発表されました。これに関連して人気書籍「IBM Quantumで学ぶ量子コンピュータ 」を使った講師の育成などが進んでいます。近いところでは

が予定されています。講師のかたの中には理論派のかたもいれば実践派のかたもおられると思います。実践派のかただと、GPU シミュレーションを活用したい人もいると思いますので、参考になればと思いこの記事をまとめようと思いました。

環境の確認

ターゲット環境の確認をします。

Google Colab と blueqat cloud (GPU) では Python のバージョンと CUDA のバージョンが異なりますので、対応するバージョンで Qiskit Aer をビルドしないと正常な動作を望めません。

では確認方法ですが、これは簡単です。Jupyter を起動して以下のようなセルを実行します。

%%bash cat /etc/os-release | grep VERSION python --version nvcc -V
VERSION="20.04.5 LTS (Focal Fossa)"
VERSION_ID="20.04"
VERSION_CODENAME=focal
Python 3.9.16
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0

のような表示が得られたと思います。これは Google Colab の例ですが、今日の時点では Ubuntu 20.04 上で Python 3.9 と CUDA 11.8 が使われていることが分かります。

以下では Google Colab をターゲットに Qiskit Aer をビルドします。その前にやることを列挙します:

    • 適当な CUDA 環境の docker イメージを Docker Hub からとってくる
    • ターゲット環境の GPU の compute compatibility に気をつけて Qiskit Aer with cuQuantum をビルド
    • コンテナから .whl を抜き出してどこか (GitHub とか Google Drive とか) に置く
    • ターゲット環境で wget や curl やその他で .whl をダウンロード
    • pip install *.whl

上記で「分かった!」とか「既に知っている!」人は以下を読む必要はまったくありません。

Google Colab 向けに Python 3.9 + CUDA 11.8 用 Qiskit Aer 0.11.2 + cuQuantum 22.11.0 をビルドする

Qiskit Aer も cuQuantum もこのバージョンより新しいものが既にリリースされていますが、色々なトラブルがありましたので、それぞれ使いやすそうな 1 つ前のバージョンを使います。

結論だけ書くと cuda118/Dockerfile の内容でいけると思います。私が先日試して一応動作していたので、これでいけるはず・・・です。

念の為、Dockerfile を再掲すると以下のようになっています:

FROM nvidia/cuda:11.8.0-devel-ubuntu20.04 ENV DEBIAN_FRONTEND noninteractive ENV CUQUANTUM_ROOT /cuquantum-linux-x86_64-22.11.0.13-archive ENV LD_LIBRARY_PATH $CUQUANTUM_ROOT/lib:$LD_LIBRARY_PATH RUN apt-get update && \ apt-get install -y git wget && \ wget https://developer.download.nvidia.com/compute/cuquantum/redist/cuquantum/linux-x86_64/cuquantum-linux-x86_64-22.11.0.13-archive.tar.xz && \ tar Jxfv cuquantum-linux-x86_64-22.11.0.13-archive.tar.xz RUN apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev && \ wget https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tgz && \ tar -xzvf Python-3.9.16.tgz && \ cd Python-3.9.16 && ./configure --enable-optimizations && \ make -j 8 && make altinstall && \ ln -s /usr/local/bin/python3.9 /usr/bin/python && \ rm -f /usr/bin/python3 && ln -s /usr/local/bin/python3.9 /usr/bin/python3 && \ rm -f /usr/bin/pip && wget https://bootstrap.pypa.io/get-pip.py && python get-pip.py && \ ln -s /usr/local/bin/pip /usr/bin/pip RUN apt install -y cmake && pip install pybind11 pluginbase patch-ng node-semver==0.6.1 bottle PyJWT fasteners distro colorama conan==1.59.0 && \ apt-get install -y libopenblas-dev && \ pip install "qiskit[all]==0.41.1" && \ pip uninstall -y qiskit-aer && \ cd / && git clone -b 0.11.2 https://github.com/Qiskit/qiskit-aer/ && \ cd qiskit-aer && \ python setup.py bdist_wheel -- -DAER_THRUST_BACKEND=CUDA -DAER_CUDA_ARCH="7.0; 7.5; 8.0" -DCUSTATEVEC_ROOT=$CUQUANTUM_ROOT -DCUSTATEVEC_STATIC=true CMD ["bash"]

ターゲット環境に合わせて、Ubuntu 20.04 + CUDA 11.8 の Docker イメージから始めます。

    • cuQuantum SDK のインストール

cuQuantum SDK Archive から 22.11.0 をダウンロードします。apt install 方式だとどうしても最新の 23.03 のインストールになってしまいましたので、tarball を展開してパスを通す方法をとります。1 つ目の RUN で tarball を wget して tar Jxfv で展開しています。また、展開先を決めているので CUQUANTUM_ROOTLD_LIBRARY_PATH を事前に ENV してパスを通しています。

    • Python 3.9 環境のインストール

2 つ目の RUN が該当します。開発に必要そうなライブラリ類をざっくりとインストールして、ざっくりと Python 3.9 環境を作っています。pyenv などもありますし、好きな方法で良いと思います。

    • Qiskit Aer のビルド

0.11.2/CONTRIBUTING.md を参考に cuQuantum 対応 Qiskit Aer をビルドします。注意として、ターゲット環境には cuQuantum をインストールしないので、Qiskit Aer 側に必要なライブラリを静的リンクします。3 つ目の RUN が該当します。

今回 Qiskit Aer 0.11.2 を使うのですが、Qiskit はメタパッケージの仕組みを導入しており、最上位のメタパッケージに Qiskit Terra, Qiskit Aer, ... がぶら下がる形になっています。このため、Qiskit Aer 0.11.2 を使う最後のメタパッケージ Qiskit 0.41.1 をインストールします。そして、Qiskit Aer だけ削除して、今からビルドするもので差し替える戦略にします。

0.11.2/CONTRIBUTING.md の通りにビルドに必要なライブラリをインストールします。conan は新しすぎるとビルドシステムと噛み合わなくなるので conan==1.59.0 とします。この時 node-semver のバージョンとの噛み合わせが生じますので、node-semver==0.6.1 とします。

後は qiskit-aer を clone して手順通りにビルドするだけです。コンパイルオプションとして -DAER_CUDA_ARCH="7.0; 7.5; 8.0" を渡していますが、お気持ちとしては NVIDIA V100, T4, A100 の対応をさせたいというものです。興味があれば Your GPU Compute Capability を眺めてください。今回は Compute Capability 9.0 の H100 を除外しています。手元に環境があるかたは試してみても良いと思います。

以上でビルドは完了です。

.whl の取り出し

Docker コンテナを起動して docker cp で .whl を抜き取ります。私の場合、イメージを qiskit-aer-gpu:0.11.2s-cu118 という名前で保存していますので、以下のようにしてコンテナを起動します:

    • docker run -it --rm qiskit-aer-gpu:0.11.2s-cu118

この状態で、コンテナの ID を確認して、別のターミナルから

    • docker cp CONTAINER_ID:/qiskit-aer/dist/qiskit_aer-0.11.2-cp39-cp39-linux_x86_64.whl .

で .whl を抜き取れると思います。

.whl のインストール

仮に、.whl を Google Drive に置いたとします。共有設定をして、リンクを取得しファイル ID を特定します。その上で、Colab を起動して以下のような内容を実行します。

%%bash pip install googledrivedownloader pip install "qiskit[all]==0.41.1" pip uninstall -y qiskit-aer
from google_drive_downloader import GoogleDriveDownloader as gdd gdd.download_file_from_google_drive(file_id=FILE_ID, dest_path='./qiskit_aer-0.11.2-cp39-cp39-linux_x86_64.whl', unzip=False)
! pip install qiskit_aer-0.11.2-cp39-cp39-linux_x86_64.whl

念の為ランタイムを再起動するとより確実かもしれませんが、上記のようにして cuQuantum 対応の Qiskit が Google Colab にインストールできました。 動作検証をしたい場合には以下のような内容が利用できるかもしれません。サンプルコードは WSL2 で cuQuantum (インストール編) からお借りしました。この場を借りて感謝申し上げます。

動作検証

from qiskit import * from qiskit.circuit.library import * from qiskit_aer import * def experiment(qubits=29, device='CPU', cuStateVec_enable=False): sim = AerSimulator(method='statevector', device=device, cuStateVec_enable=cuStateVec_enable) qubits = qubits depth = 10 shots = 10 circuit = QuantumVolume(qubits, depth, seed=0) circuit.measure_all() circuit = transpile(circuit, sim) result = sim.run(circuit, shots=shots, seed_simulator=12345).result() print(result) metadata = result.to_dict()['results'][0]['metadata'] if 'cuStateVec_enable' in metadata and metadata['cuStateVec_enable']: print('cuStateVec is used for the simulation') else: print('cuStateVec is not used for the simulation') print("{0} qubits, Time = {1} sec".format(qubits,result.to_dict()['results'][0]['time_taken'])) counts = result.get_counts() print(counts)
%%time experiment(29, device='GPU')
%%time experiment(29, device='GPU', cuStateVec_enable=True)

blueqat cloud (GPU) 向けに Python 3.10 + CUDA 11.6.2 用 Qiskit Aer 0.11.2 + cuQuantum 22.11.0 をビルドする

次は blueqat cloud (GPU) 向けのビルドをご案内します。こちらを後回しにしたのは、少し手順が増えるからです。

まず環境の確認をします。nvcc が見つからなかったので、ライブラリを眺めて間接的に特定します。

%%bash cat /etc/os-release | grep VERSION python --version ls /usr/local/cuda/lib64/libcudart*
VERSION="20.04.5 LTS (Focal Fossa)"
VERSION_ID="20.04"
VERSION_CODENAME=focal
Python 3.10.8
/usr/local/cuda/lib64/libcudart.so.11.0
/usr/local/cuda/lib64/libcudart.so.11.6.55

ということで、恐らく CUDA 11.6.2 です。(実際そのように伺っています)

結論から書きますと、cuda116/Dockerfile の内容でいけると思います。

手順に僅かな違いがあって、gcc/g++ 3.8 を使うために、RUN に追加の設定が入っています

RUN apt instal ... gcc-8 g++-8 ... rm /usr/bin/gcc && rm /usr/bin/g++ && \ ln -s /usr/bin/gcc-8 /usr/bin/gcc && ln -s /usr/bin/g++-8 /usr/bin/g++ && \

このようなことをしている理由は Error compiling with CUDA の対策のためです。詳細はリンク先を見ていただけると良いのですが、gcc/g++ 3.9 だと nvccg++ が見ているヘッダが異なるかもしれないようで、3.8 にダウングレードしたらビルドが通ったのでそのようにしました。

残りの工程は Python 3.10 をインストールする以外は同じです。

動作検証については前掲の回路が使えると思います。29 量子ビット GPU シミュレーションを試したところ、blueqat cloud (GPU) 環境では 3 秒もかかりませんでした。速いですね。

まとめ

.whl だけ抜き取って適当な場所に置いておけば、僅かな手順で Google Colab でも blueqat cloud (GPU) でも Qiskit の GPU シミュレーションができることが分かりました。

なお、今回は、cuQuantum の中でも cuStateVec の部分だけを使うビルドをしているのですが、Qiskit 12.0 では cuTensorNet にも対応しているようですので、そちらも使い方が分かれば記事にまとめたいなと思います。

© 2024, blueqat Inc. All rights reserved