Skip to main content
IBM Quantum Platform

REST API를 활용한 추정기

패키지 버전

이 페이지의 코드는 다음 요구 사항을 바탕으로 개발되었습니다. 이 버전 이상을 사용하시기를 권장합니다.

qiskit[all]~=2.3.0

이 주제의 단계에서는 REST API를 사용하여 워크로드를 실행하고 구성하는 방법을 설명하며, 원하는 프로그램에서 이를 호출하는 방법을 보여줍니다.

Note

이 문서는 REST API를 시연하기 위해 Python requests 모듈을 사용합니다. 그러나 이 워크플로는 REST API를 지원하는 모든 언어나 프레임워크를 사용하여 실행할 수 있습니다. 자세한 내용은 API 참조 문서를 참조하십시오.


1. 계정 초기화

Estimator는 관리형 서비스이므로, 먼저 계정을 초기화해야 합니다. 그런 다음 기대값을 계산하는 데 사용할 장치를 선택할 수 있습니다.

주제에서 계정 초기화 방법, 사용 가능한 백엔드 확인 방법, 토큰 무효화 방법에 대한 자세한 내용을 확인하세요.


2. QASM 회로 만들기

Estimator 프리미티브의 입력으로 최소한 하나의 회로가 필요합니다.

QASM 양자 회로를 정의하시오. 예를 들어,

qasm_string='''
OPENQASM 3;
include "stdgates.inc";
qreg q[2];
creg c[2];
x q[0];
cx q[0], q[1];
c[0] = measure q[0];
c[1] = measure q[1];
'''

다음 코드 조각은 가 새로운 qasm_string 문자열 로 resulting_qasm변환되었다고 가정합니다.


3. Estimator V2 API를 사용하여 양자 회로를 실행합니다

Note

다음 작업들은 IBM Quantum V2 기본 기능을 사용합니다. 와 SamplerV2 모두 하나 이상의 기본 통합 블록(PUB)을 입력으로 EstimatorV2 받습니다. 각 PUB는 하나의 회로와 해당 회로에 브로드캐스트된 데이터(여러 관측 가능 변수 및 매개변수로 구성될 수 있음)를 포함하는 튜플입니다. 각 PUB 는 결과를 반환합니다.

import requests

url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "<BACKEND_NAME>"

headers = {
    'Content-Type': 'application/json',
    'Authorization':auth_id,
    'Service-CRN': crn
    }

job_input = {
    'program_id': 'estimator',
    "backend": backend,
    "params": {
        "pubs": [ #primitive unified blocs (PUBs) containing one circuit each.
            [resulting_qasm, # QASM circuit
             {"IIZII": 1, "XIZZZ": 2.3}, # Observable
             None # parameter values
             ]]
}}

response = requests.post(url, headers=headers, json=job_input)

if response.status_code == 200:
    job_id = response.json().get('id')
    print("Job created:",response.text)
else:
    print(f"Error: {response.status_code}")

4. 작업 상태 확인 및 결과 확인

다음으로, 를 job_id API에 전달합니다:

response_status_singlejob= requests.get(url+'/'+job_id, headers=headers)
response_status_singlejob.json().get('state')

출력

>>> Job ID: 58223448-5100-4dec-a47a-942fb30edcad
>>> Job Status: JobStatus.RUNNING

채용 결과 보기:

response_result= requests.get(url+'/'+job_id+'/results', headers=headers)

res_dict=response_result.json()

estimator_result=res_dict['results']
print(estimator_result)

출력

[{'data': {'evs': 0.7428980350102542, 'stds': 0.029884014518789213, 'ensemble_standard_error': 0.03261147170624149}, 'metadata': {'shots': 10016, 'target_precision': 0.01, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}}]

5. 옵션 활용하기

오류 완화 기법은 사용자가 실행 시점에 장치 노이즈를 모델링함으로써 회로 오류를 완화할 수 있게 해줍니다. 이는 일반적으로 모델 훈련과 관련된 양자 전처리 오버헤드와, 생성된 모델을 사용하여 원시 결과의 오류를 보정하기 위한 고전적 후처리 오버헤드를 초래합니다.

프라이머리트에 내장된 오류 완화 기법은 고급 복원력 옵션입니다. 이러한 옵션을 지정하려면 작업을 제출할 때 옵션을 resilience_level 사용하십시오.

다음 예제는 동적 디커플링, 트위링, TREX + ZNE의 기본 옵션을 보여줍니다. 자세한 내용과 추가 옵션은 ‘오류 완화 및 억제 기법’ 항목에서 확인하세요.

TREX + ZNE

import requests

url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "BACKEND_NAME"

headers = {
    'Content-Type': 'application/json',
    'Authorization':auth_id,
    'Service-CRN': crn
    }
job_input = {
    'program_id': 'estimator',
    "backend": backend,
    "params": {
        "pubs": [ #primitive unified blocs (PUBs) containing one circuit each
            [resulting_qasm, # QASM circuit
             {"IIZII": 1, "XIZZZ": 2.3}, # Observable
             None # parameter values
             ]]
        "options": {
            "resilience": {
              "measure_mitigation": True,
              "zne_mitigation": True,
              "zne": {
                  "extrapolator":["exponential", "linear"],
                  "noise_factors":[1, 3, 5],
              },
          },
        },
    }
}

response = requests.post(url, headers=headers, json=job_input)

if response.status_code == 200:
    job_id = response.json().get('id')
    print("Job created:",response.text)
else:
    print(f"Error: {response.status_code}")

