Modalità di esecuzione tramite REST API
Package versions
Il codice in questa pagina è stato sviluppato utilizzando i seguenti requisiti. Consigliamo di utilizzare queste versioni o versioni più recenti.
qiskit[all]~=2.3.0
Puoi eseguire i carichi di lavoro primitivi di IBM Quantum tramite REST API in una delle tre modalità di esecuzione disponibili, a seconda delle tue esigenze: job, session e batch. Questo argomento illustra queste modalità.
Questa documentazione utilizza il modulo Python requests per dimostrare l'uso della REST API di IBM Quantum Compute Service. Tuttavia, questo flusso di lavoro può essere eseguito con qualsiasi linguaggio o framework che supporti le REST API. Consulta la documentazione di riferimento delle API per i dettagli.
Job mode tramite REST API
In job mode, viene effettuata una singola richiesta primitiva all'Estimator o al Sampler senza un context manager. Consulta come eseguire un circuito quantistico usando Estimator e Sampler per alcuni esempi.
Session mode tramite REST API
Una session è una funzionalità che ti consente di eseguire in modo efficiente carichi di lavoro iterativi multi-job sui computer quantistici. L'utilizzo delle session aiuta a evitare i ritardi causati dall'accodamento separato di ogni job, il che può essere particolarmente utile per le attività iterative che richiedono una comunicazione frequente tra risorse classiche e quantistiche. Ulteriori dettagli sulle Session sono disponibili nella documentazione.
Gli utenti del piano Open non possono inviare job in session.
Avviare una session
Inizia creando una session e ottenendo un ID di session.
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'}
Chiudere una session
È buona pratica chiudere una Session quando tutti i job sono completati. Questo ridurrà i tempi di attesa per gli utenti successivi.
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 tramite REST API
In alternativa, puoi inviare un job in batch specificando la mode nel payload della richiesta. Batch mode può contribuire a ridurre i tempi di elaborazione se tutti i job possono essere forniti fin dall'inizio. Scopri di più su batch mode nella guida all'introduzione alle modalità di esecuzione.
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']
Esempi di job inviati in una session
Una volta configurata una session, uno o più job Sampler o Estimator possono essere inviati alla stessa session specificando l'ID di session.
I <parameter values> in un PUB possono essere un singolo parametro o un elenco di parametri. Supporta anche il broadcasting di numpy.
Job Estimator in session mode
- 1 circuit, 4 observables
- 1 circuit, 4 observables, 2 parameter sets
- 2 circuits, 2 observables
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 circuit, 3 parameter sets
- 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)
},
}
}
Passi successivi
- Consulta esempi dettagliati delle primitive Sampler tramite REST API.
- Consulta esempi dettagliati delle primitive Estimator tramite REST API.
- Esercitati con le primitive seguendo la lezione sulle funzioni di costo in IBM Quantum® Learning.
- Scopri come eseguire la transpilazione in locale nella sezione Transpile.