Skip to main content
IBM Quantum Platform

서버 측 샘플러 및 추정기를 클라이언트 측으로 마이그레이션

이 가이드에서는 IBM Quantum® Sampler 및 의 서버 측 구현에서 qiskit-ibm-runtime 의 새로운 클라이언트 측 구현으로Estimator 마이그레이션하는 방법을 설명합니다. 인터페이스와 옵션은 대체로 변함이 없기 때문에 대부분의 코드는 있는 그대로 실행되지만, 이해해야 할 몇 가지 동작상의 차이점이 있습니다.


배경

Sampler와 Estimator는 Qiskit에 정의된 기본 인터페이스입니다. IBM Quantum Compute 서비스(이전의 Qiskit Runtime )는 그동안 자체 런타임 환경 내에서 이러한 기본 요소들의 구현 을 제공해 왔습니다. 를 호출하거나 sampler.run() estimator.run()을 호출하면, 요청이 서비스로 전송되며, 오류 억제 및 완화 조치를 포함한 모든 계산은 서버 측에서 수행됩니다.

이러한 블랙박스 방식은 편리합니다. 구현 세부 사항을 신경 쓸 필요가 없기 때문입니다. 하지만 이로 인해 기본 함수들의 디버깅, 사용자 정의, 또는 학습이 어려워지기도 하는데, 이는 처리 과정에서 어떤 일이 일어나는지 확인할 수 없기 때문입니다.

새로 도입된 지시형 실행 모델은 정반대의 접근 방식을 취하며 화이트박스 방식을 제공합니다. 모든 설계 의도는 클라이언트 측에서 반영되며, 단일 서버 측 기본 실행기(Executor) 가 이러한 입력값을 지시된 대로 정확히 처리합니다. 사용자를 대신해 암묵적인 결정을 내리지 않습니다.

v0.50.0 부터 qiskit-ibm-runtime Sampler와 Estimator가 Executor를 기반으로 클라이언트 측 에서 재구현되었습니다. 이들은 이전과 동일한 편의성과 추상화를 제공하며, 이제 필요할 때 구현 세부 사항을 확인할 수 있습니다. 인터페이스와 옵션이 대체로 동일하게 유지되므로, 마이그레이션은 매끄럽게 이루어질 것입니다.

참고: IBM Quantum 은 Sampler 및 Estimator 인터페이스의 버전 2(BaseSamplerV2 및 BaseEstimatorV2)만 지원합니다. 따라서 이 가이드에서는 이를 단순히 ‘샘플러’와 ‘추정기’라고 부릅니다.


임포트 문구를 업데이트하세요

오늘부터는 새로운 구현체를 해당 전용 모듈에서 명시적으로 가져와야 합니다:

from qiskit_ibm_runtime.executor_sampler import Sampler
from qiskit_ibm_runtime.executor_estimator import Estimator

가까운 시일 내에 최상위 임포트는 새로운 클라이언트 측 구현으로 대체될 것이며, 코드 변경은 필요하지 않을 것입니다:

# Coming soon — the following code will import the new client-side implementations.
from qiskit_ibm_runtime import Sampler, Estimator

마찬가지로, 형식이 지정된 옵션 객체를 생성하는 경우, 이를 대신 qiskit_ibm_runtime.options_models 가져와야 하거나, 그냥 일반 중첩 딕셔너리를 전달해야 합니다:

from qiskit_ibm_runtime.options_models import SamplerOptions, EstimatorOptions

변경되지 않는 사항

  • 와 로 이루어진 mode 원시적 구조 options.
  • 서명 run() 및 PUB 형식.
  • 옵션 트리 (options.twirling, options.resilience, options.default_shots, 등등).
  • .에 의해 반환되는 결과 데이터 구조는 다음과 같습니다 job.result().

새로운 샘플러의 호환되지 않는 변경 사항

