blueqat:cuQuantum (cuStateVec)を利用したCPUの100倍以上早くなるチュートリアル
Qiskitを高速化したいですよね。バックエンドを切り替えるだけで早くなります。ちょっと環境構築には苦労するかもしれませんが。今回はblueqat cloudを利用したQiskitの簡単な高速化を紹介します。blueqat cloudは有料版の企業版を利用しています。GPUはV100の32Gです。
結果から見てみましょう。横軸は量子ビット数で22量子ビットまで。縦軸は計算にかかった時間です。CPUはIntelXeonを使ってます。
GPUの秒の雰囲気がわからないので、リストを書き出してみました。ほぼ0.1秒未満です。
[0.004900693893432617,
0.07413864135742188,
0.024965763092041016,
0.024173974990844727,
0.028377056121826172,
0.029413223266601562,
0.03184700012207031,
0.03441810607910156,
0.03339433670043945,
0.03801369667053223,
0.039711713790893555,
0.04146695137023926,
0.04342055320739746,
0.04290771484375,
0.045015811920166016,
0.05161881446838379,
0.0559999942779541,
0.05427384376525879,
0.06047534942626953,
0.06277298927307129,
0.06796908378601074,
0.07407522201538086,
0.0837862491607666]
計算した回路はRXとCXを組み合わせた適当な回路を10回繰り返したものです。
コードを見てみます。
from qiskit import QuantumCircuit, transpile
from qiskit import Aer
import random
import time
def create_ghz_circuit(n_qubits):
circuit = QuantumCircuit(n_qubits)
loop = 10
for _ in range(loop):
for qubit in range(n_qubits):
circuit.rx(random.random(),qubit)
for qubit in range(n_qubits - 1):
circuit.cx(qubit, qubit + 1)
return circuit
実装は本当にバックエンドを変更するだけです。aerの標準の状態ベクトルシミュレータでの計算とGPUでの計算をやってます。
arr_gpu = []
arr_cpu = []
for n_qubits in range(0,23):
backend = Aer.get_backend('aer_simulator_statevector')
circuit = create_ghz_circuit(n_qubits=n_qubits)
circuit.measure_all()
circuit = transpile(circuit, backend)
backend = Aer.get_backend('aer_simulator')
backend.set_options(device='GPU', cuStateVec_enable=True)
start = time.time()
result = backend.run(circuit).result()
arr_gpu.append(time.time()-start)
#print(result.get_counts())
#print(f'backend: {result.backend_name}')
backend = Aer.get_backend('aer_simulator_statevector')
start = time.time()
result = backend.run(circuit).result()
arr_cpu.append(time.time()-start)
#print(result.get_counts())
#print(f'backend: {result.backend_name}')
計算結果の表示は、
import matplotlib.pyplot as plt
matplotlibを用いて二つの折れ線グラフを描画します
plt.plot(arr_cpu, label="CPU")
plt.plot(arr_gpu, label="GPU")
グラフのタイトルと軸のラベルを設定します
plt.xlabel('qubit')
plt.ylabel('sec')
凡例を表示します
plt.legend()
グラフを表示します
plt.show()
とにかくいいところは、今までのQiskitのソフトウェア資産を活かしながら、バックエンドの指定をcuQuantumにするだけで高速化されるということですね。最高です。数十秒、数分かかるところが0.1秒とかなので大変便利です。使いましょう!