Перейти до основного вмісту
Цей проєкт у бета-версії. Знайшов(-ла) помилку? Відкрити issue на GitHub. Є запитання чи ідея? Запитати в Discussions — будемо раді твоєму відгуку!
Яка якість перекладу на цій сторінці?

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']

Наступні кроки​

Рекомендації