변경
이주 조치
이제 기본 프라이머리타입은 Executor입니다. IBM Quantum Platform 의 사용자 인터페이스와 모두 executor 대신 을 job.primitive_id 표시합니다 sampler..을 참조하는 모든 코드를 업데이트하십시오 job.primitive_id.
새로운 구현은 샘플러 입력을 익스큐터 입력에 매핑하므로, 익스큐터 입력을 반환합니다 job.inputs ..을 참조하는 모든 코드를 업데이트하십시오 job.inputs. ‘작업 입력’ 항목을 참조하십시오.
이제 클라이언트 측에서 수행되는 전처리 및 후처리 작업이 늘어났기 때문에, sampler.run() 와 는 이전보다 더 오래 걸릴 job.result() 수 있습니다.클라이언트 측 처리 진행 상황을 확인하려면 INFO 로깅을 활성화하십시오. “INFO 로깅 활성화”를 참조하십시오.
회로 메타데이터가 결과 메타데이터로 복사됩니다. 결과 메타데이터에서 허용되는 데이터 유형은 이제 str, float, int, bool, 그리고 해당 유형의 리스트나 딕셔너리로 제한됩니다.다른 데이터 유형이 필요한 경우, 먼저 해당 데이터를 문자열로 인코딩하십시오(예: base64을 사용하여).
Options 클래스(options_models.SamplerOptions 등)는 이제 dataclass가 아닌 Pydantic 모델이므로, 더 이상 asdict().을 사용하여 Python 사전으로 변환할 수 없습니다.options.model_dump() 항목을 대신 사용하십시오.
이전에는 접미사 V2 (ExecutionOptionsV2 등)이 붙어 있던 옵션 클래스들은, V1 기본 유형이 더 이상 지원되지 않기 때문에 이제 해당 접미사가 없어졌습니다.다음 옵션 클래스의 V2 접미사를 제거하십시오: 는 로 ExecutionOptionsV2``ExecutionOptions , ResilienceOptionsV2 는 로 ResilienceOptions, 는 SamplerExecutionOptionsV2 로 각각 대체하십시오 SamplerExecutionOptions.
이 활성화되어 twirling 있고 ( shots PUB 또는 run())에서, shots_per_randomization, 및 num_randomizations 가 모두 지정된 경우, 가 보다 우선합니다 num_randomizations * shots_per_randomization``shots .shots 값을 사용하려면 shots_per_randomization 와 num_randomizations 를 생략하십시오.
일부 입력 검증 처리가 서버 측으로 옮겨졌으며, 이제 대신 RuntimeError 를 발생시킵니다 IBMInputValueError.코드에서 처리하는 예외 유형을 업데이트하십시오.
단일 작업 내에서 혼합된 샷 값은 더 이상 지원되지 않습니다.각 샷 값에 대해 별도의 작업을 제출하십시오. 관련 고려 사항에 대해서는 ‘업무 분할’ 항목을 참조하십시오.

새로운 Estimator의 호환되지 않는 변경 사항

