実践的な記事を和訳します。
Accelerating Quantum Circuit Simulation with NVIDIA cuStateVec
https://developer.nvidia.com/blog/accelerating-quantum-circuit-simulation-with-nvidia-custatevec/
量子コンピュータは、古典的な難問に対して、より強力な計算とより速い結果を提供することを目指しています。量子回路シミュレーションは、量子計算を理解し、量子アルゴリズムを開発するために必要不可欠です。量子回路は、N個の量子ビットから構成され、量子ゲートと量子ビットの計測によって計算が行われます。
数学的には、N量子ビット系の量子状態は、複素2N次元ベクトルとして記述することができます。古典計算機上で量子回路をシミュレーションする最も直感的な方法は、状態ベクトルシミュレーションと呼ばれ、このベクトルを2N個の複素数値とともに直接メモリに格納します。このベクトルに、回路を構成するゲート列に対応する一連の行列を乗じることで回路が実行されます。
しかし、状態ベクトルの次元は量子ビットの数に応じて指数関数的に増大するため、状態を完全に記述するためのメモリ要件により、この方法は30~50量子ビットの回路に限定されます。テンソルネットワークに基づく代替手法は、より多くの量子ビットをシミュレーションすることができますが、一般に、効果的にシミュレーションできる回路の深さと複雑さに限界があります。
NVIDIA cuQuantum SDKは状態ベクトルとテンソル・ネットワーク・メソッドのためのライブラリーを備えています。この記事では、状態ベクトルシミュレーションとcuStateVecライブラリに焦点を当てます。テンソル・ネットワーク法のライブラリの詳細については、Scaling Quantum Circuit Simulation with NVIDIA cuTensorNetをご覧ください。
cuStateVecライブラリ
cuStateVecライブラリは、状態ベクトルシミュレーションを高速化するためのシングルGPUプリミティブを提供します。量子回路のシミュレーションでは、状態ベクトルの手法が基本であるため、ほとんどの量子コンピューティングフレームワークやライブラリは、独自の状態ベクトルシミュレータを搭載しています。これらの既存のシミュレータと容易に統合できるよう、cuStateVecは一般的なユースケースをカバーするAPIセットを提供します。
・測定
・ゲート・アプリケーション
・期待値
・サンプラー
・状態ベクトルの移動
測定
量子ビットは、|0|と|1|の2つの状態の重ね合わせで存在することができます。測定が行われると、一方の値が確率的に選択され観測され、他方の値が崩れます。cuStateVec測定APIは、量子ビット測定をシミュレートし、Z基底積での測定やバッチ式1量子ビット測定のユースケースをサポートしています。
ゲート応用
量子回路には量子論理ゲートがあり、量子状態を修正して望ましい結果を観測できるように準備します。量子論理ゲートはユニタリー行列として表現されます。cuStateVecゲートアプリケーションAPIは、以下のようないくつかの行列型に対して量子論理ゲートを適用する機能を提供します。
・密行列
・対角行列
・一般化された並べ換え
・パウリ行列の行列指数関数
期待値
量子力学では、演算子と量子状態に対して期待値を計算します。cuStateVecは期待値を計算するためのAPIを備えており、少ないメモリフットプリントで期待値を計算することができます。
サンプラー
状態ベクトルシミュレーションでは,量子状態を数値的に保持します.状態ベクトルの各要素の確率を計算することで、量子状態を崩すことなく、複数の量子ビットの測定を複数回にわたって効率的にシミュレーションすることができます。cuStateVecサンプラーAPIは、GPU上でサンプリングを実行し、メモリフットプリントを小さくすることができます。
状態ベクトルの移動
GPUによるシミュレーションを高速化するため、状態ベクトルをGPU上に配置します。シミュレーション結果をCPUで解析するためには,得られた状態ベクトルをCPUにコピーする必要がありますが,cuStateVecはこれをユーザに代わって行うアクセッサAPIを提供しています。コピー中、状態ベクトル要素の順序は、希望するqubit順序にqubitを並べ替えることができるように再配置されます。
詳細については、cuStateVecのドキュメントを参照してください。
Google Cirq/qsimとNVIDIA cuStateVecの統合
NVIDIA cuStateVecライブラリの統合を発表した最初のプロジェクトは、Googleのqsimで、彼らの量子コンピューティングフレームワークであるCirq用に最適化されたシミュレータでした。Google Quantum AIチームは、CPUおよびCUDAシミュレータ・エンジンを補完するために、新しいcuStateVecベースのGPUシミュレーション・バックエンドを使用してqsimを拡張しました。
CirqおよびqsimとcuStateVecのビルド手順
CirqでcuStateVecを有効にするには、qsimをソースからコンパイルし、qsimcirq Pythonパッケージで提供されるCirq用のバインディングをインストールします。
# Prerequisite:
https://developer.nvidia.com/cuquantum-downloads
Download cuQuantum Beta2 fromExtract cuQuantum Beta2 archive and set the path to CUQUANTUM_ROOT
$ tar -xf cuquantum-linux-x86_64-0.1.0.30-archive.tar.xz
$ export CUQUANTUM_ROOT=`pwd`/cuquantum-linux-x86_64-0.1.0.30-archive
$ ln -sf $CUQUANTUM_ROOT/lib $CUQUANTUM_ROOT/lib64
Clone qsim repository from github and checkout v0.11.1 branch
$ git clone https://github.com/quantumlib/qsim.git
$ git checkout v0.11.1
Build and install qsimcirq with cuStateVec
$ pip install .
Install cirq
$ pip install cirq
この例では、Greenberger-Horne-Zeilinger(GHZ)状態を作り出し、実験結果をサンプリングする回路を実行します。次のPythonスクリプトは、3つの異なるシミュレータを呼び出すことによって、|0...00>と|1...11>の振幅を取得します。
・Cirqビルトインシミュレータ
・qsim CPUベースのシミュレータ
・qsim cuStateVecで高速化されたシミュレータ
Cirq と qsim の CPU ベースシミュレータでは,64 コア EPYC 7742 CPU を 2 ソケット使用しています.cuStateVecアクセラレーションによるシミュレーションでは、A100 GPUを1基使用しています。
import cirq
import qsimcirq
n_qubits = 32
qubits = cirq.LineQubit.range(n_qubits)
circuit = cirq.Circuit()
circuit.append(cirq.H(qubits[0]))
circuit.append(cirq.CNOT(qubits[idx], qubits[idx + 1]) \
for idx in range(n_qubits - 1))
Cirq
s = cirq.sim.Simulator()
result = s.compute_amplitudes(circuit, [0, 2**n_qubits-1])
print(f'cirq.sim : {result}')
qsim(CPU)
options = qsimcirq.QSimOptions(max_fused_gate_size=4, cpu_threads=512)
s = qsimcirq.QSimSimulator(options)
result = s.compute_amplitudes(circuit, [0, 2**n_qubits-1])
print(f'qsim(CPU) : {result}')
qsim(cuStateVec)
options = qsimcirq.QSimOptions(use_gpu=True, max_fused_gate_size=4, gpu_mode=1)
s = qsimcirq.QSimSimulator(options)
result = s.compute_amplitudes(circuit, [0, 2**n_qubits-1])
print(f'cuStateVec: {result}')
以下のコンソール出力は、CPU SIMD命令とOpenMPによる最適化で、qsimのCPU版はCirqのシミュレータより5.1倍高速化されたことを示しています。cuStateVec版を使用することで、さらにシミュレーションが高速化され、Cirqのシミュレータと比較して30.04倍、qsimのCPU版と比較して5.9倍高速になりました。
cirq.sim : [0.70710677+0.j 0.70710677+0.j], 87.51 s
qsim(CPU) : [(0.7071067690849304+0j), (0.7071067690849304+0j)], 17.04 s
cuStateVec: [(0.7071067690849304+0j), (0.7071067690849304+0j)], 2.88 s
性能評価結果
いくつかの一般的な回路のゲートアプリケーションにおける予備的な性能結果を以下の図に示します。シミュレーションは、すべての量子ビット数で高速化されます。しかし、量子ビット数が増加すると、シミュレーションは大幅に高速化され、最大規模の回路ではおよそ10~20倍となります。この性能により、より大規模な量子回路の開発・評価を検討する機会が広がります。
(中略)
マルチGPU状態ベクトルシミュレーション
状態ベクトルシミュレーションは、複数の GPU での実行にも適しています。ほとんどのゲートアプリケーションは完全な並列演算であり、状態ベクトルを分割して複数のGPUに分散させることで高速化されます。
約30量子ビットを超えると、マルチGPUシミュレーションが不可避となります。これは、量子ビットの増加に伴い、状態ベクトルのサイズが指数関数的に増大するため、1つのGPUのメモリに収まりきらなくなるためです。
複数のGPUでシミュレーションを行う場合、各GPUは状態ベクトルの一部に対して並列にゲートを適用することができます。多くの場合、各GPUは状態ベクトルの更新のためのローカルデータのみを必要とし、各GPUは独立してゲートを適用することができます。
しかし、ゲートが模擬量子ビットのどれに作用するかによって、GPUは状態ベクトルの更新を行うために別のGPUに格納されている状態ベクトルの一部を必要とすることがあります。この場合、GPUは状態ベクトルの大きな部分を交換しなければなりません。これらの部分は通常、数百メガバイトから数ギガバイトのサイズになります。したがって、マルチ GPU 状態ベクトルシミュレーションは、GPU インターコネクトの帯域幅の影響を受けやすいといえます.
DGX A100 は、これらの要件に完全に適合しており、8 つの NVIDIA A100 GPU が NVLink を使用して 600GB/s の GPU 間直接帯域幅を提供しています。DGX A100でcuStateVecを用いたCirq/qsimのベンチマークを行うために、30~32量子ビットの一般的な量子コンピューティングアルゴリズムを3つ選びました。
量子フーリエ変換 (QFT)
Shorのアルゴリズム
シカモア・量子超越回路
すべてのベンチマークで、8GPUで実行した場合、シングルGPUで実行した場合と比較して、4.5~7倍のスピードアップという良好なストロングスケーリング挙動を示しました。
64コアCPUを2つ使用した場合のシミュレーション時間と比較すると、DGX-A100は全体で50~90倍という驚異的なスピードアップを実現しています。
まとめ
NVIDIA cuQuantum SDKのcuStateVecライブラリは、GPU上の量子回路の状態ベクトルシミュレータを高速化することを目的としています。GoogleのCirq qsim用シミュレータは、このライブラリを採用した最初のシミュレータの1つで、Cirqユーザはこのライブラリによる既存プログラムのGPUアクセラレーションの恩恵を受けています。IBMのQiskitソフトウェアなど、より多くの量子回路フレームワークへの統合が続く予定です。
また、スケールアップも行っています。cuStateVecベースのマルチGPUシミュレーションの予備的な結果では、主要な量子アルゴリズムで50~90倍のスピードアップが確認されています。cuStateVecが、量子コンピューティングの新境地を切り開くための貴重なツールになることを期待しています。
cuQuantumライブラリの改善に関するご意見、ご感想がありましたら、以下のメールアドレスまでお寄せください。
URLが不正です
までメールをお送りください。