REST API를 사용한 실행 모드
필요에 따라 job, session, batch의 세 가지 실행 모드 중 하나를 사용하여 REST API로 Qiskit 프리미티브 워크로드를 실행할 수 있습니다. 이 주제에서는 이러한 모드들을 설명합니다.
이 문서는 Qiskit Runtime REST API를 시연하기 위해 Python requests 모듈을 활용합니다. 그러나 이 워크플로는 REST API 작업 을 지원하는 모든 언어나 프레임워크를 사용하여 실행할 수 있습니다. 자세한 내용은 API 참조 문서를 참고하세요.
REST API를 사용한 Job 모드
Job 모드에서는 컨텍스트 매니저 없이 Estimator 또는 Sampler의 단일 프리미티브 요청이 이루어집니다. 몇 가지 예시를 보려면 Estimator와 Sampler를 사용하여 양자 Circuit을 실행하는 방법을 참고하세요.
REST API를 사용한 Session 모드
Session은 양자 컴퓨터에서 다중 작업 반복 워크로드를 효율적으로 실행할 수 있도록 하는 Qiskit Runtime 기능입니다. Session을 사용하면 각 작업을 별도로 큐에 넣어 발생하는 지연을 방지할 수 있으며, 이는 클래식 리소스와 양자 리소스 간의 빈번한 통신이 필요한 반복 작업에 특히 유용합니다. Session에 대한 자세한 내용은 문서에서 확인할 수 있습니다.
Open Plan 사용자는 session 작업을 제출할 수 없습니다.
Session 시작
Session을 생성하고 session ID를 획득하는 것으로 시작합니다.
import json
import requests
sessionsUrl = "https://quantum.cloud.ibm.com/api/v1/sessions"
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
backend = "<BACKEND_NAME>"
crn = "<SERVICE-CRN>"
headersList = {
"Accept": "application/json",
"Content-Type": "application/json",
"Authorization": auth_id,
"Service-CRN": crn
}
payload = json.dumps({
"backend": backend,
"mode": 'dedicated',
})
response = requests.request("POST", sessionsUrl, data=payload, headers=headersList)
sessionId = response.json()['id']
print(response.json())
Output
{'id': 'crw9s7cdbt40008jxesg'}
Session 종료
모든 작업이 완료되면 Session을 종료하는 것이 좋은 관행입니다. 이렇게 하면 이후 사용자들의 대기 시간이 줄어듭니다.
closureURL="https://quantum.cloud.ibm.com/api/v1/sessions/"+sessionId+"/close"
headersList = {
"Accept": "application/json",
"Authorization": auth_id,
"Service-CRN": crn
}
closure_response = requests.request(
"DELETE",
closureURL,
headers=headersList
)
print("Session closure response ok?:",closure_response.ok,closure_response.text)
Output
Session closure response ok?: True
REST API를 사용한 Batch 모드
또는 요청 페이로드에서 mode를 지정하여 batch 작업을 제출할 수 있습니다. Batch 모드는 모든 작업을 처음부터 제공할 수 있는 경우 처리 시간을 단축하는 데 도움이 될 수 있습니다. 실행 모드 소개 가이드에서 batch 모드에 대해 자세히 알아보세요.
import json
import requests
sessionsUrl = "https://quantum.cloud.ibm.com/api/v1/sessions"
headersList = {
"Accept": "application/json",
"Authorization": auth_id,
"Service-CRN": crn,
'Content-Type': 'application/json'
}
payload = json.dumps({
"backend": backend,
"instance": "hub1/group1/project1",
"mode": "batch"
})
response = requests.request("POST", sessionsUrl, data=payload, headers=headersList)
sessionId = response.json()['id']
Session에서 제출된 작업 예시
Session이 설정되면 session ID를 지정하여 하나 이상의 Sampler 또는 Estimator 작업을 동일한 session에 제출할 수 있습니다.
PUB의 <parameter values>는 단일 매개변수 또는 매개변수 목록일 수 있습니다. 또한 numpy 브로드캐스팅도 지원합니다.
Session 모드에서의 Estimator 작업
- 1 circuit, 4 observables
- 1 circuit, 4 observables, 2 parameter sets
- 2 circuits, 2 observables
job_input = {
'program_id': 'estimator',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm, [obs1, obs2, obs3, obs4]]], #primitive unified blocs (PUBs) containing one circuit each.
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
job_input = {
'program_id': 'estimator',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm, [[obs1], [obs2], [obs3], [obs4]], [[vals1], [vals2]]]], #primitive unified blocs (PUBs) containing one circuit each
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
job_input = {
'program_id': 'estimator',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm, obs1],[resulting_qasm, obs2]], #primitive unified blocs (PUBs) containing one circuit each
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
Session 모드에서의 Sampler 작업
- 1 circuit, no parameters
- 1 circuit, 3 parameter sets
- 2 circuits, 1 parameter set
job_input = {
'program_id': 'sampler',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm]], #primitive unified blocs (PUBs) containing one circuit each
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
job_input = {
'program_id': 'sampler',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm, [vals1, vals2, vals3]]], #primitive unified blocs (PUBs) containing one circuit each
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
job_input = {
'program_id': 'sampler',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm, [val1]],[resulting_qasm,None,100]], #primitive unified blocs (PUBs) containing one circuit each
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
다음 단계
- REST API를 사용한 Sampler 및 Estimator 프리미티브 예시를 자세히 검토하세요.
- V2 프리미티브로 마이그레이션을 읽어보세요.
- IBM Quantum® Learning의 비용 함수 학습을 통해 프리미티브를 연습하세요.
- Transpile 섹션에서 로컬로 트랜스파일하는 방법을 알아보세요.