Saltar al contenido principal

Introducción a Qiskit Functions

Notas
  • Qiskit Functions es una funcionalidad experimental disponible únicamente para usuarios de los planes IBM Quantum® Premium, Flex y On-Prem (a través de la API de IBM Quantum Platform). Se encuentra en estado de versión preliminar y está sujeta a cambios.
Versiones de paquetes

El código de esta página fue desarrollado con los siguientes requisitos. Recomendamos usar estas versiones o versiones más recientes.

qiskit[all]~=1.4.1
qiskit-ibm-runtime~=0.37.0
qiskit-ibm-catalog~=0.4

Qiskit Functions simplifica y acelera el descubrimiento de algoritmos a escala de utilidad y el desarrollo de aplicaciones, al abstraer partes del flujo de trabajo de desarrollo de software cuántico. De este modo, Qiskit Functions libera el tiempo que normalmente se invierte en escribir código manualmente y en ajustar experimentos.

Descripción general de Qiskit Functions Las funciones se presentan en dos modalidades:

Tipo¿Qué hace?Entradas y salidas de ejemplo¿Para quién es?
Circuit functionInterfaz simplificada para ejecutar circuits. Abstrae la transpilación, la supresión de errores y la mitigación de erroresEntrada: Objetos PUB abstractos
Salida: Valores de expectativa mitigados
Investigadores que usan Qiskit para descubrir nuevos algoritmos y aplicaciones, sin necesidad de centrarse en la optimización para hardware o en el manejo de errores. Las circuit functions pueden usarse para construir application functions personalizadas.
Application functionCubre tareas de mayor nivel, como la exploración de algoritmos y casos de uso específicos de dominio. Abstrae el flujo de trabajo cuántico para resolver tareas, con entradas y salidas clásicasEntrada: Moléculas, grafos
Salida: Energía del estado fundamental y excitado, valores óptimos para la función de costo
Investigadores de dominios no cuánticos que integran lo cuántico en flujos de trabajo clásicos a gran escala existentes, sin necesidad de mapear datos clásicos a quantum circuits.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-catalog qiskit-ibm-runtime

Las funciones son proporcionadas por IBM® y socios externos. Cada una tiene buen rendimiento para características de carga de trabajo específicas y opciones únicas de ajuste de rendimiento.

Descripción general de las funciones disponibles

Circuit functions

NombreProveedorUso recomendadoBeneficios únicos
Tensor-Network Error MitigationAlgorithmiqCargas de trabajo con observables de bajo peso y circuits sin bucles.Reduce la sobrecarga de medición y la varianza, superando las líneas de base estándar de mitigación de errores como la Extrapolación de Ruido Cero (ZNE) y la Cancelación Probabilística de Errores (PEC) para las clases de circuits relevantes.
QESEM: Error Suppression and Error MitigationQedmaCargas de trabajo que incluyen circuits con gates fraccionarios o parametrizados, observables de alto peso y flujos de trabajo que requieren valores de expectativa no sesgados y estimaciones precisas del tiempo de ejecución.Produce valores de expectativa no sesgados con menor varianza y sobrecarga de recursos, superando a ZNE y PEC para las clases de circuits relevantes.
Performance ManagementQ-CTRLCargas de trabajo que contienen circuits paramétricos, circuits profundos o que requieren muchas ejecuciones de circuits.Aplica automáticamente supresión de errores impulsada por IA a los algoritmos cuánticos, maximizando el rendimiento de los dispositivos IBM para entregar resultados precisos mientras se reduce el número de shots, el tiempo de cómputo y el costo requerido.

Método de sobrecarga cero que mejora la precisión de ejecución para los primitivos Sampler y Estimator, compatible con cualquier peso de observables.

Application functions

NombreProveedorUso recomendadoBeneficios únicos
QUICK-PDEColibriTDUsa computación cuántica para PDEs de múltiples física.

