프리미티브 입력 및 출력
새로운 실행 모델의 베타 버전이 제공됩니다. 지향형 실행 모델은 오류 완화 워크플로우를 맞춤 설정할 때 더 많은 유연성을 제공합니다. 자세한 내용은 지향형 실행 모델 가이드를 참조하세요.
패키지 버전
이 페이지의 코드는 아래 요구 사항을 사용하여 개발되었습니다. 해당 버전 이상을 사용하시기 권장합니다.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
이 페이지는 IBM Quantum® 컴퓨팅 리소스에서 워크로드를 실행하는 Qiskit Runtime 프리미티브의 입력 및 출력에 대한 개요를 제공합니다. 이 프리미티브는 **Primitive Unified Bloc(PUB)**이라는 데이터 구조를 사용하여 벡터화된 워크로드를 효율적으로 정의할 수 있는 기능을 제공합니다. 이러한 PUB는 QPU가 워크로드를 실행하기 위한 기본 작업 단위입니다. PUB는 Sampler 및 Estimator 프리미티브의 run() 메서드에 입력으로 사용되며, 정의된 워크로드를 작업(job)으로 실행합니다. 그런 다음 작업이 완료되면 결과는 사용된 PUB와 Sampler 또는 Estimator 프리미티브에서 지정한 런타임 옵션 모두에 따라 달라지는 형식으로 반환됩니다.
PUB 개요
프리미티브의 run() 메서드를 호출할 때 필요한 주요 인수는 하나 이상의 튜플로 구성된 list입니다. 각 튜플은 프리미티브가 실행하는 Circuit에 해당합니다. 이 튜플 각각이 PUB이며, 목록의 각 튜플에 필요한 요소는 사용하는 프리미티브에 따라 다릅니다. 이 튜플에 제공되는 데이터는 브로드캐스팅을 통해 워크로드의 유연성을 제공하기 위해 다양한 형태로 배열될 수도 있습니다. 브로드캐스팅 규칙은 이후 섹션에서 설명합니다.
Estimator PUB
Estimator 프리미티브의 경우 PUB 형식에는 최대 네 가지 값이 포함되어야 합니다.
- 하나 이상의
Parameter객체를 포함할 수 있는 단일QuantumCircuit - 추정할 기댓값을 지정하는 하나 이상의 관측값(observable) 목록. 배열로 배치됩니다(예: 단일 관측값은 0차원 배열, 관측값 목록은 1차원 배열 등). 데이터는
Pauli,SparsePauliOp,PauliList, 또는str과 같은ObservablesArrayLike형식 중 하나일 수 있습니다.참고동일한 Circuit을 가진 서로 다른 PUB에 두 개의 가환(commuting) 관측값이 있는 경우, 동일한 측정을 사용하여 추정되지 않습니다. 각 PUB는 측정의 서로 다른 기저(basis)를 나타내므로, 각 PUB에 대해 별도의 측정이 필요합니다. 가환 관측값이 동일한 측정을 사용하여 추정되도록 하려면, 동일한 PUB 내에 그룹화해야 합니다.
- Circuit에 바인딩할 파라미터 값 컬렉션. 마지막 인덱스가 Circuit의
Parameter객체에 대한 단일 배열형 객체로 지정하거나, Circuit에Parameter객체가 없는 경우 생략(또는 동등하게None으로 설정)할 수 있습니다. - (선택 사항) 추정할 기댓값의 목표 정밀도
Sampler PUB
Sampler 프리미티브의 경우 PUB 튜플 형식에는 최대 세 가지 값이 포함됩니다.
- 하나 이상의
Parameter객체를 포함할 수 있는 단일QuantumCircuit참고: 이 Circuit에는 샘플링할 각 Qubit에 대한 측정 명령도 포함되어야 합니다. - Circuit에 바인딩할 파라미터 값 컬렉션 (런타임에 바인딩해야 하는
Parameter객체가 사용된 경우에만 필요) - (선택 사항) Circuit을 측정할 샷(shot) 수
다음 코드는 Estimator 프리미티브에 대한 벡터화된 입력 예시를 보여주며, 이를 IBM® Backend에서 단일 RuntimeJobV2 객체로 실행합니다.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
from qiskit.circuit import (
Parameter,
QuantumCircuit,
ClassicalRegister,
QuantumRegister,
)
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.quantum_info import SparsePauliOp
from qiskit.primitives.containers import BitArray
from qiskit_ibm_runtime import (
QiskitRuntimeService,
EstimatorV2 as Estimator,
SamplerV2 as Sampler,
)
import numpy as np
# Instantiate runtime service and get
# the least busy backend
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
# Define a circuit with two parameters.
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
circuit.ry(Parameter("a"), 0)
circuit.rz(Parameter("b"), 0)
circuit.cx(0, 1)
circuit.h(0)
# Transpile the circuit
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
transpiled_circuit = pm.run(circuit)
layout = transpiled_circuit.layout
# Now define a sweep over parameter values, the last axis of dimension 2 is
# for the two parameters "a" and "b"
params = np.vstack(
[
np.linspace(-np.pi, np.pi, 100),
np.linspace(-4 * np.pi, 4 * np.pi, 100),
]
).T
# Define three observables. The inner length-1 lists cause this array of
# observables to have shape (3, 1), rather than shape (3,) if they were
# omitted.
observables = [
[SparsePauliOp(["XX", "IY"], [0.5, 0.5])],
[SparsePauliOp("XX")],
[SparsePauliOp("IY")],
]
# Apply the same layout as the transpiled circuit.
observables = [
[observable.apply_layout(layout) for observable in observable_set]
for observable_set in observables
]
# Estimate the expectation value for all 300 combinations of observables
# and parameter values, where the pub result will have shape (3, 100).
#
# This shape is due to our array of parameter bindings having shape
# (100, 2), combined with our array of observables having shape (3, 1).
estimator_pub = (transpiled_circuit, observables, params)
# Instantiate the new estimator object, then run the transpiled circuit
# using the set of parameters and observables.
estimator = Estimator(mode=backend)
job = estimator.run([estimator_pub])
result = job.result()
브로드캐스팅 규칙
PUB는 NumPy와 동일한 브로드캐스팅 규칙에 따라 여러 배열(관측값 및 파라미터 값)의 요소를 집계합니다. 이 섹션에서는 해당 규칙을 간략하게 요약합니다. 자세한 설명은 NumPy 브로드캐스팅 규칙 문서를 참조하세요.
규칙:
- 입력 배열의 차원 수가 동일할 필요는 없습니다.
- 결과 배열은 가장 큰 차원을 가진 입력 배열과 동일한 차원 수를 갖습니다.
- 각 차원의 크기는 해당 차원의 가장 큰 크기입니다.
- 누락된 차원은 크기가 1인 것으로 가정합니다.
- 형태 비교는 가장 오른쪽 차원에서 시작하여 왼쪽으로 진행합니다.
- 두 차원의 크기가 같거나 그 중 하나가 1이면 호환됩니다.
브로드캐스팅되는 배열 쌍의 예:
A1 (1d array): 1
A2 (2d array): 3 x 5
Result (2d array): 3 x 5
A1 (3d array): 11 x 2 x 7
A2 (3d array): 11 x 1 x 7
Result (3d array): 11 x 2 x 7
브로드캐스팅되지 않는 배열 쌍의 예:
A1 (1d array): 5
A2 (1d array): 3
A1 (2d array): 2 x 1
A2 (3d array): 6 x 5 x 4 # This would work if the middle dimension were 2, but it is 5.
EstimatorV2는 브로드캐스팅된 형태의 각 요소에 대해 하나의 기댓값 추정치를 반환합니다.
다음은 배열 브로드캐스팅으로 표현된 일반적인 패턴의 몇 가지 예입니다. 아래 그림에서 이에 대한 시각적 표현을 확인할 수 있습니다.
파라미터 값 세트는 n x m 배열로, 관측값 배열은 하나 이상의 단일 열 배열로 표현됩니다. 이전 코드의 각 예시에서 파라미터 값 세트는 관측값 배열과 결합하여 결과 기댓값 추정치를 생성합니다.
-
예시 1: (단일 관측값 브로드캐스팅) 파라미터 값 세트는 5x1 배열이고 관측값 배열은 1x1 배열입니다. 관측값 배열의 항목 하나가 파라미터 값 세트의 각 항목과 결합되어, 원래 파라미터 값 세트의 항목과 관측값 배열의 항목의 조합으로 이루어진 단일 5x1 배열이 생성됩니다.
-
예시 2: (zip) 5x1 파라미터 값 세트와 5x1 관측값 배열이 있습니다. 출력은 파라미터 값 세트의 n번째 항목과 관측값 배열의 n번째 항목이 결합된 5x1 배열입니다.
-
예시 3: (외적/곱) 1x6 파라미터 값 세트와 4x1 관측값 배열이 있습니다. 이들의 조합은 파라미터 값 세트의 각 항목이 관측값 배열의 모든 항목과 결합되어 생성된 4x6 배열이며, 따라서 각 파라미터 값은 출력에서 전체 열이 됩니다.
-
예시 4: (표준 n차원 일반화) 3x6 파라미터 값 세트 배열과 두 개의 3x1 관측값 배열이 있습니다. 이들은 이전 예시와 유사한 방식으로 결합하여 두 개의 3x6 출력 배열을 만들어냅니다.