Sampler через REST API
Кроки в цьому розділі описують, як запускати та налаштовувати робочі процеси за допомогою REST API, і демонструють, як викликати їх у будь-якій програмі на твій вибір.
Ця документація використовує модуль Python requests для демонстрації REST API Qiskit Runtime. Однак цей робочий процес можна виконати за допомогою будь-якої мови або фреймворку, що підтримує роботу з REST API. Деталі дивись у довідковій документації API.
1. Ініціалізація облікового запису
Оскільки Sampler від Qiskit Runtime є керованим сервісом, спочатку потрібно ініціалізувати свій обліковий запис. Після цього можна вибрати пристрій для виконання обчислень.
Деталі про ініціалізацію облікового запису, перегляд доступних 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 V2 API
Завдання нижче використовують примітиви Qiskit Runtime V2. SamplerV2 приймає один або кілька primitive unified blocs (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. Робота з опціями Qiskit Runtime
Техніки пом'якшення помилок дозволяють користувачам зменшувати помилки схем шляхом моделювання шуму пристрою на момент виконання. Зазвичай це призводить до накладних витрат квантової попередньої обробки, пов'язаних із навчанням моделі, та класичних накладних витрат постобробки для пом'якшення помилок у сирих результатах з використанням згенерованої моделі.
Техніки пом'якшення помилок, вбудовані в примітиви, є розширеними опціями стійкості. Щоб вказати ці опції, використовуй опцію 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. Ініціалізація облікового запису
Оскільки Qiskit Runtime є керованим сервісом, спочатку потрібно ініціалізувати свій обліковий запис. Після цього можна вибрати пристрій для виконання обчислень.
Деталі про ініціалізацію облікового запису, перегляд доступних 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']
Наступні кроки
- Існує кілька способів запуску робочих процесів залежно від твоїх потреб: режим завдання, режим сесії та режим пакету. Дізнайся, як працювати з режимом сесії та режимом пакету, у розділі про режими виконання. Зверни увагу, що користувачі Open Plan не можуть відправляти завдання сесії.
- Дізнайся, як ініціалізувати свій обліковий запис за допомогою REST API.
- Практикуйся з примітивами, виконуючи урок функції втрат в IBM Quantum Learning.
- Дізнайся, як транспілювати локально, у розділі Транспіляція.