こんにちは。2024年の初頭ですが、最近はGPUを使った量子コンピューティングのフレームワークに関する問い合わせが非常に増えています。ここで最新情報を踏まえて、いかにGPUを使った量子コンピューティングをNVIDIAの公式ツールを使って使用するかというのを見てみたいと思います。
まずNVIDIA社の公式量子コンピューティングツールはcuQuantum(クークオンタム)と呼ばれています。こちらはGPUを利用して、量子コンピューティングを高速に行うという量子回路シミュレーションと呼ばれるものです。量子ゲート方式の計算方式を利用しており、これまでのアプリケーションを高速化できます。
公式サイトは下記です。
https://developer.nvidia.com/cuquantum-sdk
また、公式ドキュメントは下記です。
https://docs.nvidia.com/cuda/cuquantum/latest/getting_started.html
githubのリポジトリもあります。
https://github.com/NVIDIA/cuQuantum
さて、NVIDIAのcuQuantumでは2種類の量子コンピューティングツールが入っています。実は用途は似通っていますが、背後の計算原理が異なっています。今回は入門ということで、使いやすいcuStateVec(クーステイトベック)を利用してみます。もう一つのツールはcuTensorNet(クーテンソルネット)と呼ばれていますが、使い方が特殊ですので、今回は前者を紹介します。
企業・大学むけのサポートもキングテックさんやビジュアルテクノロジーさんから提供されていますので必要な場合にはそちらにお問い合わせください。
https://www.v-t.co.jp/quantum_computing/qc-system/
まずツールですが、ローレベル、ハイレベルと二つの利用があります。
ローレベルではC/C++という言語で、
ハイレベルではPythonという言語で利用します。
cuQuantum/cuStateVecは量子コンピューティングで利用される状態ベクトルシミュレータと呼ばれるもので、量子ビットや量子ゲートの計算を行います。量子ビットの値はベクトルの値となっていて、量子ゲートの値は行列の値となっています。この状態ベクトルシミュレータでは、量子ビットの状態をベクトルとして表現し、それに量子ゲートに対応する行列をかけて行って状態ベクトルの計算をします。この状態ベクトルは量子ビットの数が大きくなるととても重たくなりますので、CPUなど手元のPCで普通に計算すると15量子ビットや20量子ビットで限界が来てしまいます。高性能のGPUを利用することでこの量子ビット数を拡張したり、高速化することができます。
下記はスパコンで利用されるintel xeonというCPUとnvidia v100という GPUで同じ量子回路の計算を行ったものです。横軸は量子ビット数で、縦軸が可k流時間を秒数で表しています。CPUからGPUに変えるだけでかなりの高速化が図られています。100倍近く早く計算できることで、これまで時間がかかっていて厳しかった研究が現実的な時間でできるようになりました。
この高速化はGPUを増やすことでもさらに実現でき、スパコンなどを使うことでさらに高速化できます。
参考記事
このcuQuantumの素晴らしいところは、ノートPCなどに搭載されている家庭用GPUでも十分に高速化されることです。ですので、入門からプロ向けまであらゆるフェーズで利用することができます。
インストール
インストールに関しては少し注意が必要です。マルチ GPU・マルチノードと言って複数の GPUや複数台のマシンを繋げて利用する際にはcuQuantum Applianceという専用のものを利用する必要があります。インストールに詳しい人か業者さんにお願いするようにしましょう。
https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuquantum-appliance
家庭用のものや手持ちの GPU単体のマシンにインストールする際には簡単です。
https://docs.nvidia.com/cuda/cuquantum/latest/getting_started.html
通常はPythonを利用してcuQuantumを利用した量子回路のシミュレーションをプログラミングしますので、
conda install -c conda-forge cuquantum
でインストールができます。利用に際しては、IBMのQiskitもしくはGoogleのCirqなどをcuQuantumと組み合わせて利用します。cuQuantum単体でも無理やりプログラミングできますが、ちょっと利用が難しいので、通常はQiskitなどを利用してプログラミングをしてcuQuantumを意識せずにプログラミングします。QiskitやCirqとバージョンを合わせたりとインストールは結構両方を合わせる必要があるため手こずるかもしれません。
インターネット上でたびたびGoogle Colabでのインストールやローカルでのインストールの記事が出ますので、そう言ったものを参考にしてみてください。または、コミュニティ上で聞いてみるのもいいかもしれません。
Qiskitを利用したプログラミング
量子コンピュータのプログラミングに関してはcuQuantumを導入してもその専用のプログラミングはしなくても大丈夫です。IBMのQiskitを利用したプログラミングなどを活用し、計算をGPUの指定にします。
下記のサイトの方法であれば2024年現在最新のcuQuantumでもコードが動きました。Quantum Volumeというベンチマーク用の量子回路を自動で作ってくれます。それをCPUとGPUで動かしてみましょう。
https://medium.com/qiskit/improve-quantum-simulations-with-qiskit-aer-cuquantum-9cd4bf69f042
CPU
GPUを使わないコードは下記です。cuQuantumがなくても動きます。
15量子ビットで深さ10という量子回路を10回計算した結果を返します。
from qiskit import *
from qiskit.circuit.library import *
from qiskit.providers.aer import *
sim = AerSimulator(method='statevector')
qubits = 15
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("{0} qubits Quantum Volume, Simulation Time = {1} sec".format(qubits,result.to_dict()['results'][0]['time_taken']))
counts = result.get_counts()
print(counts)
次にcuQuantumです。
全く同じ計算をcuQuantumで実行します。
from qiskit import *
from qiskit.circuit.library import *
from qiskit.providers.aer import *
sim = AerSimulator(method='statevector', device ='GPU', cuStateVec_enable=True)
qubits = 15
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("{0} qubits Quantum Volume, Simulation Time = {1} sec".format(qubits,result.to_dict()['results'][0]['time_taken']))
counts = result.get_counts()
print(counts)
量子ビット数が少ないとあまり差が出ないかCPUの方が準備時間がいらない分早くなりますが、量子ビットが大きくなると差が出ます。
例えば、25量子ビットにしてみると、CPUだと計算が終わるのに手元で15秒ほどかかりました。GPUにすると、0.5秒で終わりました。かなりの高速化が実現できます。
このように、書き換える部分は、
sim = AerSimulator(method='statevector', device ='GPU', cuStateVec_enable=True)
ここの部分だけでした。ちなみにcuStateVec_enable=Trueを書かないと、cuQuantumではないIBMのGPUシミュレータという別物が動きます。気をつけましょう。
Googleのツールを使いたい場合には、qsimというGoogle製のシミュレータとcuQuantumを連動する必要があってちょっとこれも面倒です。興味がある方はウェブサイトを見てみてください。
ちなみになくさんGPUを繋げるとものすごい早くなります。
こちらはプロ向けのGPUでV100やA100でのベンチマークです。たくさん繋げるほど早くなるので、余裕がある方は試してみましょう。
さらには家庭用のGPUで現在最高速のRTX4090を利用したベンチマークも載せておきます。
流石にプロ向けでたくさん繋げたマシンとはかなりの差が出ますが、頑張っています。30量子ビット未満なら家庭用でもいけるかもしれません。
このようにcuQuantumは家庭用からプロ向けまでさまざまなNVIDIAのGPUを利用して手元の量子コンピュータの研究や教育に利用をすることができ、世界中の研究機関で利用されています。量子コンピュータと併用することでさらに研究の幅が広がります。ぜひGPUを持っている人は使ってみてください。