ローカルテストモード
パッケージバージョン
このページのコードは、以下の要件を使用して開発されました。 これらのバージョン以降を使用することを推奨します。
qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0
qiskit-aer~=0.17
ローカルテストモード(qiskit-ibm-runtime v0.22.0以降で利用可能)を使用すると、プログラムを微調整して実際の量子ハードウェアに送信する前にテストできます。ローカルテストモードでプログラムを検証した後は、QPUで実行するためにバックエンド名を変更するだけです。
Executor プリミティブのローカルモードのサポートは、qiskit-ibm-runtime v0.50.0 で導入されました。
ローカルテストモードを使用するには、IBM Quantum® プリミティブまたはセッションをインスタンス化する際に、qiskit_ibm_runtime.fake_providerのフェイクバックエンドか、Qiskit Aer バックエンドのいずれかを指定してください。
-
フェイクバックエンド:
qiskit_ibm_runtime.fake_providerのフェイクバックエンドは、QPUスナップショットを使用してIBM® QPUの動作を模倣します。QPUスナップショットには、カップリングマップ、基底ゲート、量子ビット特性など、トランスパイラーのテストやQPUのノイズシミュレーションに有用なQPUに関する重要な情報が含まれています。スナップショットのノイズモデルはシミュレーション中に自動的に適用されます。 -
Aerシミュレーター: Qiskit Aer のシミュレーターは、より大きな回路やカスタムノイズモデルを扱える高性能なシミュレーションを提供します。ローカルテストモードで
AerSimulatorを使用すると、シミュレーション手法オプションの一覧が利用できます。多数の量子ビットを持つClifford回路を効率的にシミュレートする方法を示すCliffordシミュレーションモードの例を参照してください。Qiskit Aerで利用可能なシミュレーション手法の一覧
詳細については、
AerSimulatorのドキュメントを参照してください。-
"automatic": デフォルトのシミュレーション手法。回路とノイズモデルに基づいて、シミュレーション手法を自動的に選択します。 -
"statevector": 回路の末尾にすべての測定がある理想的な回路から測定結果をサンプリングできる密な状態ベクトルシミュレーション。ノイズシミュレーションの場合、各ショットはノイズモデルからランダムにサンプリングされたノイズ回路をサンプリングします。 -
"density_matrix": 回路の末尾にすべての測定があるノイズのある回路から測定結果をサンプリングできる密度行列シミュレーション。 -
"stabilizer": ノイズモデル内のすべてのエラーもCliffordエラーである場合に、ノイズのあるClifford回路をシミュレートできる効率的なCliffordスタビライザー状態シミュレーター。 -
"extended_stabilizer": 状態をランク付きスタビライザー状態に分解することに基づく、Clifford + T回路の近似シミュレーター。項の数は非Clifford(T)ゲートの数とともに増加します。 -
"matrix_product_state": 状態に行列積状態(MPS)表現を使用するテンソルネットワーク状態ベクトルシミュレーター。シミュレーターオプションに応じて、MPSボンド次元を切り捨てるかどうかを選択できます。デフォルトの動作は切り捨てなしです。 -
"unitary": 理想的な回路の密なユニタリ行列シミュレーション。初期量子状態の発展ではなく、回路自体のユニタリ行列をシミュレートします。この手法はゲートのみをシミュレートし、測定、リセット、またはノイズをサポートしません。 -
"superop": 理想的またはノイズのある回路の密な超演算子行列シミュレーション。初期量子状態の発展ではなく、回路自体の超演算子行列をシミュレートします。この手法は理想的なゲートとノイズのあるゲートおよびリセットをシミュレートできますが、測定をサポートしません。 -
"tensor_network": 状態ベクトルと密度行列の両方をサポートするテンソルネットワークベースのシミュレーション。現在これはGPUのみで利用可能で、cuQuantumのcuTensorNetAPIを使用して高速化されています。
-
- ローカルテストモードでは、すべての IBM Quantum Compute オプションを指定できます。クライアント側の
SamplerとEstimator(qiskit-ibm-runtimev0.50.0 で導入)では、エラー抑制およびエラー緩和のオプションがローカルで実装されるため、QPU の時間を使う前に、さまざまなエラー緩和手法をローカルでテストできます。例については、エラー緩和をローカルでテストするを参照してください。
以前は、従来の(サーバー側の)プリミティブでは、その処理がサーバー上でのみ行われていたため、ローカルシミュレーターは shots 以外のすべてのオプションを無視していました。
- Aer シミュレーターまたはフェイクバックエンドを使用する前に、
pip install qiskit-aerを実行して Qiskit Aer をインストールすることを推奨します。フェイクバックエンドは、パフォーマンスを活用するために、利用可能な場合は Aer シミュレーターを内部で使用します。
フェイクバックエンドの例
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "qiskit": "qiskit", "qiskit_aer": "qiskit-aer", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit.circuit import QuantumCircuit
from qiskit.transpiler import generate_preset_pass_manager
# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Sampler
# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_sampler import Sampler
from qiskit_ibm_runtime.fake_provider import FakeManilaV2
# 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の例
セッションを使用した例(ノイズなし):
from qiskit_aer import AerSimulator
from qiskit.circuit import QuantumCircuit
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import Session
# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Sampler
# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_sampler import Sampler
# 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(mode=session)
result = sampler.run([isa_qc]).result()
ノイズありでシミュレートするには、QPU(量子ハードウェア)を指定してAerに送信します。AerはそのQPUのキャリブレーションデータに基づいてノイズモデルを構築し、そのモデルを使用してAerバックエンドをインスタンス化します。必要に応じて、ノイズモデルを構築することもできます。
QPUはさまざまな種類のノイズの影響を受ける可能性があります。ここで使用するQiskit Aerノイズモデルはそのうちの一部のみをシミュレートするため、実際のQPU上のノイズよりも軽度になる可能性があります。
QPUからノイズモデルを初期化する際に含まれるエラーの詳細については、Aerの NoiseModel APIリファレンスを参照してください。
ノイズありの例:
from qiskit_aer import AerSimulator
from qiskit.circuit import QuantumCircuit
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService
# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Sampler
# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_sampler import Sampler
# Bell Circuit
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()
service = QiskitRuntimeService()
# Specify a QPU to use for the noise model
real_backend = service.least_busy(operational=True, simulator=False)
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 efficient_su2
# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Sampler
# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_sampler import Sampler
n_qubits = 500 # <---- note this uses 500 qubits!
circuit = efficient_su2(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_qc = pm.run(qc)
sampler = Sampler(mode=aer_sim)
result = sampler.run([isa_qc]).result()
エラー緩和をローカルでテストする
クライアント側の Sampler と Estimator(qiskit-ibm-runtime v0.50.0 で導入)では、エラー抑制とエラー緩和がサーバーではなくクライアントで行われます。その結果、これらのオプションがローカルテストモードでも有効になり、QPU の時間を使う前に、フェイクバックエンド上でさまざまなエラー緩和手法を試すことができます。
従来のサーバー側プリミティブでは、緩和処理がサーバー上でのみ実行されていたため、ローカルシミュレーターで resilience.measure_mitigation などのオプションを設定しても効果がありませんでした。クライアント側のプリミティブは、その処理をローカルで適用します。
ローカルでのノイズ付きシミュレーションのコストは量子ビット数に対して指数関数的に増加し、ほとんどのノートパソコンでは約32量子ビットを超えるシミュレーションはできません。エラー抑制およびエラー緩和手法がローカルで実行されるようになったため、基本のシミュレーションに加えて、メモリと実行時間のオーバーヘッドがさらに増加します。ローカルテストを現実的な範囲に保つには、次のいずれかを使用してください。
-
小規模なフェイクバックエンド(以下で使用する
FakeManilaV2など)。 -
ノイズのないシミュレーター。
-
多数の量子ビットまでスケールするCliffordシミュレーション。
次の例では、Estimator で測定エラー緩和を有効にし、フェイクバックエンド上で実行します。measure_mitigation = True オプションが、回路にローカルで適用されるようになりました。
from qiskit.circuit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler import generate_preset_pass_manager
# Legacy server-side primitive before qiskit-ibm-runtime v0.50.0
# from qiskit_ibm_runtime import Estimator
# Client-side primitive introduced in qiskit-ibm-runtime v0.50.0
from qiskit_ibm_runtime.executor_estimator import Estimator
from qiskit_ibm_runtime.fake_provider import FakeManilaV2
# Bell Circuit
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
observable = SparsePauliOp("ZZ")
# Transpile the circuit and observable for the fake backend
fake_manila = FakeManilaV2()
pm = generate_preset_pass_manager(backend=fake_manila, optimization_level=1)
isa_qc = pm.run(qc)
isa_observable = observable.apply_layout(isa_qc.layout)
# Run the Estimator job locally using FakeManilaV2
estimator = Estimator(mode=fake_manila)
# With the client-side Estimator, this option takes effect locally
estimator.options.resilience.measure_mitigation = True
result = estimator.run([(isa_qc, isa_observable)]).result()
次のステップ
Neatクラスを使用して、Estimatorワークロードへのノイズの影響を分析してください。- 詳細なSamplerの例を確認してください。
- 詳細なEstimatorの例を確認してください。
- IBM Quantum Learningのコスト関数レッスンでプリミティブを実践してください。
- トランスパイルセクションでローカルでのトランスパイル方法を学んでください。
- トランスパイラー設定の比較チュートリアルを試してください。