Saltar al contenido principal

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)

Salida de la celda de código anterior

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 de print(), puedes recuperar los registros con job.logs().
  • DONE: El programa ha finalizado y puedes recuperar los datos almacenados en save_result() con job.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
consejo

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

Recomendaciones