Prepara flujos de trabajo de simulación para hardware cuántico, manteniendo control total sobre los parámetros de modelado tanto cuánticos como físicos.
Ofrece un framework híbrido VQA robusto que proporciona soluciones de PDE precisas y escalables mediante codificación avanzada de soluciones y métodos espectrales, convirtiéndolo en un punto de entrada ideal para equipos que buscan desarrollar capacidades de simulación listas para lo cuántico.
Quantum Portfolio OptimizerGlobal Data QuantumCargas de trabajo de optimización financiera que buscan estrategias óptimas de cartera a lo largo del tiempo minimizando el riesgo y maximizando los rendimientos, permitiendo pruebas retrospectivas de estrategias de trading.Resuelve problemas de optimización combinatoria mediante una adaptación altamente especializada del algoritmo cuántico VQE para este caso de uso financiero, usando estrategias de ejecución y optimizadores optimizados, junto con técnicas de mitigación de errores con conciencia de ruido adaptadas a la optimización de carteras.
HI-VQE ChemistryQunova ComputingCargas de trabajo en química computacional, simulación molecular, ciencia de materiales, o cualquier simulación de Hamiltoniano que requiera resolver problemas de estructura electrónica de muchos cuerpos.Resuelve estructuras electrónicas moleculares usando SQD mejorado logrando precisión química (1 kcal/mol, 1.6 mHa) para problemas modelados con 40 a 60 qubits, superando algunas soluciones clásicas en supercomputadoras o el SQD estándar en velocidad de convergencia o precisión, respectivamente, en órdenes de magnitud.
Iskay Quantum OptimizerKipu QuantumCargas de trabajo de optimización como programación, logística, enrutamiento y problemas QUBO/HUBO.

Métodos clásicos de pre- y post-procesamiento ajustables integrados para la rutina de optimización cuántica.

Ofrece ventaja en tiempo de ejecución sobre solvers clásicos (CPLEX, recocido simulado y búsqueda tabú) en benchmarks HUBO seleccionados.

Market Split ms_5_100, un desafío difícil, resuelto en horas (consulta este tutorial).
Singularity Machine LearningMultiverse ComputingFlujos de trabajo clásicos de clasificación de aprendizaje automático que podrían beneficiarse de una mayor precisión o eficiencia computacional aprovechando la optimización cuántica ejecutada en hardware IBM.Ofrece una precisión comparable o superior a la de modelos clásicos como Random Forest o XGBoost, operando con significativamente menos aprendices y un conjunto más compacto.

Impulsado por votación optimizada cuánticamente, selecciona los aprendices más informativos y refina los límites de decisión, resultando en mayor eficiencia, menor complejidad del modelo y un rendimiento más robusto.
Optimization SolverQ-CTRLProblemas de optimización binaria o cualquier problema combinatorio que pueda mapearse a una función de costo binaria.

Se admiten funciones de costo de cualquier orden y tamaños de problema hasta la escala máxima del dispositivo.
Solución de optimización cuántica de extremo a extremo con conciencia de ruido que permite ingresar definiciones de problemas de alto nivel y encontrar automáticamente soluciones precisas a problemas combinatorios clásicamente desafiantes en hardware cuántico a escala de utilidad.

Abstrae la complejidad al gestionar la supresión de errores, el mapeo eficiente y la optimización híbrida cuántico-clásica para resolver tareas de optimización a escala completa del dispositivo sin necesidad de profunda experiencia cuántica.

Empieza con Qiskit Functions

Los usuarios de los planes Premium, Flex y On-Prem (a través de la API de IBM Quantum Platform) pueden comenzar a usar IBM Qiskit Functions de forma gratuita, o pueden adquirir una licencia de uno de los socios que han contribuido una función al catálogo.

Solicita una prueba gratuita para Qiskit Functions de terceros

Para solicitar una nueva prueba gratuita, navega al Catálogo de Qiskit Functions y explora el panel de detalles. Haz clic en Request a free trial y completa la información requerida por el socio de Functions, incluyendo el AccessGroupId de IBM Cloud:

  1. Navega a IBM Cloud IAM.
  2. Verifica la elegibilidad.
    • Cambia tu cuenta en la barra superior a una con el siguiente formato: XXXXXXX - [Nombre de la organización]
    • Asegúrate de que la organización sea la misma que la asociada a tu cuenta Premium.
    • Si ves "[Tu nombre]'s Account", estás usando tu cuenta personal, que no es elegible para acceso premium.
  3. Encuentra tu ID de grupo de acceso.
    • Haz clic en el nombre de un grupo.
    • Haz clic en Details.
    • Copia el ID del grupo de acceso. Debe comenzar con AccessGroup-.

