common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING


Desktop RAG

Overview
Terms of service

Privacy policy

Contact
Research

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