common.title
Home

Account

Sign in
Sign up

Service


Company

Overview
Service overview
Terms of service

Privacy policy

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

© 2023, blueqat Inc. All rights reserved