Instala el cliente del Catálogo de Qiskit Functions

  1. Para comenzar a usar Qiskit Functions, instala el cliente del Catálogo de IBM Qiskit Functions:

    pip install qiskit-ibm-catalog
  2. Recupera tu clave de API desde el panel de IBM Quantum Platform y activa tu entorno virtual de Python. Consulta las instrucciones de instalación si aún no tienes un entorno virtual configurado.

    Si estás trabajando en un entorno Python de confianza (como en tu laptop o estación de trabajo personal), usa el método save_account() para guardar tus credenciales localmente. (Salta al siguiente paso si no estás usando un entorno de confianza, como una computadora compartida o pública, para autenticarte en IBM Quantum Platform.)

    Para usar save_account(), ejecuta python en tu terminal y luego ingresa lo siguiente:

    from qiskit_ibm_catalog import QiskitFunctionsCatalog

    QiskitFunctionsCatalog.save_account(channel="ibm_quantum_platform", token="<your-token>", instance="<instance-crn>")

    Escribe exit(). A partir de ahora, cada vez que necesites autenticarte en el servicio, puedes cargar tus credenciales con

    from qiskit_ibm_catalog import QiskitFunctionsCatalog
    catalog = QiskitFunctionsCatalog()
# Load saved credentials
from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")
  1. Evita ejecutar código en una máquina no confiable o en un entorno Python externo en la nube para minimizar los riesgos de seguridad. Si debes usar un entorno no confiable (por ejemplo, en una computadora pública), cambia tu clave de API después de cada uso eliminándola en la página de claves de API de IBM Cloud para reducir el riesgo. Obtén más información en el tema Managing user API keys. Para inicializar el servicio en esta situación, expande la siguiente sección para ver el código que puedes usar:

    Inicializar el servicio en un entorno no confiable
    from qiskit_ibm_catalog import QiskitFunctionsCatalog

    # After using the following code, delete your API key on the IBM Quantum Platform home dashboard
    catalog = QiskitFunctionsCatalog(token="<YOUR_API_KEY>") # Use the 44-character API_KEY you created and saved from the IBM Quantum Platform Home dashboard
    precaución

    ¡Protege tu clave de API! Nunca incluyas tu clave en el código fuente, en un script de Python ni en un archivo de notebook. Al compartir código con otros, asegúrate de que tu clave de API no esté incrustada directamente en el script de Python. En su lugar, comparte el script sin la clave y proporciona instrucciones para configurarla de forma segura.

    Si accidentalmente compartes tu clave con alguien o la incluyes en un control de versiones como Git, revoca tu clave de inmediato eliminándola en la página de claves de API de IBM Cloud para reducir el riesgo. Obtén más información en el tema Managing user API keys.

  2. Una vez que te hayas autenticado, puedes listar las funciones del Catálogo de Qiskit Functions a las que tienes acceso:

catalog.list()
[QiskitFunction(qunova/hivqe-chemistry),
QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),
QiskitFunction(algorithmiq/tem),
QiskitFunction(qedma/qesem),
QiskitFunction(multiverse/singularity),
QiskitFunction(ibm/circuit-function),
QiskitFunction(q-ctrl/optimization-solver),
QiskitFunction(colibritd/quick-pde),
QiskitFunction(q-ctrl/performance-management),
QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]

Ejecuta las funciones habilitadas

Una vez que se ha instanciado un objeto de catálogo, puedes seleccionar una función usando catalog.load(proveedor/nombre-de-función):

ibm_cf = catalog.load("ibm/circuit-function")

Cada Qiskit Function tiene entradas, opciones y salidas personalizadas. Consulta las páginas de documentación específicas de la función que quieras ejecutar para obtener más información. De forma predeterminada, todos los usuarios solo pueden ejecutar un job de función a la vez:

# This cell is hidden from users
# It gets these details programmatically so we can test this notebook
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit.circuit.random import random_circuit

