Přeskočit na hlavní obsah

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.

poznámka

Tato dokumentace využívá modul Python requests k demonstraci Qiskit Runtime 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

Protože Qiskit Runtime Sampler je spravovaná služba, musíš nejprve 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

poznámka

Úlohy níže používají primitiva Qiskit Runtime V2. SamplerV2 přijímá jeden nebo více primitive unified bloků (PUB) jako vstup. Každý PUB je n-tice, která obsahuje jeden obvod a data broadcastovaná do tohoto obvod, což může být více parametrů, 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 Qiskit Runtime

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

Protože Qiskit Runtime je spravovaná služba, musíš nejprve 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

Doporučení
  • 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.