NVIDIA cuQuantumを利用すると、これまでIBMのQiskitで作ったアプリケーションを簡単に高速化できます。その方法は2種類あり、それらを順番に確認していきたいと思います。非常に簡単ですので、GPUを持っている人はcuQuantumとIBMのQiskitを使って簡単に実行できます。多少インストールにてこずることがありますので、今後その辺の改善を期待したいと思います。では見てみましょう。
それぞれについてやり方が少し異なりますので確認します。前者は純粋にこれまでの拡張であり、後者は全く新しいシミュレータとなっていて、使い方が全く異なります。慣れてない人は前者の方を使ってください。
cuStateVec
量子コンピューターのシュミレーターである状態ベクトルシュミレーターをGPUで高速化しています。そのため、これまで量子コンピュータの多くのアプリケーションは、この方式を使うことにより、純粋に大きな変更なく高速化を実現できます。アプリケーション自体を大きく変更することなく、実行するバックエンドを変更するのみで効果が期待できるため、多くの方がこの方法を利用します。
cuQuantumとqiskit,qiskit-aer-gpuが正しくインストールされていれば特にcuQuantum側を読み込むことなく、qiskitのライブラリのみで実行できます。
#ライブラリを読み込み
import numpy as np
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
#量子回路を準備
circ = QuantumCircuit(2)
#量子ゲートを適用
circ.h(0)
circ.cx(0, 1)
circ.measure_all()
#回路を確認
circ.draw()
#CPUのシミュレータを読み込み実行する
sim_cpu = AerSimulator(method='statevector', device='CPU')
上記は従来のCPUを利用した方法です。
%%time
result_cpu = sim_cpu.run(circ).result()
result_cpu.get_counts()
CPU times: user 3.27 ms, sys: 0 ns, total: 3.27 ms
Wall time: 2.91 ms
[2]:{'11': 520, '00': 504}
また、GPUを利用する場合には、deviceをGPUに、cuStateVec_enableをTrueにするだけです。
#GPUにシミュレータを変更して実行してみる
sim_gpu = AerSimulator(method='statevector', device="GPU", cuStateVec_enable=True)
%%time
result_gpu = sim_gpu.run(circ).result()
result_gpu.get_counts()
CPU times: user 546 ms, sys: 237 ms, total: 782 ms
Wall time: 776 ms
[4]:{'00': 499, '11': 525}
小さいサイズの問題では、GPUのオーバーヘッドがあるため遅くなりますが、大きい問題では高速化されます。
cuTensorNet
こちらはちょっと異なります。一旦Qiskitの回路をcuTensorNet向けに変換を行い、その量子回路をcuTensorNetで計算しています。Qiskitで作ったアプリケーションは簡単にコンバートできますので、変換できればそのまま計算できます。あまり深い回路などは計算できないと思います。回路全体を読み込んで変換する必要があるので、テンソルネットワークの知識が必要になります。
from cuquantum import CircuitToEinsum, contract
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.quantum_info import Statevector
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
converter = CircuitToEinsum(qc)
expr, operands = converter.amplitude('00')
amp = contract(expr, *operands)
print(amp)
qc.draw()
(0.7071067811865475+0j)
いかがでしょうか。簡単に計算できましたね。今後もGPU使ってガンガン量子計算しましょう。以上です。