Ausführungsmodi mit REST-API
Package versions
Der Code auf dieser Seite wurde mit den folgenden Anforderungen entwickelt. Wir empfehlen die Verwendung dieser oder neuerer Versionen.
qiskit[all]~=2.3.0
Du kannst deine IBM Quantum-Primitive-Workloads über REST-APIs in einem von drei Ausführungsmodi ausführen, je nach deinen Anforderungen: Job, Session und Batch. Dieses Thema erklärt diese Modi.
Diese Dokumentation verwendet das Python-Modul requests, um die IBM Quantum Compute Service REST API zu demonstrieren. Dieser Workflow kann jedoch mit jeder Sprache oder jedem Framework ausgeführt werden, das die Arbeit mit REST APIs unterstützt. Weitere Details findest du in der API-Referenzdokumentation.
Job mode mit REST-API
In job mode wird eine einzelne Primitiv-Anfrage des Estimator oder des Sampler ohne Context Manager gestellt. Beispiele für die Ausführung einer Quantenschaltung mit Estimator und Sampler findest du hier.
Session mode mit REST-API
Eine Session ist eine Funktion, mit der du iterative Workloads aus mehreren Jobs effizient auf Quantencomputern ausführen kannst. Die Verwendung von Sessions hilft, Verzögerungen zu vermeiden, die durch das separate Einreihen jedes Jobs verursacht werden, was besonders nützlich für iterative Aufgaben sein kann, die häufige Kommunikation zwischen klassischen und Quantenressourcen erfordern. Weitere Details zu Sessions findest du in der Dokumentation.
Open Plan-Benutzer können keine Session-Jobs einreichen.
Eine Session starten
Beginne mit der Erstellung einer Session und dem Erhalt einer Session-ID.
import json
import requests
sessionsUrl = "https://quantum.cloud.ibm.com/api/v1/sessions"
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
backend = "<BACKEND_NAME>"
crn = "<SERVICE-CRN>"
headersList = {
"Accept": "application/json",
"Content-Type": "application/json",
"Authorization": auth_id,
"Service-CRN": crn
}
payload = json.dumps({
"backend": backend,
"mode": 'dedicated',
})
response = requests.request("POST", sessionsUrl, data=payload, headers=headersList)
sessionId = response.json()['id']
print(response.json())
Output
{'id': 'crw9s7cdbt40008jxesg'}
Eine Session schließen
Es empfiehlt sich, eine Session zu schließen, sobald alle Jobs abgeschlossen sind. Dies verkürzt die Wartezeit für nachfolgende Benutzer.
closureURL="https://quantum.cloud.ibm.com/api/v1/sessions/"+sessionId+"/close"
headersList = {
"Accept": "application/json",
"Authorization": auth_id,
"Service-CRN": crn
}
closure_response = requests.request(
"DELETE",
closureURL,
headers=headersList
)
print("Session closure response ok?:",closure_response.ok,closure_response.text)
Output
Session closure response ok?: True
Batch mode mit REST-API
Alternativ kannst du einen Batch-Job einreichen, indem du den mode in der Request-Payload angibst. Batch mode kann helfen, die Verarbeitungszeit zu verkürzen, wenn alle Jobs im Voraus bereitgestellt werden können. Mehr zu batch mode erfährst du im Guide Einführung in die Ausführungsmodi.
import json
import requests
sessionsUrl = "https://quantum.cloud.ibm.com/api/v1/sessions"
headersList = {
"Accept": "application/json",
"Authorization": auth_id,
"Service-CRN": crn,
'Content-Type': 'application/json'
}
payload = json.dumps({
"backend": backend,
"instance": "hub1/group1/project1",
"mode": "batch"
})
response = requests.request("POST", sessionsUrl, data=payload, headers=headersList)
sessionId = response.json()['id']
Beispiele für Jobs, die in einer Session eingereicht wurden
Sobald eine Session eingerichtet ist, können ein oder mehrere Sampler- oder Estimator-Jobs an dieselbe Session übermittelt werden, indem die Session-ID angegeben wird.
Die <parameter values> in einem PUB können entweder ein einzelner Parameter oder eine Liste von Parametern sein. Es unterstützt auch numpy-Broadcasting.
Estimator-Jobs in session mode
- 1 Schaltung, 4 Observablen
- 1 circuit, 4 observables, 2 parameter sets
- 2 Schaltungen, 2 Observablen
job_input = {
'program_id': 'estimator',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm, [obs1, obs2, obs3, obs4]]], #primitive unified blocs (PUBs) containing one circuit each.
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
job_input = {
'program_id': 'estimator',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm, [[obs1], [obs2], [obs3], [obs4]], [[vals1], [vals2]]]], #primitive unified blocs (PUBs) containing one circuit each
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
job_input = {
'program_id': 'estimator',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm, obs1],[resulting_qasm, obs2]], #primitive unified blocs (PUBs) containing one circuit each
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
Sampler jobs in session mode
- 1 circuit, no parameters
- 1 Schaltung, 3 Parametersätze
- 2 circuits, 1 parameter set
job_input = {
'program_id': 'sampler',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm]], #primitive unified blocs (PUBs) containing one circuit each
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
job_input = {
'program_id': 'sampler',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm, [vals1, vals2, vals3]]], #primitive unified blocs (PUBs) containing one circuit each
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
job_input = {
'program_id': 'sampler',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm, [val1]],[resulting_qasm,None,100]], #primitive unified blocs (PUBs) containing one circuit each
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
Nächste Schritte
- Sieh dir ausführliche Sampler-Primitiv-Beispiele für die REST-API an.
- Sieh dir ausführliche Estimator-Primitiv-Beispiele für die REST-API an.
- Übe mit Primitiven, indem du die Cost function lesson in IBM Quantum® Learning durcharbeitest.
- Erfahre, wie du lokal transpilierst, im Abschnitt Transpile.