cuQuantum (cuStateVec)を利用したCPUの100倍以上早くなるチュートリアル

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秒とかなので大変便利です。使いましょう!