service = QiskitRuntimeService()
instance = service.active_account()["instance"]
backend_name = service.least_busy().name

circuit = random_circuit(num_qubits=2, depth=2, seed=42)
observable = "Z" * circuit.num_qubits
job = ibm_cf.run(
pubs=[(circuit, observable)],
instance=instance,
backend_name=backend_name, # E.g. "ibm_fez"
)

job.job_id
'7f08c9d5-471b-4da2-92e7-4f2cb94c23a8'

Verifica el estado del job

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 Function.

Con el job_id de tu Qiskit Function, puedes verificar el estado de los jobs en ejecución. Esto incluye los siguientes estados:

  • QUEUED: El programa remoto está en la cola de Qiskit Function. La prioridad en la cola se basa en cuánto has usado Qiskit Functions.
  • 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. Esto también incluye varios estados más detallados si son compatibles con funciones específicas:
    • RUNNING: MAPPING: La función está mapeando actualmente tus entradas clásicas a entradas cuánticas.
    • RUNNING: OPTIMIZING_FOR_HARDWARE: La función está optimizando para la QPU seleccionada. Esto puede incluir transpilación de circuits, caracterización de QPU, retropropagación de observables, entre otros.
    • RUNNING: WAITING_FOR_QPU: La función ha enviado un job a Qiskit Runtime y está esperando en la cola.
    • RUNNING: EXECUTING_QPU: La función tiene un job de Qiskit Runtime activo.
    • RUNNING: POST_PROCESSING: La función está post-procesando los resultados. Esto puede incluir mitigación de errores, mapeo de resultados cuánticos a clásicos, entre otros.
  • DONE: El programa está completo y puedes recuperar los datos del resultado con job.results().
  • ERROR: El programa dejó de ejecutarse debido a un problema. Usa job.result() para obtener el mensaje de error.
  • CANCELED: El programa fue cancelado; ya sea por un usuario, el servicio o el servidor.
job.status()
'QUEUED'

Recupera los resultados

Una vez que un programa está en estado DONE, puedes usar job.results() para obtener el resultado. El formato de esta salida varía con cada función, así que asegúrate de seguir la documentación específica:

result = job.result()
print(result)
PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': True, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})

También puedes cancelar un job en cualquier momento:

job.stop()
'Job has been stopped.'

Lista los jobs ejecutados anteriormente con Qiskit Functions

Puedes usar jobs() para listar todos los jobs enviados a Qiskit Functions:

old_jobs = catalog.jobs()
old_jobs
[<Job | f6c29f49-4d5f-4fff-aca6-2e9a115b9763>,
<Job | 7f08c9d5-471b-4da2-92e7-4f2cb94c23a8>,
<Job | 62fe9176-d1e5-467e-b2bd-7a3f3c7be4e5>,
<Job | af525b2e-16b1-45a1-80bb-dbd94ce30258>,
<Job | b95a7a57-c1ad-4958-b7ac-953e4e1ee824>,
<Job | 7bfa33da-0f17-4e67-84b6-f556f7eeb436>,
<Job | ca46c191-9eb9-4de6-bfa7-b60d7eb29b5e>,
<Job | 6ac0ba93-3831-43fb-9fb9-760da2225e06>,
<Job | f0e38071-060d-47e8-988d-9cc1f69358e3>,
<Job | 629cf110-e490-4675-8a07-f6d298d166b0>]

Si ya tienes el ID de un job determinado, puedes recuperarlo con catalog.get_job_by_id():

# First, get the most recent job that has been executed.
latest_job = old_jobs[0]

# We can also get that same job with get_job_by_id
job_by_id = catalog.get_job_by_id(latest_job.job_id)

# Verify that the job is the same using both retrieval methods.
assert job_by_id.job_id == latest_job.job_id

# Print the job_id for this job.
print(job_by_id.job_id)
f6c29f49-4d5f-4fff-aca6-2e9a115b9763

Obtén mensajes de error

Si el estado de un programa es ERROR, usa job.error_message() para obtener el mensaje de error de la siguiente manera:

job.error_message()
qiskit.exceptions.QiskitError: 'Workflow execution failed -- https://docs.quantum.ibm.com/errors#9999'

Próximos pasos

Recomendaciones