Estimator 빠른 시작
Estimator Primitive는 양자 Circuit으로 준비된 상태에 대해 하나 이상의 Observable의 기댓값을 계산합니다. Circuit은 매개변수화될 수 있으며, 이 경우 매개변수 값도 Primitive에 입력으로 제공해야 합니다.
이 Primitive에는 동적 분리, Pauli 트월링, 게이트 폴딩 ZNE, PEA, PEC를 포함한 여러 내장 오류 완화 및 억제 기법이 있습니다. 또한 비용과 정확도 트레이드오프를 쉽게 구성할 수 있는 resilience_level 옵션을 지원합니다.
이 주제의 단계는 Estimator를 설정하고, 구성에 사용할 수 있는 옵션을 탐색하고, 프로그램에서 호출하는 방법을 설명합니다.
패키지 버전
이 페이지의 코드는 다음 요구 사항을 사용하여 개발되었습니다. 이 버전 이상을 사용하는 것을 권장합니다.
qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
```json
{/*Verified the v2 examples 2/29/24 - updated 10/29/24*/}
## Estimator Primitive 사용 단계 \{#steps-to-use-the-estimator-primitive}
### 1. 계정 초기화 \{#1-initialize-the-account}
Qiskit Runtime은 관리형 서비스이므로 먼저 계정을 초기화해야 합니다. 그런 다음 기댓값을 계산하는 데 사용할 QPU를 선택할 수 있습니다.
계정이 아직 없는 경우 [IBM Cloud 계정 설정](cloud-setup)의 단계를 따르세요.
:::note[분수 Gate]
새로 지원되는 [분수 Gate](/guides/fractional-gates)를 사용하려면 `QiskitRuntimeService` 인스턴스에서 백엔드를 요청할 때 `use_fractional_gates=True`를 설정하세요. 예를 들어:
```python
service = QiskitRuntimeService()
fractional_gate_backend = service.least_busy(use_fractional_gates=True)
이는 실험적 기능으로 향후 변경될 수 있습니다.
:::
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
print(backend.name)
ibm_fez
2. Circuit과 Observable 생성
Estimator Primitive에 대한 입력으로 최소 하나의 Circuit과 하나의 Observable이 필요합니다.
from qiskit.circuit.library import qaoa_ansatz
from qiskit.quantum_info import SparsePauliOp
entanglement = [tuple(edge) for edge in backend.coupling_map.get_edges()]
observable = SparsePauliOp.from_sparse_list(
[("ZZ", [i, j], 0.5) for i, j in entanglement],
num_qubits=backend.num_qubits,
)
circuit = qaoa_ansatz(observable, reps=2)
# The circuit is parametrized, so we will define the parameter values for execution
param_values = [0.1, 0.2, 0.3, 0.4]
Circuit과 Observable은 QPU에서 지원되는 명령만 사용하도록 변환되어야 합니다(명령 집합 아키텍처(ISA) Circuit이라고 함). 이를 위해 트랜스파일러를 사용하세요.
from qiskit.transpiler import generate_preset_pass_manager
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
isa_circuit = pm.run(circuit)
isa_observable = observable.apply_layout(isa_circuit.layout)
print(f">>> Circuit ops (ISA): {isa_circuit.count_ops()}")
>>> Circuit ops (ISA): OrderedDict([('rz', 4472), ('sx', 1884), ('cz', 1120)])
3. Qiskit Runtime Estimator 초기화
Estimator를 초기화할 때 mode 매개변수를 사용하여 실행할 모드를 지정하세요. 가능한 값은 각각 배치, 세션, Job 실행 모드에 대해 batch, session, 또는 backend 객체입니다. 자세한 내용은 Qiskit Runtime 실행 모드 소개를 참조하세요. 오픈 플랜 사용자는 Session Job을 제출할 수 없습니다.
from qiskit_ibm_runtime import EstimatorV2 as Estimator
estimator = Estimator(mode=backend)
4. Estimator 호출 및 결과 가져오기
다음으로, run() 메서드를 호출하여 입력 Circuit과 Observable의 기댓값을 계산합니다. Circuit, Observable, 선택적 매개변수 값 집합은 Primitive Unified Bloc (PUB) 튜플로 입력됩니다.
job = estimator.run([(isa_circuit, isa_observable, param_values)])
print(f">>> Job ID: {job.job_id()}")
print(f">>> Job Status: {job.status()}")
>>> Job ID: d82869ntjchs73bnokog
>>> Job Status: QUEUED
result = job.result()
print(f">>> {result}")
print(f" > Expectation value: {result[0].data.evs}")
print(f" > Metadata: {result[0].metadata}")
>>> PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': False, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})
> Expectation value: 30.60337496305257
> Metadata: {'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}
다음 단계
- 양자 컴퓨터에서 실행하기 전에 로컬 테스트 방법을 알아보세요.
- 자세한 예제를 검토하세요.
- IBM Quantum Learning의 비용 함수 강의를 통해 Primitives를 연습하세요.
- Transpile 섹션에서 로컬 트랜스파일 방법을 알아보세요.
- 트랜스파일러 설정 비교 가이드를 시도해 보세요.
- Primitive 옵션 사용 방법을 알아보세요.
- Estimator 옵션의 API를 확인하세요.
- V2 Primitives로 마이그레이션을 읽어보세요.