Modos de ejecución con la API REST
Package versions
El código de esta página se desarrolló utilizando los siguientes requisitos. Te recomendamos usar estas versiones o más recientes.
qiskit[all]~=2.3.0
Puedes ejecutar tus cargas de trabajo de primitivas de IBM Quantum usando APIs REST en uno de tres modos de ejecución, según tus necesidades: job, session y batch. Este tema explica estos modos.
Esta documentación utiliza el módulo requests de Python para demostrar la API REST de IBM Quantum Compute Service. Sin embargo, este flujo de trabajo puede ejecutarse con cualquier lenguaje o framework que admita el trabajo con APIs REST. Consulta la documentación de referencia de la API para más detalles.
Job mode con la API REST
En job mode, se realiza una única solicitud de primitiva del Estimator o el Sampler sin un gestor de contexto. Consulta cómo ejecutar un Circuit cuántico usando Estimator y Sampler para ver algunos ejemplos.
Session mode con la API REST
Una sesión es una característica que te permite ejecutar eficientemente cargas de trabajo iterativas con múltiples jobs en computadoras cuánticas. El uso de sesiones ayuda a evitar los retrasos causados por poner en cola cada job por separado, lo que puede ser especialmente útil para tareas iterativas que requieren comunicación frecuente entre recursos clásicos y cuánticos. Puedes encontrar más detalles sobre las sesiones en la documentación.
Los usuarios del plan Open no pueden enviar jobs de sesión.
Iniciar una sesión
Empieza creando una sesión y obteniendo un ID de sesión.
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'}
Cerrar una sesión
Es una buena práctica cerrar una Session cuando todos los jobs hayan terminado. Esto reducirá el tiempo de espera para los usuarios siguientes.
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 con la API REST
Alternativamente, puedes enviar un job en batch especificando el mode en el payload de la solicitud. Batch mode puede ayudar a reducir el tiempo de procesamiento si todos los jobs pueden proporcionarse desde el principio. Aprende sobre batch mode en la guía de introducción a los modos de ejecución.
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']
Ejemplos de jobs enviados en una sesión
Una vez configurada una sesión, se pueden enviar uno o más jobs de Sampler o Estimator a la misma sesión especificando el ID de sesión.
Los <parameter values> en un PUB pueden ser un único parámetro o una lista de parámetros. También admite broadcasting de numpy.
Jobs de Estimator en 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)
},
}
}
Próximos pasos
- Revisa ejemplos detallados de las primitivas Sampler usando la API REST.
- Revisa ejemplos detallados de las primitivas Estimator usando la API REST.
- Practica con primitivas completando la lección de función de costo en IBM Quantum® Learning.
- Aprende cómo transpilar localmente en la sección Transpile.