Skip to main content
IBM Quantum Platform

REST API를 활용한 샘플러

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

Note

이 문서는 Python requests 모듈을 사용하여 IBM Quantum Compute 서비스의 REST API를 설명합니다. 그러나 이 워크플로는 REST API 처리를 지원하는 모든 언어나 프레임워크를 사용하여 실행할 수 있습니다. 자세한 내용은 API 참조 문서를 참조하십시오.


1. 계정 초기화

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

‘REST API를 통해 IBM Quantum Platform 사용 설정’ 섹션에서 계정 초기화 방법, 사용 가능한 백엔드 확인 방법 및 토큰 사용 방법에 대한 자세한 내용을 확인하세요.


2. QASM 회로 만들기

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

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. Sampler V2 API를 사용하여 양자 회로를 실행합니다

Note

아래의 작업들은 IBM Quantum V2 의 기본 기능을 사용합니다. SamplerV2 하나 이상의 기본 통합 블록(PUB)을 입력으로 받습니다. 각 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': 'sampler',
    "backend": backend,
    "params": {
        # primitive unified blocs (PUBs) containing one circuit each:
        "pubs": [[resulting_qasm],[resulting_qasm,None,500]] 
}}

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-942fb30edced
>>> Job Status: JobStatus.RUNNING

채용 결과 보기:

response_result= requests.get(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])

출력

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

5. IBM Quantum 컴퓨트 서비스 옵션 활용하기

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

프라이머리트에 내장된 오류 완화 기법은 고급 복원력 옵션입니다. 이러한 옵션을 지정하려면 작업을 제출할 때 옵션을 resilience_level 사용하십시오. V2 샘플러는 복원력 수준 지정을 지원하지 않습니다. 하지만 개별 오류 완화/억제 기능을 켜거나 끌 수 있습니다.

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

동적 분리

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': 'sampler',
    "backend": backend,
    "params": {
        # primitive unified blocs (PUBs) containing one circuit each:
        "pubs": [[resulting_qasm]], 
        "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': 'sampler',
    "backend": backend,
    "params": {
        # primitive unified blocs (PUBs) containing one circuit each:
        "pubs": [[resulting_qasm]], 
        "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')
# In case we want to pass a dictionary:
parameter_values = {'theta': 1.57, 'phi': 3.14}   

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. Sampler 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': 'sampler',
    "backend": backend,
    "params": {
        # Choose one option: direct parameter transfer or through a dictionary
        # # primitive unified blocs (PUBs) containing one circuit each:
        #"pubs": [[qasm_str,[1,2],500]], 

        # primitive unified blocs (PUBs) containing one circuit each:
        "pubs": [[qasm_str,parameter_values,500]], 
}}

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에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.