Modos de ejecución utilizando la API REST
Versiones del paquete
El código de esta página se ha desarrollado teniendo en cuenta los siguientes requisitos. Recomendamos utilizar estas versiones o posteriores.
qiskit[all]~=2.3.0
Puede ejecutar sus cargas de trabajo primitivas Qiskit utilizando las API REST en uno de los tres modos de ejecución, en función de sus necesidades: trabajo, sesión y lote. En este tema se explican estos modos.
Esta documentación utiliza el módulo Python requests para demostrar la API REST Qiskit Runtime. Sin embargo, este flujo de trabajo puede ejecutarse utilizando cualquier lenguaje o framework que soporte el trabajo con APIs REST. Consulte la documentación de referencia de la API para obtener más información.
Modo de trabajo con API REST
En el modo de trabajo, se realiza una única solicitud básica a Estimator o Sampler sin un gestor de contexto. Consulte cómo ejecutar un circuito cuántico utilizando Estimator y Sampler para ver algunos ejemplos.
Modo de sesión con API REST
Una sesión es una función de « Qiskit Runtime » que permite ejecutar de forma eficiente cargas de trabajo iterativas con múltiples tareas en ordenadores cuánticos. El uso de sesiones ayuda a evitar los retrasos provocados por la puesta en cola de cada trabajo por separado, lo que puede resultar especialmente útil para tareas iterativas que requieren una comunicación frecuente entre los recursos clásicos y cuánticos. Encontrarás más detalles sobre las sesiones en la documentación.
Los usuarios de Open Plan no pueden enviar trabajos de sesión.
Iniciar una sesión
Comience por crear una sesión y obtener 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())Resultado
{'id': 'crw9s7cdbt40008jxesg'}Cerrar sesión
Es una buena práctica cerrar Session cuando todos los trabajos estén terminados. Esto reducirá el tiempo de espera para los usuarios posteriores.
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)Resultado
Session closure response ok?: TrueModo por lotes con API REST
También puedes enviar un trabajo por lotes especificando el mode en la carga útil de la solicitud. El modo por lotes puede ayudar a reducir el tiempo de procesamiento si todos los trabajos se pueden proporcionar desde el principio. Obtén más información sobre el modo por lotes 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 trabajos enviados en una sesión
Una vez configurada una sesión, pueden enviarse a la misma uno o varios trabajos del Muestreador o del Estimador especificando el ID de sesión.
<parameter values> en PUB puede ser un único parámetro o una lista de parámetros. También admite la emisión numpy .
Trabajos de estimación en modo sesión
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)
},
}
}Trabajos de muestreo en modo sesión
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
- Consulte ejemplos detallados de primitivas de Sampler mediante la API REST.
- Consulte ejemplos detallados de primitivas de Estimator mediante la API REST.
- Practique con las primitivas trabajando en la lección sobre la función de coste en IBM Quantum® Learning.
- Descubre cómo realizar la transpilación de forma local en la sección «Transpilación ».