メインコンテンツへスキップ

クラウドシミュレーターからローカルシミュレーターへの移行

量子コンピューティングにおいて、シミュレーターと量子ハードウェアのどちらを使用するかの選択は、この分野での進展において非常に重要です。シミュレーターはテストやデバッグに役立ちますが、量子ユーティリティの時代において、量子開発と産業の発展には実際のハードウェアが必要です。量子ユーティリティへの移行の一環として、IBM Quantum® クラウドシミュレーターは 2024年5月15日に廃止されました。このガイドでは、廃止の詳細と、ibmq_qasm_simulator などのクラウドベースのシミュレーターからローカルシミュレーターへの移行方法を説明します。

クラウドシミュレーターが廃止される理由

クラウドシミュレーターが廃止される理由はいくつかあります。

シミュレーターには限界がある

シミュレーターは有用ですが、研究や実験に使用するには限界があります。

  • シミュレーターは小規模な QPU(量子処理ユニット)を理解するのに役立ちますが、高性能スーパーコンピューターを使用しても、その有用性は約50量子ビットで頭打ちになります。この上限は、より大きな量子コンピューターをシミュレートするために必要な計算リソースが指数関数的に増加することに起因しています(詳細は Massively parallel quantum computer simulator, eleven years later を参照)。100量子ビット以上の量子コンピューターを探索するにはハードウェアが必要です。

  • 一部のシミュレーターはノイズモデルを提供していますが、実際の QPU の全ダイナミクスを捉えることは非常に困難な問題です。量子ハードウェアは、研究者がノイズ、エラー、デコヒーレンスなど量子コンピューターに固有の課題をリアルなテスト環境で直接体験できる機会を提供します。

量子ハードウェアの使用は固有のスキルを構築する

量子ハードウェアとの直接的なやり取りは、シミュレーターだけでは習得できないスキルと経験を培います。

  • 量子ハードウェアとの直接的なやり取りはスキルを構築します。信頼性の高い計算のために、エラー緩和や抑制技術を実装または使用する必要があるためです。

  • 量子ハードウェアの実践的な経験は、量子現象や量子プロセッサーの特性にアルゴリズムを適応させる方法についての深い理解を育みます。

  • 量子ハードウェアへの関与は、量子コンピューティングの課題と機会に関する実践的な洞察をもたらし、開発者がこの分野でイノベーションを推進する能力を高めます。

アルゴリズムは量子ハードウェア向けに適応させる必要がある

成功する量子アルゴリズムは、量子ハードウェアの能力を活用し、パフォーマンスと効率を最適化するために適応させる必要があります。

  • 量子ハードウェアは、シミュレーターよりも実際の QPU をより正確に表現します。

  • 量子ハードウェア向けにアルゴリズムを微調整するには、パフォーマンスを最大化するために、アンザッツ、回路実装、パラメーター、および設定を調整する必要があります。このプロセスは、量子ハードウェアを直接実験することで最もうまく達成されます。

シミュレーターをいつ使用すべきか

量子シミュレーターは、プログラムを量子ハードウェアに送る前に開発・テストするために使用すべきです。ローカルシミュレーターは、良好なパフォーマンスと効率でこれを実現できます。Clifford 回路は非常に効率的にシミュレートでき、結果を検証できるため、実験への信頼性を高める有用な方法です。

備考

ローカルテストモードには、組み込みのエラー抑制や緩和機能はありません。代わりに、それらのオプションを明示的に指定する必要があります。詳細については、Qiskit Runtime のエラー緩和の設定を参照してください。

ローカルシミュレーターへの移行

qiskit-ibm-runtime 0.22.0 以降では、ローカルテストモードを使用してクラウドシミュレーターを置き換えることができます。ニーズに応じて、ローカルテストモードを使用する方法がいくつかあります。まず、qiskit_ibm_runtime.fake_provider 内のいずれかのフェイクバックエンドを指定するか、プリミティブまたはセッションをインスタンス化する際に Qiskit Aer バックエンドを指定します。

シミュレーターの選択ガイダンス

以下の表を参考にシミュレーターを選択してください。

シミュレーターフェイクバックエンドAerSimulatorClifford シミュレーション
目的スナップショットを使用して特定の IBM® QPU を模倣汎用高性能シミュレーションClifford 回路の効率的なシミュレーション
ノイズモデルQPU スナップショットからノイズモデルを自動適用カスタムまたは実際の QPU キャリブレーションデータに基づくノイズのないシミュレーションに最適
回路サイズ模倣された QPU の能力に限定より大きな回路を処理可能非常に大規模な回路(数百量子ビット)に適している
結果QPU 固有のテストで中程度の実行時間広範なシミュレーションで短い実行時間非常に高速で、スタビライザー回路に適している
ユースケーストランスパイラーと QPU 固有の動作のテスト一般的な開発、カスタムノイズモデル大規模スタビライザー回路、エラー訂正
備考

