量子シミュレータを使えば、ハードウェアのキューを待ったりショットごとに料金を支払ったりすることなく回路をテストできます。しかし、無料で利用できる主要なシミュレータが6つもある中で、どれを使うべきでしょうか。ここでは実践的な整理をお届けします。
手っ取り早い答え
| シミュレータ | 最適な用途 | 最大量子ビット数(CPU) | GPU? |
|---|---|---|---|
| Qiskit Aer | 汎用 | 約30(状態ベクトル) | ✅ AerCuda |
| Cirq Simulator | Cirq回路、密度行列 | 約25 | ❌ |
| PennyLane default.qubit | QML、勾配 | 約20 | ✅ lightning.gpu |
| PennyLane lightning.qubit | 高速なCPUシミュレーション | 約30 | ✅ lightning.gpu |
| NVIDIA CUDA-Q | 大規模回路、速度 | シングルGPUで約34 | ✅ ネイティブ |
| Braket LocalSimulator | Braket回路、無料 | 約25 | ❌ |
Qiskit Aer: 働き者
Qiskit Aer は最も機能が充実した無料シミュレータです。複数のシミュレーション手法をサポートしています:
- statevector_simulator: 約30量子ビットまでの厳密なシミュレーション。メモリは 2ⁿ 個の複素数としてスケールします(30量子ビットには16 GBのRAMが必要)。
- qasm_simulator: ノイズモデルに対応したショットベースのサンプリング
- density_matrix: 混合状態と開放量子系をシミュレーション
- mps: 行列積状態(Matrix Product State) — 限られたエンタングルメントを持つ回路を数百量子ビットまでシミュレーション
- stabilizer: Clifford回路のみですが、多項式時間で数千量子ビットまでスケールします
from qiskit_aer import AerSimulator
# Default: automatic method selection
sim = AerSimulator()
# Force a specific method
sim_sv = AerSimulator(method='statevector')
sim_dm = AerSimulator(method='density_matrix')
sim_mps = AerSimulator(method='matrix_product_state')
Aerを使うべき場面: あらゆるQiskitのワークフロー、ノイズモデリング、またはIBMハードウェアの挙動を厳密に再現したい場合。
PennyLane: 量子MLに最適
PennyLane は微分可能な回路が必要なときに真価を発揮します。その default.qubit シミュレータはパラメータシフト則を用いて厳密な勾配を計算し、量子回路の勾配ベース最適化を可能にします:
import pennylane as qml
import numpy as np
dev = qml.device("default.qubit", wires=2)
@qml.qnode(dev)
def circuit(theta):
qml.RX(theta[0], wires=0)
qml.RY(theta[1], wires=1)
qml.CNOT(wires=[0, 1])
return qml.expval(qml.PauliZ(0))
# Automatic gradient computation
grad_fn = qml.grad(circuit)
theta = np.array([0.5, 1.2])
print(grad_fn(theta)) # exact gradient
勾配が不要でより高速なシミュレーションを行うには、lightning.qubit(C++バックエンド、default.qubit より約10倍高速)を使用します:
pip install pennylane-lightning
dev = qml.device("lightning.qubit", wires=20)
PennyLaneを使うべき場面: 変分アルゴリズム(VQE、QAOA)、量子ML、回路の勾配を必要とするあらゆるワークフロー。
NVIDIA CUDA-Q: 速度が重要なとき
CUDA-Q はGPUによって高速化されたシミュレーションを提供し、大規模回路ではCPUシミュレータの100〜10,000倍高速になり得ます。NVIDIA GPUをお持ちなら、25量子ビット以上の回路にはこれが正しい選択です:
import cudaq
@cudaq.kernel
def large_circuit(n: int):
qvec = cudaq.qvector(n)
h(qvec[0])
for i in range(n - 1):
cx(qvec[i], qvec[i + 1])
mz(qvec)
# Run on GPU (specify 'nvidia' target)
cudaq.set_target('nvidia')
counts = cudaq.sample(large_circuit, 30, shots_count=10000)
print(counts)
性能ベンチマーク(GHZ回路、28量子ビット、1000ショット):
- Qiskit Aer CPU: 約45秒
- PennyLane lightning.qubit: 約30秒
- CUDA-Q(A100 GPU): 約0.8秒
CUDA-Qを使うべき場面: 25量子ビット以上のあらゆる回路、性能が重要なシミュレーション、マルチGPUワークロード。
Cirq: ノイズモデリングとNISQ研究
Google Cirq には3つのシミュレータが含まれています:
import cirq
# Exact statevector simulation
sim = cirq.Simulator()
# Density matrix with noise
noise_model = cirq.ConstantQubitNoiseModel(
cirq.depolarize(p=0.01)
)
noisy_sim = cirq.DensityMatrixSimulator(noise=noise_model)
# Clifford circuits only (but exponentially faster for stabilizer states)
clifford_sim = cirq.CliffordSimulator()
Cirqを使うべき場面: NISQのノイズモデリング、スタビライザ回路の研究、Google AI Quantumのワークフロー。
Amazon Braket LocalSimulator: 隔離性と可搬性
Braket SDK には、クラウドAPIを厳密に再現する無料のローカルシミュレータが含まれています:
from braket.devices import LocalSimulator
from braket.circuits import Circuit
device = LocalSimulator()
circuit = Circuit()
circuit.h(0)
circuit.cnot(0, 1)
circuit.probability()
task = device.run(circuit, shots=1000)
result = task.result()
print(result.measurement_counts)
Braketローカルを使うべき場面: AWSへのデプロイを前提に開発しており、クラウドAPIと一致するローカルの開発/テスト環境が欲しい場合。
HLQuantumという近道
同じ回路を複数のシミュレータで実行してベンチマークや比較を行う必要がある場合、HLQuantum がそれを簡単にしてくれます:
import hlquantum as hlq
import time
qc = hlq.Circuit(28)
qc.h(0)
for i in range(27):
qc.cx(i, i + 1)
qc.measure_all()
for backend in ["qiskit", "pennylane", "cudaq"]:
t0 = time.time()
result = hlq.run(qc, shots=1000, backend=backend)
print(f"{backend}: {time.time() - t0:.2f}s")
1つの回路、3つのバックエンド、そのまま比較できる結果。