동적 분리

import requests

url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "BACKEND_NAME"

headers = {
    'Content-Type': 'application/json',
    'Authorization':auth_id,
    'Service-CRN': crn
    }
job_input = {
    'program_id': 'estimator',
    "backend": backend,
    "params": {
        "pubs": [ #primitive unified blocs (PUBs) containing one circuit each
            [resulting_qasm, # QASM circuit
             {"IIZII": 1, "XIZZZ": 2.3}, # Observable
             None # parameter values
             ]]
        "options": {
            "dynamical_decoupling": {
                "enable": True,
                "sequence_type": 'XpXm',
                "extra_slack_distribution": 'middle',
                "scheduling_method": 'alap',
            },
        },
    }
}

response = requests.post(url, headers=headers, json=job_input)

if response.status_code == 200:
    job_id = response.json().get('id')
    print("Job created:",response.text)
else:
    print(f"Error: {response.status_code}")

빙글빙글 돌다

import requests

url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "BACKEND_NAME"

headers = {
    'Content-Type': 'application/json',
    'Authorization':auth_id,
    'Service-CRN': crn
    }
job_input = {
    'program_id': 'estimator',
    "backend": backend,
    "params": {
        "pubs": [ #primitive unified blocs (PUBs) containing one circuit each
            [resulting_qasm, # QASM circuit
             {"IIZII": 1, "XIZZZ": 2.3}, # Observable
             None # parameter values
             ]]
        "options": {
            "twirling": {
                "enable_gates": True,
                "enable_measure": True,
                "num_randomizations": "auto",
                "shots_per_randomization": "auto",
                "strategy": "active-accum",
                },
        },
    }
}

response = requests.post(url, headers=headers, json=job_input)

if response.status_code == 200:
    job_id = response.json().get('id')
    print("Job created:",response.text)
else:
    print(f"Error: {response.status_code}")

매개변수화 회로

1. 계정 초기화

먼저 계정을 초기화해야 합니다. 그런 다음 계산을 수행할 기기를 선택할 수 있습니다.

주제에서 계정 초기화 방법, 사용 가능한 백엔드 확인 방법, 토큰 무효화 방법에 대한 자세한 내용을 확인하세요.

2. 매개변수 정의

import requests
import qiskit_ibm_runtime
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.qasm3 import dumps
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit import transpile

service = QiskitRuntimeService(channel='ibm_quantum')
backend = service.backend("<SPECIFY BACKEND>")

pm = generate_preset_pass_manager(backend=backend, optimization_level=1)

theta = Parameter('theta')
phi = Parameter('phi')
parameter_values = {'theta': 1.57, 'phi': 3.14}   # In case we want to pass a dictionary

3. 양자 회로를 생성하고 매개변수화된 게이트를 추가합니다

qc = QuantumCircuit(2)

# Add parameterized gates
qc.rx(theta, 0)
qc.ry(phi, 1)
qc.cx(0, 1)
qc.measure_all()

# Draw the original circuit
qc.draw('mpl')

# Get an ISA circuit
isa_circuit = pm.run(qc)

4. QASM 3 코드 생성

qasm_str = dumps(isa_circuit)
print("Generated QASM 3 code:")
print(qasm_str)

5. Estimator V2 API를 사용하여 양자 회로를 실행합니다

import requests

url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "<BACKEND_NAME>"

headers = {
    'Content-Type': 'application/json',
    'Authorization':auth_id,
    'Service-CRN': crn
    }

job_input = {
    'program_id': 'estimator',
    "backend": backend,
    "params": {
        # Choose one option: direct parameter transfer or through a dictionary
        #"pubs": [[qasm_str,[1,2],500]], # primitive unified blocs (PUBs) containing one circuit each.
        "pubs": [[qasm_str,parameter_values,500]], # primitive unified blocs (PUBs) containing one circuit each.
}}

response = requests.post(url, headers=headers, json=job_input)

if response.status_code == 200:
    job_id = response.json().get('id')
    print(f"Job created: {response.text}")
else:
    print(f"Error: {response.status_code}")
print(response.text)

6. 작업 상태 확인 및 결과 확인

다음으로, 를 job_id API에 전달합니다:

response_status_singlejob = requests.get(f"{url}/{job_id}", headers=headers)
response_status_singlejob.json().get('state')

출력

{'status': 'Completed'}

채용 결과 보기:

response_result = requests.get(f"{url}/{job_id}/results", headers=headers)

res_dict=response_result.json()

# Get results for the first PUB
counts=res_dict['results'][0]['data']['c']['samples']

print(counts[:20])

출력

['0x1', '0x2', '0x1', '0x2', '0x1', '0x2', '0x0', '0x2', '0x1', '0x1', '0x2', '0x2', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1']

다음 단계

권장사항
  • 요구에 따라 워크로드를 실행하는 방법에는 작업 모드, 세션 모드, 배치 모드 등 여러 가지가 있습니다. ‘실행 모드 ’ 항목에서 세션 모드와 일괄 처리 모드를 사용하는 방법을 알아보세요. Open Plan 사용자는 세션 작업을 제출할 수 없음을 유의하시기 바랍니다.
  • REST API를 사용하여 계정을 초기화하는 방법을 알아보세요.
  • IBM Quantum® Learning 의 ‘Cost’ 함수 강의를 따라가며 기본형(primitives)을 연습해 보세요.
  • ‘트랜스파일’ 섹션에서 로컬 환경에서 트랜스파일하는 방법을 알아보세요.
이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.