변경
이주 조치
이제 기본 프라이머리타입은 Executor입니다. IBM Quantum Platform 의 사용자 인터페이스와 모두 executor 대신 을 job.primitive_id 표시합니다 estimator..을 참조하는 모든 코드를 업데이트하십시오 job.primitive_id.
새로운 구현은 Estimator의 입력값을 Executor의 입력값에 매핑하므로, Executor의 입력값을 반환합니다 job.inputs ..을 참조하는 모든 코드를 업데이트하십시오 job.inputs. ‘작업 입력’ 항목을 참조하십시오.
이제 클라이언트 측에서 수행되는 전처리 및 후처리 작업이 늘어났기 때문에, estimator.run() 와 는 이전보다 더 오래 걸릴 job.result() 수 있습니다.클라이언트 측 처리 진행 상황을 확인하려면 INFO 로깅을 활성화하십시오. “INFO 로깅 활성화”를 참조하십시오.
회로 메타데이터가 결과 메타데이터로 복사됩니다. 결과 메타데이터에서 허용되는 데이터 유형은 이제 str, float, int, bool, 그리고 해당 유형의 리스트나 딕셔너리로 제한됩니다.다른 데이터 유형이 필요한 경우, 먼저 해당 데이터를 문자열로 인코딩하십시오(예: base64을 사용하여).
Options 클래스(options_models.EstimatorOptions 등)는 이제 dataclass가 아닌 Pydantic 모델이므로, 더 이상 asdict().을 사용하여 Python 사전으로 변환할 수 없습니다.options.model_dump() 항목을 대신 사용하십시오.
V1 의 기본 유형이 더 이상 지원되지 않기 때문에, 접미사 V2 ‘before(ExecutionOptionsV2 ’ 등으로 시작하는 options 클래스는 더 이상 해당 접미사를 사용하지 않습니다.다음 옵션 클래스의 V2 접미사를 제거하십시오. 를 로 ExecutionOptionsV2 , ExecutionOptions 를 ResilienceOptionsV2 로 바꾸십시오 ResilienceOptions.
선택된 일부 항목이 아닌, 모든 입력 옵션이 결과 메타데이터에 반환됩니다.없음 — 이는 참고용입니다.
일부 입력 검증 처리가 서버 측으로 옮겨졌으며, 이제 대신 RuntimeError 를 발생시킵니다 IBMInputValueError.코드에서 처리하는 예외 유형을 업데이트하십시오.
PEA 및 PEC에 대한 암시적 노이즈 학습은 더 이상 적용되지 않습니다. TREX에 대한 측정 노이즈 학습은 여전히 지원됩니다.소음 모델을 각각 학습시킨 후, 이를 Estimator에 전달합니다. “PEA 및 PEC에 대한 명시적 노이즈 학습 수행”을 참조하십시오.
의 입력 유형은 다르며 ResilienceOptions.layer_noise_model , NoiseLearnerV3 결과로부터 구성될 수 있습니다.PEA 및 PEC에 대한 명시적 노이즈 학습 수행 방법을 참조하여 NoiseLearnerV3 , 노이즈 모델을 학습하고 이를 Estimator에 전달하는 방법을 확인하십시오.
MeasureNoiseLearningOptions.shots_per_randomization 더 이상 지원되지 않습니다.측정 잡음 학습 회로를 포함하여 작업 내의 모든 회로에 대해 단일 샷 값이 사용됩니다. 다른 샷 값을 사용해야 하는 경우, 외부 qiskit-mitigation Estimator를 사용하여 TREX를 적용하십시오.
단일 작업 내에서 혼합 정밀도 값을 사용하는 것은 더 이상 지원되지 않습니다.원하는 정밀도마다 별도의 작업을 제출하십시오. 관련 고려 사항에 대해서는 ‘업무 분할’ 항목을 참조하십시오.
이 seed_estimator 옵션은 더 이상 지원되지 않습니다.모든 options.seed_estimator 할당을 제거하십시오 (할당을 설정하면 가 발생합니다 ValidationError). 클라이언트 측에 이에 상응하는 기능이 없기 때문에, 이 시드를 통해 결과를 더 이상 재현할 수 없습니다.

정보 로깅 사용

요즘은 클라이언트 측에서 처리되는 작업이 많아졌기 때문에, 해당 처리 진행 상황을 확인하는 것이 유용합니다. 다음 qiskit_ibm_runtime 로거에 대해 INFO 수준 로깅을 활성화합니다:

import logging

logger = logging.getLogger("qiskit_ibm_runtime")
logger.setLevel(logging.INFO)

PEA 및 PEC에 대해 명시적 노이즈 학습을 수행한다

새로운 Estimator는 PEA 또는 PEC 오차 완화 방법이 선택된 경우 더 이상 암시적 노이즈 학습을 수행하지 않습니다. 소음 모델을 명시적으로 학습한 후 이를 입력해야 합니다. 새로운 기능을 사용하여 회로가 레이어별로 어떻게 분류되는지 제어할 NoiseLearnerV3수 있습니다. 이 기능은 박스로 묶인 회로 지시문 목록(예를 들어, 고유 레이어)을 입력으로 받습니다.

중요

PEA와 PEC는 이제 이러한 명시적인 패턴을 요구합니다. 노이즈 학습 단계를 건너뛰지 마십시오. 그렇지 않으면 코드가 제대로 작동하지 않을 것입니다. TREX를 위한 측정 노이즈 학습은 영향을 받지 않으며, 이전과 동일하게 작동합니다.

마찬가지로, 코드에서 를 NoiseLearner 사용하고 그 결과로 얻은 노이즈 모델을 서버 측 Estimator에 전달하는 경우, 해야 합니다 ~로 이전하기 NoiseLearnerV3. 새로운 Estimator와 NoiseLearner 호환되지 않는 구버전은 절대로 사용하지 마십시오.

서버 측 Estimator(LayerNoiseLearningOptions)의 모든 노이즈 학습 옵션은 옵션 NoiseLearnerV3 (NoiseLearnerV3Options)과 직접적으로 대응되지만, 는 예외입니다 max_layers_to_learn. 학습할 레이어의 수는 오히려 에 전달된 레이어의 수에 따라 결정됩니다 NoiseLearnerV3.

예를 들어,

서버 측 추정기 (PEC 활성화 시):

from qiskit_ibm_runtime import Estimator

pubs = [...]  # Your PUBs
estimator = Estimator(mode, options)
estimator.options.resilience.pec_mitigation = True  # or zne_mitigation + pea amplifier
estimator.options.resilience.layer_noise_learning.num_randomizations = 64

job = estimator.run(pubs)

클라이언트 측 추정기 (PEC 활성화 시):

from qiskit_ibm_runtime.executor_estimator import Estimator
from qiskit_ibm_runtime import NoiseLearnerV3

pubs = [...]  # Your PUBs
estimator = Estimator(mode, options)
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)
learner.options.num_randomizations = 64  # Same as layer_noise_learning.num_randomizations
learner_job = learner.run(layers)
learner_result = learner_job.result()

