Sampler через REST API
Кроки в цьому розділі описують, як запускати та налаштовувати робочі навантаження за допомогою REST API, і демонструють, як викликати їх у будь-якій програмі на твій вибір.
Ця документація використовує модуль Python requests для демонстрації IBM Quantum Compute Service REST API. Однак цей робочий процес можна виконати за допомогою будь-якої мови або фреймворку, що підтримує роботу з REST API. Деталі дивись у довідковій документації API.
1. Ініціалізація облікового запису
Спочатку потрібно ініціалізувати свій обліковий запис. Після цього можна вибрати пристрій для виконання обчислень.
Деталі про ініціалізацію облікового запису, перегляд доступних backend і роботу з токенами дивись у розділі Налаштування для використання IBM Quantum Platform з REST API.
2. Створення схеми QASM
Для примітива Sampler потрібна принаймні одна схема як вхідні дані.
Визнач квантову схему 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 API
Завдання нижче використовують примітиви IBM Quantum. Sampler приймає один або кілька primitive unified blocs (PUB) як вхідні дані. Кожен PUB — це кортеж, що містить одну схему та дані, що транслюються (broadcast) на цю схему, які можуть включати кілька параметрів, і повертає один результат на 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 Compute Service
Техніки пом'якшення помилок дозволяють користувачам зменшувати помилки схем шляхом моделювання шуму пристрою на момент виконання. Зазвичай це призводить до накладних витрат квантової попередньої обробки, пов'язаних із навчанням моделі, та класичних накладних витрат постобробки для пом'якшення помилок у сирих результатах з використанням згенерованої моделі.
Техніки пом'якшення помилок, вбудовані в примітиви, є розширеними опціями стійкості. Щоб вказати ці опції, використовуй опцію resilience_level під час відправки завдання.
Sampler V2 не підтримує вказання рівнів стійкості. Однак можна вмикати або вимикати окремі методи пом'якшення та придушення помилок.
Наступні приклади демонструють параметри за замовчуванням для динамічного роз'єднання та twirling. Більше опцій та подробиці дивись у розділі Техніки пом'якшення та придушення помилок.
Динамічне роз'єднання
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}")
Twirling
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. Ініціалізація облікового запису
Спочатку потрібно ініціалізувати свій обліковий запис. Після цього можна вибрати пристрій для виконання обчислень.
Деталі про ініціалізацію облікового запису, перегляд доступних backend та анулювання токенів дивись у цьому розділі.
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']
Наступні кроки
- Існує кілька способів запуску робочих навантажень залежно від твоїх потреб: job mode, session mode та batch mode. Дізнайся, як працювати з session mode та batch mode, у розділі про режими виконання. Зверни увагу, що користувачі Open Plan не можуть відправляти завдання сесії.
- Дізнайся, як ініціалізувати свій обліковий запис за допомогою REST API.
- Практикуйся з примітивами, пройшовши урок про функції вартості в IBM Quantum Learning.
- Дізнайся, як транспілювати локально, у розділі Транспіляція.