Ejecuta tu primera carga de trabajo de Qiskit Serverless de forma remota
Versiones de paquetes
El código de esta página fue desarrollado con los siguientes requisitos. Se recomienda usar estas versiones o versiones más recientes.
qiskit[all]~=1.4.0
qiskit-ibm-runtime~=0.36.1
qiskit-ibm-catalog~=0.4
Esta sección explora cómo usar qiskit-ibm-catalog para listar los programas disponibles en Qiskit Serverless, pasar entradas a esos programas, ejecutarlos de forma remota, verificar su estado y recuperar resultados y registros.
Asegúrate de haberte autenticado en Qiskit Serverless con tu clave API (consulta Desplegar en IBM Quantum Platform para ver las instrucciones).
Listar los programas disponibles
Puedes usar QiskitServerless.list() para obtener una lista de los programas disponibles para ejecutar con Qiskit Serverless. Esto incluye el programa transpile_remote_serverless que subiste anteriormente.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-catalog qiskit-ibm-runtime
from qiskit_ibm_catalog import QiskitServerless
serverless = QiskitServerless()
next(
program
for program in serverless.list()
if program.title == "transpile_remote_serverless"
)
QiskitFunction(transpile_remote_serverless)
Ejecutar un programa subido y pasar entradas
Primero, configura tus entradas. Tu programa tiene tres entradas: circuits, backend y optimization_level. Puedes usar random_circuit para crear 30 circuitos aleatorios:
from qiskit.circuit.random import random_circuit
qc_random = [(random_circuit(4, 4, measure=True, seed=i)) for i in range(10)]
qc_random[0].draw(output="mpl", idle_wires=False)
A continuación, usa QiskitRuntimeService y least_busy para seleccionar un backend:
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
print(backend.name)
Establece tu nivel de optimización:
optimization_level = 3
Selecciona tu programa con serverless.load('PROGRAM_NAME'):
transpile_remote_serverless = serverless.load("transpile_remote_serverless")
A continuación, pasa tus entradas y ejecútalo de forma pytónica de la siguiente manera:
job = transpile_remote_serverless.run(
circuits=qc_random,
backend=backend.name,
optimization_level=optimization_level,
)
job.job_id
'118256c5-bbb0-4ea8-9e9f-51aac2220aef'
Verificar el estado del trabajo
Con el job_id de Qiskit Serverless, puedes comprobar el estado de los trabajos en ejecución. Esto incluye los siguientes estados:
QUEUED: El programa remoto está en la cola de Qiskit Serverless. La prioridad en la cola se basa actualmente en cuánto has usado Qiskit Serverless.INITIALIZING: El programa remoto está iniciando; esto incluye la configuración del entorno remoto y la instalación de dependencias.RUNNING: El programa está en ejecución. En esta etapa, si tu programa tiene salidas deprint(), puedes recuperar los registros conjob.logs().DONE: El programa ha finalizado y puedes recuperar los datos almacenados ensave_result()conjob.results().
También puedes configurar estados de trabajo más detallados en Administrar recursos de cómputo y datos de Qiskit Serverless.
job.status()
'QUEUED'
# This cell is hidden from users, it checks the job status
assert _ in ["QUEUED", "INITIALIZING", "RUNNING", "DONE"] # noqa: F821
Actualmente, la tabla de cargas de trabajo de IBM Quantum solo refleja las cargas de trabajo de Qiskit Runtime. Usa job.status() para ver el estado actual de tu carga de trabajo de Qiskit Serverless.
¡Has ejecutado con éxito tu primer programa de Qiskit Serverless!
Recuperar registros y resultados
Como se menciónó antes, una vez que un programa está en estado RUNNING, puedes usar job.logs() para obtener los registros generados por las salidas de print():
logs = job.logs()
print(logs)
No logs yet.
En cualquier momento, también puedes cancelar un trabajo:
job.stop()
'Job has been stopped.'
Una vez que un programa está en estado DONE, puedes usar job.results() para obtener el resultado almacenado en save_result():
# We can't get results from a cancelled job, so we'll fetch a completed one instead
completed_job = next(
job for job in serverless.jobs() if job.status() == "DONE"
)
completed_job.result()
{'transpiled_circuits': [<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93eca64810>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec5e5310>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec5d5310>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec58b490>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec57d310>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec535950>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec523c90>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec60a990>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec5527d0>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec4152d0>]}
Listar trabajos ejecutados anteriormente con Qiskit Serverless
Puedes usar jobs() para listar todos los trabajos enviados a Qiskit Serverless:
old_jobs = serverless.jobs()
old_jobs
[<Job | 118256c5-bbb0-4ea8-9e9f-51aac2220aef>,
<Job | e9a36469-7d6b-4f00-bf91-78709ebdbbff>,
<Job | 4efd601b-8f61-4c8e-b14a-0b8a9c649dc0>,
<Job | 87cd22c7-8eb9-4606-bdb4-befe946e9e9b>,
<Job | be9a6dfd-0830-4250-aa60-acdd05bb8818>,
<Job | 479513dd-6a76-4c3e-ba49-bb21351b9a05>,
<Job | f9c20c31-be46-41b3-97ac-99f7be61f89e>,
<Job | 37fa2489-4449-4bfb-974e-9d9a9ec3cc21>,
<Job | b754c4e8-6817-48db-9bb9-74c151d6349a>,
<Job | 78bc6744-b417-48cb-8e01-59bb63bcc2be>]
Próximos pasos
- Explora las herramientas de gestión de cómputo y datos disponibles para tu programa, incluyendo la paralelización.