Moduri de execuție folosind REST API
Poți rula sarcinile de lucru Qiskit primitive folosind REST API în unul din trei moduri de execuție, în funcție de nevoile tale: job, session și batch. Acest subiect explică aceste moduri.
Această documentație utilizează modulul Python requests pentru a demonstra REST API-ul Qiskit Runtime. Totuși, acest flux de lucru poate fi executat folosind orice limbaj sau framework care acceptă lucrul cu REST API-uri. Consultă documentația de referință API pentru detalii.
Modul job cu REST API
În modul job, o singură cerere primitivă către Estimator sau Sampler este efectuată fără un manager de context. Vezi cum să rulezi un Circuit cuantic folosind Estimator și Sampler pentru câteva exemple.
Modul Session cu REST API
O Session este o funcționalitate Qiskit Runtime care îți permite să rulezi eficient sarcini de lucru iterative cu mai multe joburi pe calculatoare cuantice. Utilizarea sesiunilor ajută la evitarea întârzierilor cauzate de adăugarea în coadă a fiecărui job separat, ceea ce poate fi deosebit de util pentru sarcinile iterative care necesită comunicare frecventă între resursele clasice și cele cuantice. Mai multe detalii despre Sessions pot fi găsite în documentație.
Utilizatorii planului Open nu pot trimite joburi de Session.
Pornește o Session
Începe prin crearea unei sesiuni și obținerea unui ID de sesiune.
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'}
Închide o Session
Este o bună practică să închizi o Session când toate joburile sunt finalizate. Acest lucru va reduce timpul de așteptare pentru utilizatorii următori.
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
Modul batch cu REST API
Alternativ, poți trimite un job batch specificând mode în payload-ul cererii. Modul batch poate ajuta la scurtarea timpului de procesare dacă toate joburile pot fi furnizate de la început. Află despre modul batch în ghidul introducere în modurile de execuție.
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']
Exemple de joburi trimise într-o Session
Odată ce o Session este configurată, unul sau mai multe joburi Sampler sau Estimator pot fi trimise în aceeași sesiune specificând ID-ul sesiunii.
<valorile parametrilor> dintr-un PUB pot fi fie un singur parametru, fie o listă de parametri. De asemenea, acceptă broadcasting numpy.
Joburi Estimator în modul Session
- 1 Circuit, 4 observabile
- 1 Circuit, 4 observabile, 2 seturi de parametri
- 2 Circuite, 2 observabile
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)
},
}
}
Joburi Sampler în modul Session
- 1 Circuit, fără parametri
- 1 Circuit, 3 seturi de parametri
- 2 Circuite, 1 set de parametri
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)
},
}
}
Pași următori
- Consultă exemple detaliate de primitive Sampler și Estimator folosind REST API.
- Citește Migrează la primitivele V2.
- Exersează cu primitivele parcurgând lecția despre funcția de cost din IBM Quantum® Learning.
- Află cum să transpilezi local în secțiunea Transpile.