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

今まで作ったIBM QiskitのアプリをNVIDIA cuQuantum向けに直す方法

Yuichiro Minato

2023/07/23 05:55

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使ってガンガン量子計算しましょう。以上です。

© 2025, blueqat Inc. All rights reserved