Beispiel für die REST-API
Die Schritte in diesem Abschnitt beschreiben, wie Sie Workloads über die REST-API ausführen und konfigurieren, und zeigen, wie Sie diese in einem Programm Ihrer Wahl aufrufen können.
In dieser Dokumentation wird das Modul requests „ Python “ verwendet, um die REST-API des „ IBM Quantum Compute “-Dienstes zu veranschaulichen. Dieser Workflow kann jedoch mit jeder Sprache oder jedem Framework ausgeführt werden, das die Arbeit mit REST-APIs unterstützt. Weitere Informationen finden Sie in der API-Referenzdokumentation.
1. Konto einrichten
Zunächst müssen Sie Ihr Konto einrichten. Anschließend können Sie das Gerät auswählen, auf dem Sie Ihre Berechnungen durchführen möchten.
Weitere Informationen zur Einrichtung Ihres Kontos, zur Anzeige der verfügbaren Backends und zur Verwendung von Tokens finden Sie unter „ IBM Quantum Platform mit der REST-API einrichten“.
2. Erstellen Sie eine QASM-Schaltung
Du benötigst mindestens einen Schaltkreis als Eingang für die Sampler-Primitive.
Definieren Sie einen QASM-Quantenschaltkreis:
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];
'''Die folgenden Codeausschnitte gehen davon aus, dass in eine neue qasm_string Zeichenkette transpiliert resulting_qasm wurde.
3. Führen Sie den Quanten-Schaltkreis mithilfe der Sampler-API von V2 aus
Die folgenden Jobs verwenden die Primitive „ IBM Quantum “ und „ V2 “. SamplerV2 nimmt einen oder mehrere primitive Unified Blocs (PUBs) als Eingabe entgegen. Jedes „ PUB “ ist ein Tupel, das einen Schaltkreis und die an diesen Schaltkreis gesendeten Daten enthält – wobei es sich um mehrere Parameter handeln kann – und gibt pro „ PUB “ ein Ergebnis zurück.
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. Auftragsstatus prüfen und Ergebnisse abrufen
Geben Sie anschließend die job_id an die API weiter:
response_status_singlejob= requests.get(url+'/'+job_id, headers=headers)
response_status_singlejob.json().get('state')Ausgabe
>>> Job ID: 58223448-5100-4dec-a47a-942fb30edced
>>> Job Status: JobStatus.RUNNINGErgebnisse anzeigen:
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])Ausgabe
['0x3', '0x0', '0x2', '0x1', '0x0', '0x3', '0x0', '0x3', '0x1', '0x2', '0x2', '0x0', '0x2', '0x0', '0x3', '0x3', '0x2', '0x0', '0x1', '0x0']5. Arbeiten mit den Optionen des „ IBM Quantum “-Compute-Dienstes
Mithilfe von Techniken zur Fehlerminderung können Benutzer Schaltungsfehler minimieren, indem sie das Rauschen des Bausteins zum Zeitpunkt der Ausführung modellieren. Dies führt in der Regel zu einem Aufwandsaufwand bei der Quantenvorverarbeitung im Zusammenhang mit dem Modelltraining sowie zu einem Aufwandsaufwand bei der klassischen Nachbearbeitung, um Fehler in den Rohdaten mithilfe des generierten Modells zu beheben.
Die in die Primitive integrierten Techniken zur Fehlerminderung stellen erweiterte Optionen zur Ausfallsicherheit dar. Um diese Optionen festzulegen, verwenden Sie bei der Übermittlung Ihres Auftrags die resilience_level Option.
Der Sampler „ V2 “ unterstützt keine Festlegung von Ausfallsicherheitsstufen. Sie können jedoch einzelne Methoden zur Fehlerminderung bzw. -unterdrückung aktivieren oder deaktivieren.
Die folgenden Beispiele veranschaulichen die Standardoptionen für dynamische Entkopplung und Twirling. Weitere Optionen und Details finden Sie im Abschnitt „Techniken zur Fehlerminderung und -unterdrückung “.
Dynamische Entkopplung
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}")Wirbeln
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}")Parametrisierte Schaltungen
1. Konto einrichten
Zunächst müssen Sie Ihr Konto einrichten. Anschließend können Sie das Gerät auswählen, auf dem Sie Ihre Berechnungen durchführen möchten.
In diesem Abschnitt erfahren Sie, wie Sie Ihr Konto einrichten, verfügbare Backends anzeigen und Tokens ungültig machen können.
2. Parameter festlegen
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. Erstellen Sie einen Quantenschaltkreis und fügen Sie parametrisierte Gatter hinzu
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-Code generieren
qasm_str = dumps(isa_circuit)
print("Generated QASM 3 code:")
print(qasm_str)5. Führen Sie den Quanten-Schaltkreis mithilfe der Sampler-API unter V2 aus
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. Auftragsstatus prüfen und Ergebnisse abrufen
Geben Sie anschließend die job_id an die API weiter:
response_status_singlejob = requests.get(f"{url}/{job_id}", headers=headers)
response_status_singlejob.json().get('state')Ausgabe
{'status': 'Completed'}Ergebnisse anzeigen:
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])Ausgabe
['0x1', '0x2', '0x1', '0x2', '0x1', '0x2', '0x0', '0x2', '0x1', '0x1', '0x2', '0x2', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1']Nächste Schritte
- Je nach Ihren Anforderungen gibt es verschiedene Möglichkeiten, Workloads auszuführen: im Job-Modus, im Sitzungsmodus und im Batch-Modus. Erfahren Sie im Abschnitt „Ausführungsmodi“, wie Sie mit dem Sitzungsmodus und dem Batch-Modus arbeiten. Bitte beachten Sie, dass Nutzer von Open Plan keine Sitzungsaufträge übermitteln können.
- Erfahren Sie, wie Sie Ihr Konto über die REST-API einrichten.
- Üben Sie den Umgang mit Primitiven, indem Sie die Lektion zur Cost-Funktion unter IBM Quantum Learning durcharbeiten.
- Im Abschnitt „Transpile“ erfahren Sie, wie Sie lokal transpilieren können.