Sampler s REST API
Kroky v tomto tématu popisují, jak spouštět a konfigurovat workloady s REST API, a demonstrují, jak je vyvolat v libovolném programu dle tvého výběru.
Tata dokumentace využívá Python modul requests k demonstraci IBM Quantum Compute Service REST API. Tento pracovní postup však lze provést pomocí libovolného jazyka nebo frameworku, který podporuje práci s REST API. Podrobnosti najdeš v referenční dokumentaci API.
1. Inicializace účtu
Nejprve musíš inicializovat svůj účet. Poté můžeš vybrat zařízení, na kterém chceš provádět své výpočty.
Podrobnosti o tom, jak inicializovat svůj účet, prohlížet dostupné Backendy a pracovat s tokeny, najdeš v části Nastavení pro použití IBM Quantum Platform s REST API.
2. Vytvoření QASM Circuit
Jako vstup do primitivu Sampler potřebuješ alespoň jeden obvod.
Definuj QASM kvantový Circuit:
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];
'''
Úryvky kódu níže předpokládají, že qasm_string byl transpilován do nového řetězce resulting_qasm.
3. Spuštění kvantového obvodu pomocí Sampler V2 API
Úlohy níže používají IBM Quantum V2 primitiva. SamplerV2 přijímá jeden nebo více primitive unified bloků (PUBs) jako vstup. Každý PUB je tuple, který obsahuje jeden obvod a data broadcastovaná do tohoto obvodu, která mohou být různé parametry, a vrací jeden výsledek na 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. Kontrola stavu úlohy a získání výsledků
Dále předej job_id API:
response_status_singlejob= requests.get(url+'/'+job_id, headers=headers)
response_status_singlejob.json().get('state')
Výstup
>>> Job ID: 58223448-5100-4dec-a47a-942fb30edced
>>> Job Status: JobStatus.RUNNING
Získej výsledky úlohy:
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])
Výstup
['0x3', '0x0', '0x2', '0x1', '0x0', '0x3', '0x0', '0x3', '0x1', '0x2', '0x2', '0x0', '0x2', '0x0', '0x3', '0x3', '0x2', '0x0', '0x1', '0x0']
5. Práce s možnostmi IBM Quantum Compute Service
Techniky zmírňování chyb umožňují uživatelům zmírnit chyby obvodů modelováním šumu zařízení v době spouštění. To obvykle vede k režii předběžného zpracování kvantových dat při tréninku modelu a režii klasického post-processingu pro zmírnění chyb v nezpracovaných výsledcích pomocí vygenerovaného modelu.
Techniky zmírňování chyb zabudované do primitivů jsou pokročilé možnosti odolnosti. Chceš-li tyto možnosti zadat, použij možnost resilience_level při odesílání své úlohy.
Sampler V2 nepodporuje zadávání úrovní odolnosti. Můžeš však zapnout nebo vypnout jednotlivé metody zmírňování/potlačování chyb.
Následující příklady demonstrují výchozí možnosti pro dynamické odpřahování a twirling. Více možností a další podrobnosti najdeš v tématu Techniky zmírňování a potlačování chyb.
Dynamické odpřahování
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}")
Parametrizované obvody
1. Inicializace účtu
Nejprve musíš inicializovat svůj účet. Poté můžeš vybrat zařízení, na kterém chceš provádět své výpočty.
Podrobnosti o tom, jak inicializovat svůj účet, prohlížet dostupné Backendy a zneplatnit tokeny, najdeš v tomto tématu.
2. Definování parametrů
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. Vytvoření kvantového obvodu a přidání parametrizovaných Gate
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. Generování kódu QASM 3
qasm_str = dumps(isa_circuit)
print("Generated QASM 3 code:")
print(qasm_str)
5. Spuštění kvantového obvodu pomocí 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. Kontrola stavu úlohy a získání výsledků
Dále předej job_id API:
response_status_singlejob = requests.get(f"{url}/{job_id}", headers=headers)
response_status_singlejob.json().get('state')
Výstup
{'status': 'Completed'}
Získej výsledky úlohy:
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])
Výstup
['0x1', '0x2', '0x1', '0x2', '0x1', '0x2', '0x0', '0x2', '0x1', '0x1', '0x2', '0x2', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1']
Další kroky
- Existuje několik způsobů spouštění workloadů v závislosti na tvých potřebách: režim úlohy, režim Session a dávkový režim. Jak pracovat s režimem Session a dávkovým režimem se dozvíš v tématu režimů spouštění. Upozorňujeme, že uživatelé Open Planu nemohou odesílat úlohy Session.
- Nauč se, jak inicializovat svůj účet pomocí REST API.
- Procvič si práci s primitivy pomocí lekce o nákladových funkcích v IBM Quantum Learning.
- Nauč se, jak transpilovat lokálně v sekci Transpilace.