# Convert results to Pauli-Lindblad noise maps.
pauli_lindblad_maps = learner_result.to_pauli_lindblad_maps()

# Assign the learned noise maps so PEA/PEC uses them.
estimator.options.resilience.layer_noise_model = zip(layers, pauli_lindblad_maps)

# Now execute the target PUBs.
job = estimator.run(pubs)

에서 로 NoiseLearner 마이그레이션 NoiseLearnerV3

NoiseLearner Estimator.의 서버 측 구현에서만 작동합니다. 따라서, 코드에서 를 사용하여 노이즈 모델을 학습한 NoiseLearner 후 이를 에 전달하는 경우 Estimator, 코드를 수정하여 를 사용하도록 해야 합니다 NoiseLearnerV3.

자세한 내용은 가이드를 에서 로 NoiseLearner 마이그레이션 NoiseLearnerV3 참조하십시오.


업무 분할

단일 작업 내의 혼합 샷 또는 정밀도 값이 더 이상 지원되지 않아 하나의 작업을 여러 개로 분할해야 하는 경우, 다음 사항을 고려해 보십시오:

  • PUB를 목표값별로 그룹화하십시오. 즉, 각 고유한 값당 하나의 작업으로 그룹화해야 하며, 각 값당 하나의 작업으로 그룹화해서는 안 됩니다 PUB. 분할은 재편성 과정이므로, 제출하는 PUB의 총 개수는 변하지 않습니다. 예를 들어, 주어진 조건에 [[email protected], [email protected], [email protected]]따라 두 개의 작업을 제출하십시오: 는 [A, C] 에서 precision=0.01 , [B]는 에서 실행되도록 하십시오 precision=0.05. 와 A 를 별도의 작업으로 C 제출하는 것은 각 작업마다 고정된 오버헤드가 발생하기 때문에 효율성이 떨어집니다.

  • 한 번만 학습하면 모든 분할 작업에서 해당 노이즈 모델을 사용할 수 있습니다. 모든 레이어의 합집합에 대해 단일 작업을 NoiseLearnerV3 실행하는 것이 더 효율적입니다. 노이즈 러너 작업의 결과에는 객체 NoiseLearnerV3Result 목록이 포함되어 있으며, 각 입력 명령어마다 하나의 객체가 있고, 이 목록은 입력 목록과 동일한 순서로 정렬되어 있습니다. 이 노이즈 학습자 작업의 출력 결과를 모든 분할(추정기) 작업에서 사용할 수 있으며, 분할 작업의 PUB에 포함되지 않은 레이어에 대한 노이즈 모델은 무시됩니다.

  • 먼저 Batch 분할된 모든 작업을 제출한 다음, 그 결과를 수집하십시오. 실행 Batch 모드는 여러 작업이 있을 때 효율적인 병렬 실행을 제공합니다. 그러나 job.result() 는 차단성 작업이므로, 제출 루프 내에서 이를 호출하면 작업들이 순차적으로 처리되어 를 사용하는 이점이 사라집니다 Batch. 반드시 (아래에 표시된) ‘모두 제출한 후 한꺼번에 수집’ 방식을 사용해야 합니다.

다음 예시에서 와 pub1 는 를 pub2 필요로 하는 반면 precision=0.5, 는 를 필요로 pub3 합니다 precision=0.1:

group1_pubs = [pub1, pub2]
group2_pubs = [pub3]

with Batch(backend=backend) as batch:
    estimator = Estimator(mode=batch)
    estimator.options.resilience.pec_mitigation = True

    # Learn once, over the union of every job's layers.
    all_layers = estimator.find_unique_layers(group1_pubs + group2_pubs)
    learner_job = NoiseLearnerV3(mode=batch).run(all_layers)
    learner_result = learner_job.result()
    pauli_lindblad_maps = learner_result.to_pauli_lindblad_maps()

    # Assign the learned noise maps. Any layers not found in the input PUBs are ignored.
    estimator.options.resilience.layer_noise_model = zip(all_layers, pauli_lindblad_maps)

    # Submit every split job with different precision values.
    jobs = []
    jobs.append(estimator.run(group1_pubs, precision=0.5))
    jobs.append(estimator.run(group2_pubs, precision=0.1))

    # Block once, at the end — the jobs run in parallel.
    results = [job.result() for job in jobs]

