로컬 테스트 모드
패키지 버전
이 페이지의 코드는 다음 요구 사항을 사용하여 개발되었습니다. 이 버전 이상을 사용하길 권장합니다.
qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0
qiskit-aer~=0.17
로컬 테스트 모드(qiskit-ibm-runtime v0.22.0 이상에서 사용 가능)를 사용하여 프로그램을 미세 조정하고 실제 양자 하드웨어에 전송하기 전에 테스트하세요. 로컬 테스트 모드로 프로그램을 검증한 후에는 QPU에서 실행하기 위해 Backend 이름만 변경하면 됩니다.
Executor 프리미티브에 대한 로컬 모드 지원은 qiskit-ibm-runtime v0.50.0에서 도입되었어요.
로컬 테스트 모드를 사용하려면 qiskit_ibm_runtime.fake_provider의 페이크 Backend 중 하나를 지정하거나, IBM Quantum® 프리미티브 또는 세션을 인스턴스화할 때 Qiskit Aer Backend를 지정하세요.
-
페이크 Backend:
qiskit_ibm_runtime.fake_provider의 페이크 Backend는 QPU 스냅샷을 사용하여 IBM® QPU의 동작을 모방합니다. QPU 스냅샷에는 결합 맵, 기저 Gate, qubit 속성 등 QPU에 대한 중요한 정보가 포함되어 있으며, 이는 Transpiler 테스트 및 QPU의 노이즈 시뮬레이션 수행에 유용합니다. 스냅샷의 노이즈 모델은 시뮬레이션 중에 자동으로 적용됩니다. -
Aer 시뮬레이터: Qiskit Aer의 시뮬레이터는 더 큰 Circuit과 사용자 정의 노이즈 모델을 처리할 수 있는 고성능 시뮬레이션을 제공합니다. 로컬 테스트 모드에서
AerSimulator를 사용하면 다양한 시뮬레이션 방법 옵션을 사용할 수 있습니다. 많은 수의 Qubit을 가진 Clifford Circuit을 효율적으로 시뮬레이션하는 방법을 보여주는 Clifford 시뮬레이션 모드 예제를 참고하세요.Qiskit Aer에서 사용 가능한 시뮬레이션 방법 목록
자세한 내용은
AerSimulator문서를 참고하세요.-
"automatic": 기본 시뮬레이션 방법입니다. Circuit과 노이즈 모델을 기반으로 시뮬레이션 방법을 자동으로 선택합니다. -
"statevector": 모든 측정이 Circuit 끝에 있는 이상적인 Circuit에서 측정 결과를 샘플링할 수 있는 밀집 상태 벡터 시뮬레이션입니다. 노이즈 시뮬레이션의 경우, 각 샷은 노이즈 모델에서 무작위로 샘플링된 노이즈가 있는 Circuit을 샘플링합니다. -
"density_matrix": 모든 측정이 Circuit 끝에 있는 노이즈가 있는 Circuit에서 측정 결과를 샘플링할 수 있는 밀도 행렬 시뮬레이션입니다. -
"stabilizer": 노이즈 모델의 모든 오류가 Clifford 오류인 경우 노이즈가 있는 Clifford Circuit을 시뮬레이션할 수 있는 효율적인 Clifford 안정자 상태 시뮬레이터입니다. -
"extended_stabilizer": 상태를 ranked-stabilizer 상태로 분해하는 방식에 기반한 Clifford + T Circuit의 근사 시뮬레이터입니다. 항의 수는 비-Clifford(T) Gate의 수에 따라 증가합니다. -
"matrix_product_state": 상태에 대해 행렬 곱 상태(MPS) 표현을 사용하는 텐서 네트워크 상태 벡터 시뮬레이터입니다. 시뮬레이터 옵션에 따라 MPS 결합 차원을 자르거나 자르지 않고 수행할 수 있습니다. 기본 동작은 잘라내지 않는 것입니다. -
"unitary": 이상적인 Circuit의 밀집 유니터리 행렬 시뮬레이션입니다. 초기 양자 상태의 진화가 아닌 Circuit 자체의 유니터리 행렬을 시뮬레이션합니다. 이 방법은 Gate만 시뮬레이션할 수 있으며, 측정, 리셋 또는 노이즈를 지원하지 않습니다. -
"superop": 이상적이거나 노이즈가 있는 Circuit의 밀집 슈퍼연산자 행렬 시뮬레이션입니다. 초기 양자 상태의 진화가 아닌 Circuit 자체의 슈퍼연산자 행렬을 시뮬레이션합니다. 이 방법은 이상적이고 노이즈가 있는 Gate와 리셋을 시뮬레이션할 수 있지만, 측정을 지원하지 않습니다. -
"tensor_network": 상태 벡터와 밀도 행렬 모두를 지원하는 텐서 네트워크 기반 시뮬레이션입니다. 현재 GPU에서만 사용 가능하며 cuQuantumcuTensorNetAPI를 사용하여 가속화됩니다.
-
- 로컬 테스트 모드에서 모든 IBM Quantum Compute 옵션을 지정할 수 있어요. 클라이언트 측
Sampler와Estimator(qiskit-ibm-runtimev0.50.0에서 도입)에서는 오류 억제 및 완화 옵션이 로컬에서 구현되므로, QPU 시간을 사용하기 전에 다양한 오류 완화 기법을 로컬에서 테스트할 수 있어요. 예제는 로컬에서 오류 완화 테스트하기를 참조하세요.
이전에는 기존(서버 측) 프리미티브의 경우 처리가 서버에서만 이루어졌기 때문에, 로컬 시뮬레이터가 shots를 제외한 모든 옵션을 무시했습니다.
- 페이크 Backend 또는 Aer 시뮬레이터를 사용하기 전에
pip install qiskit-aer를 실행하여 Qiskit Aer를 설치하는 것을 권장합니다. 페이크 Backend는 성능 향상을 위해 가능한 경우 내부적으로 Aer 시뮬레이터를 사용합니다.
페이크 Backend 예제
# 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 Backend를 인스턴스화합니다. 원하는 경우 노이즈 모델을 직접 구축할 수도 있습니다.
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 Circuit은 검증 가능한 결과로 효율적으로 시뮬레이션할 수 있으므로 Clifford 시뮬레이션은 매우 유용한 도구입니다. 심층적인 예제는 Qiskit Aer 기본 요소를 사용한 안정자 Circuit의 효율적인 시뮬레이션을 참고하세요.
예제:
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 시간을 사용하기 전에 페이크 Backend에서 다양한 오류 완화 기법을 실험해 볼 수 있어요.
기존 서버 측 프리미티브에서는 로컬 시뮬레이터에서 resilience.measure_mitigation 같은 옵션을 설정해도 아무 효과가 없었어요. 완화 처리가 서버에서만 실행되었기 때문이에요. 클라이언트 측 프리미티브는 그 처리를 로컬에서 적용해요.
로컬 노이즈 시뮬레이션 비용은 Qubit 수에 따라 지수적으로 증가하며, 대부분의 노트북은 약 32 Qubit를 넘어서는 시뮬레이션을 할 수 없어요. 이제 오류 억제 및 완화 기법이 로컬에서 실행되므로, 기본 시뮬레이션 위에 메모리와 런타임 오버헤드가 추가로 발생해요. 로컬 테스트를 감당할 수 있는 수준으로 유지하려면 다음 중 하나를 사용하세요.
-
작은 페이크 Backend(아래에서 사용하는
FakeManilaV2등). -
노이즈가 없는 시뮬레이터.
-
많은 수의 Qubit까지 확장할 수 있는 Clifford 시뮬레이션.
다음 예제는 Estimator로 측정 오류 완화를 켜고 페이크 Backend에서 실행해요. measure_mitigation = True 옵션이 이제 Circuit에 로컬로 적용돼요.
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()
로컬 테스트와 dry-run 작업 비교
로컬 테스트 모드는 사용자의 컴퓨터에서 실행됩니다. 프로그램을 개발하고 디버깅하며 출력이 어떤 모습일지 확인하기에 좋은 방법이지만, 실제 QPU에서 어떤 비용이 청구될지, 서비스가 작업을 수락할지는 알려주지 못합니다.
로컬 테스트와 달리, dry-run 작업은 QPU 시간을 사용하지 않고 IBM Quantum Compute Service를 통해 mock 디바이스에서 워크로드를 실행하므로, 실제 QPU에서 해당 작업이 발생시킬 리소스 단위(RU)의 수를 확인할 수 있습니다. 또한 서비스 측 검증을 제공하며, 요청 시 Circuit 타이밍 스케줄도 제공합니다.
| Fake Backend (로컬 테스트) | Mock 디바이스 (dry-run 작업) | |
|---|---|---|
| 실행 위치 | 로컬, 사용자의 컴퓨터 | 클라우드, IBM Quantum Compute Service |
| 계정 및 인스턴스 | 필요 없음 | 필요함 (Flex, Premium 또는 On-Prem) |
| 결과 | 스냅샷 노이즈 모델을 사용한 노이즈 시뮬레이션 | 예상 스키마를 가진 무작위 데이터. 시뮬레이션이 아님 |
| 사용량 보고 | 없음 | job.usage() |
| 작업 검증 | 클라이언트가 확인하는 범위로 제한됨 | 실제 작업과 동일하게 Quantum Compute에서 수행 |
일반적인 워크플로는 fake Backend로 Circuit과 결과를 반복해서 다듬은 다음, 실제 QPU에서 실행하기 전 마지막 확인으로 dry-run 작업을 실행하는 것입니다. 전체 비교는 Mock 디바이스와 fake Backend 비교를 참조하세요.
다음 단계
Neat클래스를 사용하여 Estimator 워크로드에 대한 노이즈 영향을 분석하세요.- 자세한 Sampler 예제를 검토하세요.
- 자세한 Estimator 예제를 검토하세요.
- IBM Quantum Learning의 비용 함수 레슨을 통해 기본 요소를 연습하세요.
- Transpile 섹션에서 로컬로 트랜스파일하는 방법을 알아보세요.
- Transpiler 설정 비교 튜토리얼을 시도해 보세요.