Modes d'exécution via l'API REST
Tu peux exécuter tes charges de travail primitives Qiskit via des API REST dans l'un des trois modes d'exécution disponibles, selon tes besoins : job, session et batch. Ce sujet explique ces différents modes.
Cette documentation utilise le module Python requests pour illustrer l'API REST Qiskit Runtime. Ce flux de travail peut toutefois être exécuté avec n'importe quel langage ou framework prenant en charge les API REST. Consulte la documentation de référence de l'API pour plus de détails.
Mode job avec l'API REST
En mode job, une seule requête primitive de l'Estimator ou du Sampler est effectuée sans gestionnaire de contexte. Consulte les exemples d'exécution d'un circuit quantique avec Estimator et Sampler.
Mode session avec l'API REST
Une session est une fonctionnalité de Qiskit Runtime qui te permet d'exécuter efficacement des charges de travail itératives multi-jobs sur des ordinateurs quantiques. L'utilisation de sessions permet d'éviter les délais causés par la mise en file d'attente de chaque job séparément, ce qui peut être particulièrement utile pour les tâches itératives nécessitant des échanges fréquents entre ressources classiques et quantiques. Plus de détails sur les sessions sont disponibles dans la documentation.
Les utilisateurs du plan Open ne peuvent pas soumettre de jobs en session.
Démarrer une session
Commence par créer une session et obtenir un identifiant de 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'}
Fermer une session
Il est recommandé de fermer une Session une fois tous les jobs terminés. Cela réduira le temps d'attente pour les utilisateurs suivants.
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
Mode batch avec l'API REST
Tu peux également soumettre un job en batch en spécifiant le mode dans la charge utile de la requête. Le mode batch peut aider à réduire le temps de traitement si tous les jobs peuvent être fournis dès le départ. Découvre le mode batch dans le guide introduction aux modes d'exécution.
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']
Exemples de jobs soumis dans une session
Une fois la session configurée, un ou plusieurs jobs Sampler ou Estimator peuvent être soumis à la même session en spécifiant l'identifiant de session.
Les <valeurs de paramètres> dans un PUB peuvent être soit un seul paramètre, soit une liste de paramètres. Le broadcasting numpy est également pris en charge.
Jobs Estimator en mode 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)
},
}
}
Jobs Sampler en mode 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)
},
}
}
Prochaines étapes
- Consulte des exemples détaillés des primitives Sampler et Estimator via l'API REST.
- Lis Migrer vers les primitives V2.
- Entraîne-toi avec les primitives en suivant la leçon sur les fonctions de coût dans IBM Quantum® Learning.
- Apprends à transpiler localement dans la section Transpiler.