클라이언트 측 추정기
qiskit_ibm_runtime.executor_estimator
개요
qiskit_ibm_runtime.executor_estimator.Estimator 는 Executor 프라이머리 위에 구축된 Qiskit 인터페이스의 EstimatorV2 구현체입니다. 이 시스템은 IBM Quantum 백엔드에서 ISA 회로를 실행하여 양자 관측량의 기대값을 추정합니다.
기존 서버 측 방식과 Estimator 이 새로운 구현 방식의 가장 큰 차이점은 모든 전처리 및 후처리 작업이 클라이언트 컴퓨터에서 실행된다는 점입니다. 여기에는 회로 준비 단계(트윌링, 게이트 폴딩, 동적 디커플링, 노이즈 주입)와 결과 후처리 단계(TREX 재스케일링, ZNE 외삽, PEC 준확률 가중치 부여)가 모두 포함됩니다. 이 단계들을 로컬에서 실행하면 디버깅 피드백을 더 빠르게 얻을 수 있고, 사용자가 더 세밀하게 제어할 수 있습니다.
사용자가 를 통해 작업을 제출하면 run(), 그 이면의 처리 과정은 다음과 같습니다:
- 기본 통합 블록(PUB)을 강제 생성하고, 복원력 수준 기본값을 설정하며, 샷 수를 결정합니다.
- PUB를 로 변환하고
QuantumProgram, 지정된 옵션에 따라 회로 변환(트윌링, 게이트 폴딩, DD, 노이즈 주입)을 적용합니다. - 백엔드에 양자 프로그램을 제출하기
Executor위해 호출합니다. - 작업 완료 시, 원시 측정 데이터로부터 기대값을 추정하고, 필요에 따라 오차 완화 후처리를 적용한다.
대규모이거나 복잡한 워크로드의 경우, 클라이언트 측의 전처리 및 후처리 단계에 많은 리소스가 소요될 수 있으며, 이로 인해 작업이 제출되기까지 지연이 발생할 수 있습니다. 클라이언트 측 처리를 모니터링하려면 INFO qiskit_ibm_runtime 로거를 다음과 같이 설정하십시오:
import logging
logger = logging.getLogger("qiskit_ibm_runtime")
logger.setLevel(logging.INFO)기본 사용법
예 1 — 최소 구성 (오류 완화 없음)
from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime.executor_estimator import Estimator
# Select a backend.
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
observable = SparsePauliOp("ZZ")
# Transform the circuit and observable into ISA format.
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_qc = pm.run(qc)
isa_obs = observable.apply_layout(isa_qc.layout)
estimator = Estimator(mode=backend)
estimator.options.resilience_level = 0
job = estimator.run([(isa_qc, isa_obs)])
result = job.result()
print(result[0].data.evs) # expectation value예 2 — 복원력 수준 2 (측정 오차 완화 + 게이트 폴딩 ZNE)
estimator = Estimator(mode=backend)
estimator.options.resilience_level = 2 # TREX + ZNE (gate folding)
job = estimator.run([(isa_qc, isa_obs)])
result = job.result()
print(result[0].data.evs) # zero-noise extrapolated expectation value
print(result[0].data.evs_noise_factors) # raw values at each noise amplification level예 3 — PEC (명시적인 노이즈 학습이 필요함)
기존의 서버 측 구현과 달리, 이 클라이언트 측 구현에서는 노이즈 모델이 필요한 오류 완화 기법(PEC 및 PEA)에 대해 명시적인 노이즈 학습이 필요합니다 Estimator .
를 사용하여 PUB에서 고유한 게이트 레이어를 추출하고 find_unique_layers() , 해당 레이어를 에 전달하여 별도의 작업에서 노이즈를 학습시킨 NoiseLearnerV3 다음, 학습된 노이즈 맵을 에 할당하십시오 layer_noise_model.
from qiskit_ibm_runtime.noise_learner_v3 import NoiseLearnerV3
pubs = [(isa_qc, isa_obs)]
estimator = Estimator(mode=backend)
estimator.options.resilience.pec_mitigation = True
# Step 1. Extract the unique boxed gate layers from your PUBs.
layers = estimator.find_unique_layers(pubs)
# Step 2. Learn the noise model for those layers.
nl_result = NoiseLearnerV3(mode=backend).run(layers).result()
# Step 3. Convert the NoiseLearnerV3 result to Pauli-Lindblad maps and pass them
# to the Estimator. The maps follow the same order as the input layers, so they can
# be zipped positionally.
pauli_lindblad_maps = nl_result.to_pauli_lindblad_maps()
estimator.options.resilience.layer_noise_model = zip(layers, pauli_lindblad_maps)
job = estimator.run(pubs)
result = job.result()
print(result[0].data.evs)입력
이 함수를 호출할 때마다 PUB 목록을 인수로 받습니다 run() . 각 PUB 파일은 다음과 같은 형식을 따릅니다:
(<single circuit>, <one or more observables>, <optional parameter values>, <optional precision>)에스티메이터의 입력 및 출력에 대한 자세한 내용은 ‘에스티메이터의 입력 및 출력’을 참조하십시오.
‘기본 입력 및 출력 ’에 설명된 대로, 관측 가능 객체와 매개변수 값의 요소들은 NumPy 의 브로드캐스팅 규칙에 따라 결합됩니다.
옵션
를 인스턴스화할 때 Estimator, 또는 EstimatorOptions 사전(dictionary)을 사용하여 옵션을 전달할 수 있습니다. resilience_level와 같은 자주 사용되는 옵션들은 첫 번째 단계에 있습니다. 그 밖의 옵션들은 다음과 같은 범주로 분류되어 있습니다 execution. 옵션은 다음 형식으로 지정하십시오: options.<category>.<option> = <value>. 예를 들어: options.dynamical_decoupling.enable = True.
기본 옵션 지정 방법에 대한 개요는 ‘옵션 소개’를 참조하십시오. 에스티메이터 옵션에 대한 자세한 내용은 “에스티메이터 옵션 지정” 및 “에스티메이터를 사용한 노이즈 관리 구성”을 참조하십시오.
출력
run() .을 반환합니다 RuntimeJobV2. Calling은 입력 PUB 하나당 하나씩, 총 개의 PrimitiveResult EstimatorPubResult 객체를 반환합니다 job.result() :
result = job.result()
pub_result = result[0] # EstimatorPubResult for the first PUB
pub_result.data # DataBin holding numerical arrays
pub_result.metadata # dictionary with per-PUB metadata
result.metadata # dictionary with job-level metadata의 내용은 지정된 완화 기법에 따라 달라집니다 pub_result.data .
완화 조치 없음 / 측정 완화 조치만 (복원력 수준 0 및 1)
다음의 모든 다각형은 형태를 가지며 pub_shape, 이는 입니다 broadcast(param_shape, obs_shape).
data.evs— 기대값.data.stds— 표준편차. 트윌링이 활성화된 경우, 트윌링에 따른 무작위 분포를 반영하며, 트윌링이 비활성화된 경우에는ensemble_standard_error와 동일합니다.data.ensemble_standard_error— 독립적이고 동일하게 분포된 샷 노이즈 가정 하에서의 표준 오차 (드리프트의 영향 없음).
측정 오차 보정(TREX) 기능이 활성화되면, 메인 회로와 함께 자동으로 작동하는 보정 회로를 통해 판독 오차에 대해 값이 evs 보정됩니다.
PEC
PEC는 완화 조치가 없는 경우와 마찬가지로 evs, stds, 및 이라는 세 가지 필드를 산출합니다 ensemble_standard_error. 감마 준확률 계수는 후처리 과정에서 내부적으로 적용되며, 별도의 출력 필드로 표시되지 않습니다.
이 값들은 stds 감마 계수에 따라 조정되므로, 일반적으로 동일한 샷 수를 기준으로 할 때 완화 조치가 없는 경우보다 더 큽니다. 이것이 PEC의 근본적인 대가입니다. 편향 없는 추정치는 표본 추출 오버헤드(gamma^2)에 비례하여 증가하는 분산을 수반합니다.
ZNE(게이트 폴딩) 및 PEA
이때 resilience.zne_mitigation=True, 추정기는 여러 잡음 증폭 수준에서 회로를 구동하고, 곡선을 적합시켜 잡음이 0인 경우로 외삽합니다. 결과에는 각 잡음 수준에 대한 외삽 추정값과 원시 데이터가 모두 포함되어 있습니다.
data.evs— 잡음이 없는 외삽 기대값 (최적의 이질적 적합 — 다항 관측량의 경우 각 항마다 외삽기가 선택됨). 모양:pub_shape.data.stds— 외삽된 값의 표준편차. 와 같은 모양입니다evs. ‘트윌링’이 활성화된 상태에서 트윌링 무작위화 간의 스프레드에서 도출된 값입니다.data.evs_noise_factors— 각 잡음 증폭 수준에서의 원시(외삽되지 않은) 기대값. 모양:(*pub_shape, num_noise_factors).data.stds_noise_factors— 각 잡음 계수별 표준편차. 와 같은 모양입니다evs_noise_factors. ‘트윌링’이 켜져 있을 때 트윌링 무작위화 간의 편차를 반영하며, ‘트윌링’이 꺼져 있을 때는ensemble_stds_noise_factors와 같습니다.data.ensemble_stds_noise_factors— 독립적이고 동일하게 분포된 샷 노이즈 가정을 전제로 한 각 노이즈 계수별 앙상블 표준 오차. 모양:(*pub_shape, num_noise_factors).data.evs_extrapolated— 요청된 각 외삽기에서 산출된 기대값으로, 의 각 점에서 평가된 값이다resilience.zne.extrapolated_noise_factors. 이는 강제 균질 적합입니다. 즉, 다항 관측량의 모든 항에 동일한 외삽기가 적용되며, 외삽기 하나당 하나의 적합이 수행됩니다. 모양:(*pub_shape, num_extrapolators, num_eval_points).data.stds_extrapolated— 에 해당하는 표준편차evs_extrapolated. 모양이 똑같다.
다항식 관측량(예: {"XX": 0.5, "XY": 0.5})의 경우, 및 evs 에 대해 이종 적합법을 stds 사용하며, 각 파울리 항에 대해 최적의 외삽기가 독립적으로 선택됩니다. evs_extrapolated 그리고 각 외삽기에 대해 균질 적합을 stds_extrapolated 사용하는데, 이는 모델 간 비교에 유용합니다. 분석에 단일 외삽기를 일관되게 적용해야 하는 경우, 다항 관측값을 단항 관측값으로 분할하여 각 항을 개별적으로 적합시키십시오.
ZNE 결과는 및 draw_zne_evs() 을 사용하여 시각화할 수 있습니다( draw_zne_extrapolators() 필요 plotly).
직무 수준 메타데이터
result.metadata 다음과 같은 내용을 dict 포함하는:
"options"— 최종 확정된EstimatorOptions, 사전 형태로. 사용되지 않는 복원력 하위 옵션은 제거되며(예를 들어, 일 경우 해당zne하위 사전이 생략됨zne_mitigation=False), 노이즈 모델(지정된 경우)도 제거됩니다."target_precision"— PUB에서 산출된 정밀도 및 의 인수precisionrun(), 또는 둘 다 지정되지 않은None경우. 이 경우, 샷 수는 에서 비롯되며default_shots, 으로 대체됩니다default_precision."shots"— 실행에 사용된 총 샷 수."executor"— 해당 Executor 결과의 메타데이터.
마이그레이션 안내서
이 클라이언트 측 Estimator 구현은 대체로 기존 구현을 그대로 대체할 수 있는 것입니다. 다음과 같은 동작상의 변경 사항을 염두에 두고, 아래에 나열된 단계를 따라 새로운 구현으로 마이그레이션하십시오:
- 전처리 및 후처리는 클라이언트 측에서 수행됩니다. 기존 Estimator에서는 모든 회로 변환(트와일링, 게이트 폴딩, 노이즈 주입)과 결과 후처리(ZNE 외삽, TREX 재스케일링, PEC 가중치 적용)가 서버 측에서 수행됩니다. 이 클라이언트 측 구현에서는 이러한 단계들이 전적으로 클라이언트 컴퓨터에서 실행됩니다.
- 잡음 학습은 별도의 단계입니다. 기존 Estimator에서는 PEC 및 PEA에 대한 노이즈 학습이 Estimator 작업 자체에 통합되어 있으며, 서버 측에서 암시적으로 처리됩니다. 이 새로운 구현 방식에서 노이즈 학습은 별도로 수행해야 하는 독립적인 워크플로우입니다.
- 실행자 작업이 제출되었습니다. 클라이언트 측 Estimator는 Executor를 사용하여 작업을 제출하므로, 이 작업들은 Estimator 작업이 아닌 Executor 작업이 됩니다. 및
primitive_idinputs과 같은 작업 속성은 Executor 작업에 대한 정보를 반환합니다.
1단계 — 임포트 문구를 업데이트합니다.
과거:
from qiskit_ibm_runtime import Estimator
from qiskit_ibm_runtime.options import EstimatorOptions이후:
from qiskit_ibm_runtime.executor_estimator import Estimator
from qiskit_ibm_runtime.options_models import EstimatorOptions2단계 — 노이즈 학습을 명시적으로 수행합니다(PEC 또는 PEA를 사용하는 경우).
코드에서 PEC(pec_mitigation=True) 또는 PEA(zne.amplifier="pea")와 함께 ZNE를 사용하는 경우, 를 사용하여 노이즈 학습을 명시적으로 수행해야 합니다 NoiseLearnerV3.
과거:
from qiskit_ibm_runtime import Estimator
pubs = [...] # Your PUBs
estimator = Estimator(mode=backend)
estimator.options.resilience.pec_mitigation = True # or zne_mitigation + pea amplifier
job = estimator.run(pubs)이후:
from qiskit_ibm_runtime.executor_estimator import Estimator
from qiskit_ibm_runtime import NoiseLearnerV3
pubs = [...] # Your PUBs
estimator = Estimator(mode=backend)
estimator.options.resilience.pec_mitigation = True # or zne_mitigation + pea amplifier
# Identify the unique layers to learn.
layers = estimator.find_unique_layers(pubs)
# Learn the noise model for those layers (runs as a separate job).
learner = NoiseLearnerV3(mode=backend)
learner_job = learner.run(layers)
learner_result = learner_job.result()
# Convert the result to Pauli-Lindblad noise maps.
pauli_lindblad_maps = learner_result.to_pauli_lindblad_maps()
# Assign the learned noise maps so PEA/PEC uses them.
# The result objects returned by NoiseLearnerV3 follow the same order as the input
# layers, so the positional zip can be used here.
estimator.options.resilience.layer_noise_model = zip(layers, pauli_lindblad_maps)
# Now execute the target PUBs.
job = estimator.run(pubs)3단계 — 하나의 작업을 여러 개로 분할합니다(PUB마다 정밀도 값이 다른 경우).
혼합 정밀도는 더 이상 지원되지 않습니다. 즉, 하나의 작업에 서로 다른 정밀도 값을 요청하는 PUB를 포함할 수 없으며, 이를 위반할 경우 IBMInputValueError 예외가 발생합니다 run() . PUB를 정밀도별로 그룹화하고, 그룹당 하나의 작업을 제출하되, 그룹들이 여전히 함께 실행되도록 Batch 하십시오.
과거:
from qiskit_ibm_runtime import Estimator
# PUBs with different precision values.
pubs = [(isa_circuit, isa_obs, None, 0.1), (isa_circuit1, isa_obs1, None, 0.5)]
estimator = Estimator(mode=backend)
job = estimator.run(pubs)이후:
from qiskit_ibm_runtime.executor_estimator import Estimator
from qiskit_ibm_runtime import Batch
# Group the PUBs by precision, one group per job.
with Batch(backend=backend) as batch:
estimator = Estimator(mode=batch)
jobs = [
estimator.run([(isa_circuit, isa_obs)], precision=0.1),
estimator.run([(isa_circuit1, isa_obs1)], precision=0.5),
]
results = [job.result() for job in jobs]클래스
칼럼 1 | 칼럼 2 |
|---|---|
Estimator | IBM Quantum Compute (이전 명칭: Qiskit Runtime )용 클라이언트 측 추정기 프리미티브. |
EstimatorV2 | 의 별칭 Estimator |