Kalkulationsmodul mit der REST-API
Paketversionen
Der Code auf dieser Seite wurde unter Berücksichtigung der folgenden Anforderungen entwickelt. Wir empfehlen, diese Versionen oder neuere zu verwenden.
qiskit[all]~=2.3.0
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 zu veranschaulichen. Dieser Workflow kann jedoch mit jeder Sprache oder jedem Framework ausgeführt werden, die bzw. das die Arbeit mit REST-APIs unterstützt. Weitere Informationen finden Sie in der API-Referenzdokumentation.
1. Konto einrichten
Da es sich bei Estimator um einen Managed Service handelt, müssen Sie zunächst Ihr Konto einrichten. Anschließend können Sie das Gerät auswählen, das Sie zur Berechnung des Erwartungswerts verwenden möchten.
In diesem Abschnitt erfahren Sie, wie Sie Ihr Konto einrichten, verfügbare Backends anzeigen und Tokens ungültig machen können.
2. Erstellen Sie eine QASM-Schaltung
Sie benötigen mindestens einen Schaltkreis als Eingabe für die Estimator-Primitive.
Definieren Sie einen QASM-Quantenschaltkreis. Zum Beispiel:
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 Quantenschaltkreis mithilfe der Estimator- V2 -API aus
Die folgenden Jobs verwenden die Primitive „ IBM Quantum “ und „ V2 “. Sowohl SamplerV2 als auch EstimatorV2 nehmen einen oder mehrere primitive vereinheitlichte Blöcke (PUBs) als Eingabe entgegen. Jedes „ PUB “ ist ein Tupel, das einen Schaltkreis und die an diesen Schaltkreis übertragenen Daten enthält; dabei kann es sich um mehrere Observables und Parameter handeln. Jeder Aufruf von PUB liefert 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': 'estimator',
"backend": backend,
"params": {
"pubs": [ #primitive unified blocs (PUBs) containing one circuit each.
[resulting_qasm, # QASM circuit
{"IIZII": 1, "XIZZZ": 2.3}, # Observable
None # parameter values
]]
}}
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-942fb30edcad
>>> Job Status: JobStatus.RUNNINGErgebnisse anzeigen:
response_result= requests.get(url+'/'+job_id+'/results', headers=headers)
res_dict=response_result.json()
estimator_result=res_dict['results']
print(estimator_result)Ausgabe
[{'data': {'evs': 0.7428980350102542, 'stds': 0.029884014518789213, 'ensemble_standard_error': 0.03261147170624149}, 'metadata': {'shots': 10016, 'target_precision': 0.01, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}}]5. Mit Optionen arbeiten
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.
Die folgenden Beispiele veranschaulichen die Standardoptionen für dynamische Entkopplung, Twirling und TREX + ZNE. Weitere Optionen und Details finden Sie im Abschnitt „Techniken zur Fehlerminderung und -unterdrückung “.
TREX + ZNE
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': 'estimator',
"backend": backend,
"params": {
"pubs": [ #primitive unified blocs (PUBs) containing one circuit each
[resulting_qasm, # QASM circuit
{"IIZII": 1, "XIZZZ": 2.3}, # Observable
None # parameter values
]]
"options": {
"resilience": {
"measure_mitigation": True,
"zne_mitigation": True,
"zne": {
"extrapolator":["exponential", "linear"],
"noise_factors":[1, 3, 5],
},
},
},
}
}
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}")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': 'estimator',
"backend": backend,
"params": {
"pubs": [ #primitive unified blocs (PUBs) containing one circuit each
[resulting_qasm, # QASM circuit
{"IIZII": 1, "XIZZZ": 2.3}, # Observable
None # parameter values
]]
"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': 'estimator',
"backend": backend,
"params": {
"pubs": [ #primitive unified blocs (PUBs) containing one circuit each
[resulting_qasm, # QASM circuit
{"IIZII": 1, "XIZZZ": 2.3}, # Observable
None # parameter values
]]
"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')
parameter_values = {'theta': 1.57, 'phi': 3.14} # In case we want to pass a dictionary3. 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 Quantenschaltkreis mithilfe der Estimator- V2 -API 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': 'estimator',
"backend": backend,
"params": {
# Choose one option: direct parameter transfer or through a dictionary
#"pubs": [[qasm_str,[1,2],500]], # primitive unified blocs (PUBs) containing one circuit each.
"pubs": [[qasm_str,parameter_values,500]], # primitive unified blocs (PUBs) containing one circuit each.
}}
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.