Ejecutar una primitiva en una sesión¶
Hay varias formas de configurar y utilizar sesiones. La siguiente información no debe considerarse como pasos obligatorios a seguir. En su lugar, elige la configuración que mejor se adapte a tus necesidades. Para obtener más información sobre las sesiones, consulta Introducción a las sesiones. Esta información asume que estás utilizando primitivas de Qiskit Runtime.
Requisitos previos¶
Antes de iniciar una sesión, debes Configurar Qiskit Runtime e inicializarlo como un servicio:
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
Abrir una sesión¶
Puedes abrir una sesión de runtime utilizando el administrador de contexto with Session(…) o inicializando la clase Session. Cuando inicias una sesión, puedes especificar opciones, como el backend en el que se ejecutará. En este tema se describen las opciones más utilizadas. Para ver la lista completa, consulta la documentación de la API de Sessions.
Importante
Los datos del trabajo (job) de la primera sesión se almacenan en caché y les usada por los subsecuentes trabajos. Por lo tanto, si se cancela el primer trabajo, todos los trabajos de sesión subsiguientes fallarán.
Clase Session
Se puede crear una sesión inicializando la clase Session, que luego se puede pasar a las primitivas deseadas. Ejemplo:
session= Session(service=service, backend="ibmq_qasm_simulator")
estimator = Estimator(session=session)
sampler = Sampler(session=session)
Administrador de contexto
El administrador de contexto abre automáticamente una sesión para ti. Una sesión se inicia cuando se inicia el primer trabajo primitivo en este administrador de contexto (no cuando está encolado). Las primitivas creadas en el contexto usan automáticamente esa sesión. Ejemplo:
with Session(service=service, backend="ibmq_qasm_simulator"):
estimator = Estimator()
sampler = Sampler()
Especificar un backend¶
Cuando inicias una sesión, puedes especificar opciones de sesión, como el backend en el que se ejecutará. Se requiere un backend si estás utilizando el canal IBM Quantum, pero es opcional si estás utilizando el canal IBM Cloud. Una vez especificado, no puedes cambiar el backend utilizado para una sesión y no puedes especificar varios backends dentro de una sesión. Para usar un backend diferente, abre una nueva sesión.
Hay dos formas de especificar un backend en una sesión:
Especificar directamente una cadena con el nombre del servidor. Ejemplo:
backend = "ibmq_qasm_simulator" with Session(backend=backend): ...
Pasar el objeto backend. Ejemplo:
backend = service.get_backend("ibmq_qasm_simulator") with Session(backend=backend): ...
Especificar la duración de la sesión¶
Cuando se inicia una sesión, se le asigna un valor máximo de tiempo de espera de sesión. Después de que la sesión haya estado abierta la cantidad de tiempo especificada, la sesión caduca y se cierra a la fuerza. Ya no puedes enviar trabajos a esa sesión. Consulta Qué sucede cuando finaliza una sesión para obtener más detalles.
Puedes configurar el valor máximo de tiempo de espera de la sesión a través del parámetro max_time
, que se puede especificar como segundos (int) o una cadena, como «2h 30m 40s». Este valor tiene que ser mayor que el max_execution_time
del trabajo y menor que el max_time
del sistema. El valor predeterminado es el max_time
del sistema. Consulta ¿Cuál es el tiempo máximo de ejecución para un trabajo de Qiskit Runtime? para determinar el límite del sistema.
Al establecer la duración de la sesión, ten en cuenta cuánto puede tardar cada trabajo dentro de la sesión. Por ejemplo, si ejecutas cinco trabajos dentro de una sesión y se estima que cada trabajo dura cinco minutos, el tiempo máximo para la sesión debe ser de al menos de 25 minutos.
with Session(service=service, backend=backend, max_time="25m"):
...
También hay un valor de tiempo de espera interactivo (5 minutos), que no es configurable. Si no hay trabajos de sesión en cola dentro de esa ventana, la sesión se desactiva temporalmente. Para obtener más detalles sobre la duración de la sesión y el tiempo de espera, consulta Cuánto tiempo permanece activa una sesión.
Cerrar una sesión¶
Cuando todos los trabajos estén terminados, se recomienda que uses session.close() para cerrar la sesión. Esto permite que el planificador ejecute el siguiente trabajo sin esperar el tiempo de espera de la sesión, lo que lo hace más fácil para todos. No puedes enviar trabajos a una sesión cerrada.
Advertencia
Cierra una sesión solo después de que todos los trabajos de la sesión se completen, en lugar de inmediatamente después de que se hayan enviado todos. Los trabajos de sesión que no se completen fallarán.
with Session(service=service, backend=backend) as session:
estimator = Estimator()
job = estimator.run(...)
# Do not close here, the job might not be completed!
result = job.result()
# job.result() is blocking, so this job is now finished and the session can be safely closed.
session.close()
Ejemplo completo¶
En este ejemplo, iniciamos una sesión, ejecutamos un trabajo de Estimator y generamos el resultado:
from qiskit.circuit.random import random_circuit
from qiskit.quantum_info import SparsePauliOp
from qiskit_ibm_runtime import QiskitRuntimeService, Session, Estimator, Options
circuit = random_circuit(2, 2, seed=1).decompose(reps=1)
observable = SparsePauliOp("IY")
options = Options()
options.optimization_level = 2
options.resilience_level = 2
service = QiskitRuntimeService()
with Session(service=service, backend="ibmq_qasm_simulator") as session:
estimator = Estimator(options=options)
job = estimator.run(circuit, observable)
result = job.result()
# Close the session only if all jobs are finished, and you don't need to run more in the session
session.close()
display(circuit.draw("mpl"))
print(f" > Observable: {observable.paulis}")
print(f" > Expectation value: {result.values[0]}")
print(f" > Metadata: {result.metadata[0]}")