common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING


Overview
Contact
Event
Project
Research

Terms of service (Web service)

Terms of service (Quantum and ML Cloud service)

Privacy policy


Sign in
Sign up
common.title

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

Yuichiro Minato

2023/06/06 14:08

1

こんにちは。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秒とかなので大変便利です。使いましょう!以上です。

© 2025, blueqat Inc. All rights reserved