今日はQiskit + cuQuantumでいろんなベンチマークをとってみたいと思います。cuQuantumは無料なので、もっといろんな記事が出てもいいはずですが、量子コンピュータ業界の裾野の狭さのせいであんまり出てません。
まず、インストールですが、cuQuantumはconda環境を構築してた上でcuQuantumとcuQuantum Pythonを入れます。Qiskitはpipでqiskit-aerとqiskit-aer-gpuを入れます。
from qiskit import *
from qiskit.circuit.library import *
from qiskit_aer import *
import time
import numpy as np
import matplotlib.pyplot as plt
def exp_qv(qubits=15, depth=10, device_num=0):
if device_num ==0:
sim = AerSimulator(method='statevector', device='CPU')
elif device_num == 1:
sim = AerSimulator(method='statevector', device='GPU')
else:
sim = AerSimulator(method='statevector', device='GPU', cuStateVec_enable=True)
circuit = QuantumVolume(qubits, depth, seed=0)
circuit.measure_all()
circuit = transpile(circuit, sim)
start = time.time()
result = sim.run(circuit, shots=1, seed_simulator=12345).result()
time_val = time.time() - start
return time_val
まず最初はCPUとGPUとcuQuantumのcuStateVecを比較します。同じ問題を異なる構成で実行します。
1、CPUを利用します。Intel Core i9 13900KFでそこそこ高性能です。
2、GPUを利用しますが、IBMのプログラムを利用した高速化です。
3、GPUを利用しますが、NVIDIAのプログラムであるcuStateVecを利用した高速化です。
1だけがCPUで、2と3は両方GPUですが3番が今回注目のNVIDIA cuQuantumです。使ってるマシンもプログラムも同じですが、SDKが違うだけです。
まずは、
#量子ビット数
x = np.arange(10, 30)
#QVのdepth
dp = 10
#結果格納用のlist
arr = [[],[],[]]
#label用
label = ['Qiskit + CPU', 'Qiskit + GPU', 'Qiskit + cuStateVec GPU']
#デバイスごとに
for j in range(3):
for i in x:
r = exp_qv(i,dp,j)
arr[j].append(r)
print(i, r)
# 折れ線グラフを出力
plt.xlabel('qubits')
plt.ylabel('sec')
for i in range(3):
plt.plot(x, arr[i], label=label[i])
plt.title('Benchmark QV depth=' + str(dp))
plt.legend()
plt.show()
すでに、29量子ビットでもCPUだとかなり厳しい状況です。次はQV depth = 30にします。
全く同じようなグラフになりました。こうなるとQVでCPUを利用するのはかなりきつそうです。次からはGPU同士の比較にしてみます。
QV depth =100にしてみます。
基本的に1.4倍くらいの速度が常に出ています。QV depth=500でも同じ感じでした。
全体的にやはりCPUで大きな問題を計算するのはかなり厳しいです。また、GPUであってもcuQuantumを使うだけで全く同じ構成でも1.5倍くらいの高速化が出ています。
他の例題でも色々やってみたいと思いますが、今回はNVIDIA cuQuantumを利用するのが量子コンピュータのシミュレータとして最適でした。以上です。