ほとんどのユーザーにとって、AerSimulator はその柔軟性とパフォーマンスから良い選択肢です。ただし、特定の QPU をターゲットにしている場合は、フェイクバックエンドの方が適している場合があります。

フェイクバックエンド

フェイクバックエンドは、スナップショットを使用して IBM QPU の動作を模倣します。スナップショットには、結合マップ、基底ゲート、量子ビットプロパティなど QPU に関する重要な情報が含まれており、トランスパイラーのテストや QPU のノイズシミュレーションの実行に役立ちます。スナップショットのノイズモデルはシミュレーション中に自動的に適用されます。

例:

from qiskit.circuit.library import RealAmplitudes
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime.fake_provider import FakeManilaV2
from qiskit_ibm_runtime import SamplerV2 as Sampler, QiskitRuntimeService

service = QiskitRuntimeService()

# Bell Circuit
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()

# Run the sampler job locally using FakeManilaV2
fake_manila = FakeManilaV2()
pm = generate_preset_pass_manager(backend=fake_manila, optimization_level=1)
isa_qc = pm.run(qc)

# You can use a fixed seed to get fixed results.
options = {"simulator": {"seed_simulator": 42}}
sampler = Sampler(mode=fake_manila, options=options)

result = sampler.run([isa_qc]).result()

AerSimulator

Qiskit Aer のシミュレーターとともにローカルテストモードを使用できます。Qiskit Aer は、より大きな回路やカスタムノイズモデルを処理できる高性能シミュレーションを提供します。また、多数の量子ビットを持つ Clifford 回路を効率的にシミュレートできる Clifford シミュレーションモードもサポートしています。

セッションありのノイズなし例:

注意

以下のコードブロックは、セッションを使用するため、オープンプランのユーザーにはエラーが返されます。オープンプランのワークロードは、ジョブモードまたはバッチモードでのみ実行できます。

from qiskit_aer import AerSimulator
from qiskit.circuit.library import RealAmplitudes
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import Session, SamplerV2 as Sampler, QiskitRuntimeService

service = QiskitRuntimeService()

# Bell Circuit
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()

# Run the sampler job locally using AerSimulator.
# Session syntax is supported but ignored because local mode doesn't support sessions.
aer_sim = AerSimulator()
pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)
isa_qc = pm.run(qc)
with Session(backend=aer_sim) as session:
sampler = Sampler()
result = sampler.run([isa_qc]).result()

ノイズ付きでシミュレートするには、QPU(量子ハードウェア)を指定して Aer に送信します。Aer はその QPU のキャリブレーションデータに基づいてノイズモデルを構築し、そのモデルで Aer バックエンドをインスタンス化します。必要に応じて、ノイズモデルを構築することもできます。

ノイズあり例:

from qiskit_aer import AerSimulator
from qiskit.circuit.library import RealAmplitudes
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler

service = QiskitRuntimeService()

# Bell Circuit
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()

# Specify a QPU to use for the noise model
real_backend = service.backend("ibm_brisbane")
aer = AerSimulator.from_backend(real_backend)

# Run the sampler job locally using AerSimulator.
pm = generate_preset_pass_manager(backend=aer, optimization_level=1)
isa_qc = pm.run(qc)
sampler = Sampler(mode=aer)
result = sampler.run([isa_qc]).result()

Clifford シミュレーション

Clifford 回路は検証可能な結果で効率的にシミュレートできるため、Clifford シミュレーションは非常に有用なツールです。詳細な例については、Qiskit Aer プリミティブによるスタビライザー回路の効率的なシミュレーションを参照してください。

例:

import numpy as np
from qiskit.circuit.library import EfficientSU2
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler

service = QiskitRuntimeService()

n_qubits = 500 # <---- note this uses 500 qubits!
circuit = EfficientSU2(n_qubits)
circuit.measure_all()

rng = np.random.default_rng(1234)
params = rng.choice(
[0, np.pi / 2, np.pi, 3 * np.pi / 2],
size=circuit.num_parameters,
)

# Tell Aer to use the stabilizer (clifford) simulation method
aer_sim = AerSimulator(method="stabilizer")

pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)
isa_circuit = pm.run(circuit)
sampler = Sampler(mode=aer_sim)
result = sampler.run([(isa_circuit, params)]).result()