Tryby wykonania przy użyciu REST API
Obciążenia prymitywne Qiskit możesz uruchamiać za pomocą REST API w jednym z trzech trybów wykonania, zależnie od potrzeb: job, session i batch. Ten temat wyjaśnia te tryby.
Niniejsza dokumentacja używa modułu Python requests do zademonstrowania REST API Qiskit Runtime. Jednak ten przepływ pracy można wykonać w dowolnym języku lub frameworku obsługującym REST API. Szczegóły znajdziesz w dokumentacji referencyjnej API.
Tryb job z REST API
W trybie job pojedyncze żądanie prymitywne Estimator lub Sampler jest wykonywane bez menedżera kontekstu. Przykłady uruchamiania obwodów kwantowych znajdziesz w opisach Estimator i Sampler.
Tryb session z REST API
Session to funkcja Qiskit Runtime umożliwiająca efektywne uruchamianie iteracyjnych obciążeń wielozadaniowych na komputerach kwantowych. Korzystanie z sesji pomaga unikać opóźnień wynikających z osobnego kolejkowania każdego zadania, co może być szczególnie przydatne w zadaniach iteracyjnych wymagających częstej komunikacji między zasobami klasycznymi i kwantowymi. Więcej informacji o Session znajdziesz w dokumentacji.
Użytkownicy planu Open Plan nie mogą przesyłać zadań w trybie session.
Uruchom sesję
Zacznij od utworzenia sesji i uzyskania identyfikatora sesji.
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'}
Zamknij sesję
Dobrą praktyką jest zamknięcie Session po zakończeniu wszystkich zadań. Skróci to czas oczekiwania dla kolejnych użytkowników.
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
Tryb batch z REST API
Alternatywnie możesz przesłać zadanie w trybie batch, określając mode w ładunku żądania. Tryb batch może skrócić czas przetwarzania, jeśli wszystkie zadania można dostarczyć na początku. Dowiedz się więcej o trybie batch w przewodniku wprowadzenia do trybów wykonania.
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']
Przykłady zadań przesyłanych w sesji
Po skonfigurowaniu sesji można przesłać jedno lub więcej zadań Sampler lub Estimator do tej samej sesji, podając identyfikator sesji.
<parameter values> w PUB może być pojedynczym parametrem lub listą parametrów. Obsługuje też broadcasting numpy.
Zadania Estimator w trybie session
- 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)
},
}
}
Zadania Sampler w trybie session
- 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)
},
}
}
Następne kroki
- Przejrzyj szczegółowe przykłady prymitywów Sampler i Estimator z użyciem REST API.
- Przeczytaj Migracja do prymitywów V2.
- Ćwicz z prymitywami, przechodząc przez lekcję funkcji kosztów w IBM Quantum® Learning.
- Dowiedz się, jak transpilować lokalnie, w sekcji Transpile.