Режими виконання через REST API
Ти можеш запускати свої примітивні навантаження Qiskit через REST API в одному з трьох режимів виконання, залежно від потреб: job, session та batch. Ця тема пояснює ці режими.
У цій документації використовується модуль Python requests для демонстрації REST API Qiskit Runtime. Однак цей процес можна виконати за допомогою будь-якої мови або фреймворку, що підтримує роботу з REST API. Дивись довідкову документацію API для отримання деталей.
Режим job через REST API
У режимі job виконується один примітивний запит до Estimator або Sampler без контекстного менеджера. Дивись, як запустити квантову схему за допомогою Estimator і Sampler для прикладів.
Режим session через REST API
Session — це функція Qiskit Runtime, яка дозволяє ефективно виконува ти ітеративні навантаження з кількох завдань на квантових комп'ютерах. Використання сесій допомагає уникнути затримок через окрему постановку кожного завдання в чергу, що особливо корисно для ітеративних завдань, які вимагають частої комунікації між класичними та квантовими ресурсами. Більше деталей про Session можна знайти в документації.
Користувачі плану Open не можуть надсилати завдання через 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())
Вивід
{'id': 'crw9s7cdbt40008jxesg'}
Закриття сесії
Гарна практика — закривати 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)
Вивід
Session closure response ok?: True
Режим batch через REST API
Альтернативно, ти можеш надіслати пакетне завдання, вказавши mode у тілі запиту. Режим 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']
Приклади завдань, надісланих у сесії
Після налаштування сесії одне або кілька завдань Sampler чи Estimator можна надіслати в ту саму сесію, вказавши її ID.
<parameter values> у PUB може бути як одним параметром, так і списком параметрів. Також підтримується numpy broadcasting.
Завдання Estimator у режимі session
- 1 схема, 4 спостережувані
- 1 схема, 4 спостережувані, 2 набори параметрів
- 2 схеми, 2 спостережувані
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)
},
}
}
Завдання Sampler у режимі session
- 1 схема, без параметрів
- 1 схема, 3 набори параметрів
- 2 схеми, 1 набір параметрів
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)
},
}
}
Наступні кроки
- Переглянь детальні приклади примітивів Sampler та Estimator через REST API.
- Прочитай Міграція до примітивів V2.
- Практикуйся з примітивами, працюючи над уроком про функцію вартості в IBM Quantum® Learning.
- Дізнайся, як транспілювати локально, у розділі Transpile.