Saltar al contenido principal

Modos de ejecución con la API REST

Puedes ejecutar tus cargas de trabajo de primitivas de Qiskit usando APIs REST en uno de tres modos de ejecución, según tus necesidades: job, session y batch. Este tema explica estos modos.

nota

Esta documentación utiliza el módulo requests de Python para demostrar la API REST de Qiskit Runtime. 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.

Modo job con la API REST

En el modo job, 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.

Modo session con la API REST

Una sesión es una característica de Qiskit Runtime 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.

nota

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

Modo batch con la API REST

Alternativamente, puedes enviar un job en batch especificando el mode en el payload de la solicitud. El modo batch puede ayudar a reducir el tiempo de procesamiento si todos los jobs pueden proporcionarse desde el principio. Aprende sobre el modo batch 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.

nota

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 modo session

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)
},
}

}

Jobs de Sampler en modo session

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)
},
}

}

Próximos pasos

Recomendaciones