작업 입력 구조

새로운 구현 방식은 Sampler 또는 Estimator의 입력값을 Executor의 입력값에 매핑하므로, Executor의 입력값을 포함하는 딕셔너리를 job.inputs 반환합니다. 이 사전에는 다음과 같은 키가 있습니다:

이전에 코드에서 작업에 지정된 옵션을 찾기 위해 job.inputs['options'] 를 사용했다면, 이제 를 대신 job.result().metadata['options'] 사용할 수 있습니다.


가짜 백엔드를 사용하여 로컬에서 테스트하기

하드웨어로 전송하기 전에, 마이그레이션된 코드를 Fake* 백엔드와 연동하여 검증함으로써 구문 오류를 조기에 발견할 수 있습니다. 로컬 테스트 모드에 관한 다음 세부 사항을 참고하십시오:

  • 하드웨어 결과를 재현하지는 않습니다. 로컬 노이즈 시뮬레이션은 실제 장치의 노이즈를 완벽하게 재현하지 못하므로, 출력 결과가 다를 수 있습니다. 실행을 통해 옵션 경로와 값 유형이 올바른지 확인할 수 있습니다.
  • NoiseLearnerV3 로컬 테스트 모드가 없습니다. 이 함수는 실수 Backend, Session, 또는 만 mode허용하므로 Batch, 가짜 백엔드를 대상으로 노이즈 학습 단계를 실행할 수 없습니다. 대신 해당 코드 부분을 API 참조NoiseLearnerV3 문서를 바탕으로 확인해 보세요. 생성자, 입력 run(instructions) 형상 및 모든 헬퍼(예: 고유 레이어 헬퍼)가 문서에 명시된 대로 사용되었는지 확인하십시오.

효율적인 로컬 시뮬레이션을 위해 회로를 클리포드화하십시오

가짜 백엔드는 상태 벡터(노이즈가 있는) 시뮬레이터를 사용하며, 이 시뮬레이터의 계산 비용은 큐비트 수와 심도에 따라 기하급수적으로 증가한다. 따라서, 현실적인 워크로드 회로는 시스템이 응답하지 않게 되거나 메모리를 모두 소진시킬 수 있다. 로컬 테스트에서는 옵션 경로를 실행해 보는 것만 필요하고(물리적 결과를 재현할 필요는 없으므로), 먼저 다음 식을 사용하여 회로를 클리포드 회로로 변환합니다 ConvertISAToClifford. 이 식은 각 RZ``RZZ//RX 각도를 π/2의 가장 가까운 배수로 반올림합니다. 클리포드 회로는 크기에 상관없이 효율적으로 시뮬레이션됩니다(안정화기 시뮬레이션).

from qiskit.transpiler import PassManager
from qiskit_ibm_runtime.transpiler.passes import ConvertISAToClifford

clifford = PassManager([ConvertISAToClifford()]).run(isa_circuit)
# run `clifford` (not the original) through the fake-backend primitive

ConvertISAToClifford 입력으로 ISA 회로가 필요합니다 (백엔드를 대상으로 하는 generate_preset_pass_manager(...).run(...) 출력). 로컬 PUB 를 생성할 때는 다음과 같은 결과를 반드시 고려해야 합니다:

  • 해당 .layout 속성이 제거됩니다. 클리포드화된 회로는 큐비트 개수는 동일하게 유지하지만None , clifford.layout 이므로 observable.apply_layout(clifford.layout) 실패한다. 대신 pre-Clifford ISA 회로에서 관측 가능한 변수를 추출해 보세요: isa_obs = observable.apply_layout(isa_circuit.layout), 그런 다음 를 실행하세요 (clifford, isa_obs).
  • 매개변수가 바인딩되었습니다. 회전 각도를 반올림하면 파라메트릭 ISA 회로가 구체적인 클리포드 회로로 변환되므로, 는 가 된다 clifford.num_parameters``0 . 여전히 매개변수 값 배열을 포함하고 있는 PUB는 형 변환에 실패합니다. 로컬 실행의 경우, PUB 에서 매개변수 배열을 제거하십시오. 하드웨어 실행에서는 원래의 매개변수 회로와 그 값이 유지됩니다.

다음 단계

이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.