Técnicas de mitigación y supresión de errores
Ya está disponible la versión beta de un nuevo modelo de ejecución. El modelo de ejecución dirigida ofrece más flexibilidad a la hora de personalizar el flujo de trabajo de mitigación de errores. Consulte la guía del modelo de ejecución dirigida para obtener más información.
El código de esta página se ha desarrollado teniendo en cuenta los siguientes requisitos. Recomendamos utilizar estas versiones o versiones más recientes.
qiskit-ibm-runtime~=0.47.0
Las técnicas de mitigación y supresión de errores se utilizan para mejorar la calidad de los resultados al ampliar la escala a cargas de trabajo más grandes. Esta página ofrece explicaciones generales sobre las técnicas de supresión y mitigación de errores disponibles a través de Qiskit Runtime.
La siguiente celda importa la primitiva Estimator y crea un backend que se utilizará para inicializar el Estimator en celdas de código posteriores.
from qiskit_ibm_runtime import EstimatorV2 as Estimator
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy()Desacoplamiento dinámico
Los circuitos cuánticos se ejecutan en el hardware IBM® como secuencias de pulsos de microondas que deben programarse y ejecutarse a intervalos de tiempo precisos. Por desgracia, las interacciones no deseadas entre qubits pueden provocar errores coherentes en los qubits en reposo. El desacoplamiento dinámico funciona insertando secuencias de pulsos en los qubits en reposo para anular aproximadamente el efecto de estos errores. Cada secuencia de impulsos insertada equivale a una operación de identidad, pero la presencia física de los impulsos tiene el efecto de suprimir los errores. Hay muchas opciones posibles de secuencias de pulsos, y qué secuencia es mejor para cada caso particular sigue siendo un área activa de investigación.
Obsérvese que el desacoplamiento dinámico es útil principalmente para circuitos que contienen huecos en los que algunos qubits permanecen inactivos sin que ninguna operación actúe sobre ellos. Si las operaciones del circuito son muy densas, de modo que todos los qubits están ocupados la mayor parte del tiempo, es posible que la adición de pulsos de desacoplamiento dinámico no mejore el rendimiento. De hecho, podría incluso empeorar el rendimiento debido a las imperfecciones de los propios impulsos.
El diagrama siguiente muestra el desacoplamiento dinámico con una secuencia de impulsos XX. El circuito abstracto de la izquierda se mapea en un programa de impulsos de microondas en la parte superior derecha. La parte inferior derecha muestra el mismo programa, pero con una secuencia de dos impulsos X insertados durante un periodo de inactividad del primer qubit.
El desacoplamiento dinámico puede activarse ajustando enable a True en las opciones de desacoplamiento dinámico. La opción sequence_type permite elegir entre varias secuencias de impulsos diferentes. El tipo de secuencia por defecto es "XX".
La siguiente celda de código muestra cómo habilitar el desacoplamiento dinámico para el estimador y seleccionar una secuencia de desacoplamiento dinámico.
estimator = Estimator(mode=backend)
estimator.options.dynamical_decoupling.enable = True
estimator.options.dynamical_decoupling.sequence_type = "XpXm"Pauli girando
El twirling, también conocido como compilación aleatoria, es una técnica muy utilizada para convertir canales de ruido arbitrarios en canales de ruido con una estructura más específica.
El giro de Pauli es un tipo especial de giro que utiliza operaciones de Pauli. Tiene el efecto de transformar cualquier canal cuántico en un canal Pauli. Si se realiza solo, puede mitigar el ruido coherente, ya que éste tiende a acumularse cuadráticamente con el número de operaciones, mientras que el ruido Pauli se acumula linealmente. El giro Pauli suele combinarse con otras técnicas de mitigación de errores que funcionan mejor con ruido Pauli que con ruido arbitrario.
El giro Pauli se implementa intercalando un conjunto elegido de compuertas con compuertas Pauli de un solo qubit elegidas al azar, de forma que el efecto ideal de la compuerta siga siendo el mismo. El resultado es que un único circuito se sustituye por un conjunto aleatorio de circuitos, todos con el mismo efecto ideal. Al muestrear el circuito, las muestras se extraen de varias instancias aleatorias, en lugar de una sola.
Dado que la mayoría de los errores del hardware cuántico actual proceden de puertas de dos qubits, esta técnica suele aplicarse exclusivamente a puertas (nativas) de dos qubits. El siguiente diagrama muestra algunos giros de Pauli para las puertas CNOT y ECR. Cada circuito dentro de una fila tiene el mismo efecto ideal.
El giro Pauli puede activarse ajustando enable_gates a True en las opciones de giro. Otras opciones destacables son:
num_randomizations: El número de instancias de circuito a extraer del conjunto de circuitos girados.shots_per_randomization: El número de disparos a muestrear de cada instancia del circuito.
La siguiente celda de código muestra cómo habilitar el efecto Pauli y configurar estas opciones para Estimator. No es necesario configurar ninguna de estas opciones de forma explícita.
estimator = Estimator(mode=backend)
estimator.options.twirling.enable_gates = True
estimator.options.twirling.num_randomizations = 32
estimator.options.twirling.shots_per_randomization = 100Error de lectura de datos en espiral (TREX) eXtinction
El método TREX ( eXtinction ) mitiga el efecto de los errores de medición en la estimación de los valores esperados de las observables de Pauli. Se basa en el concepto de mediciones «giradas», que se llevan a cabo sustituyendo aleatoriamente las puertas de medición por una secuencia compuesta por: (1) una puerta de Pauli X, (2) una medición y (3) una inversión clásica de bits. Al igual que en el giro de compuerta estándar, esta secuencia equivale a una medición simple en ausencia de ruido, tal y como se muestra en el siguiente diagrama:
En caso de error de lectura, la rotación de la medición tiene el efecto de diagonalizar la matriz de transferencia del error de lectura, lo que facilita su inversión. Se aprende un término de reescalado del canal de ruido diagonal mediante la evaluación comparativa de circuitos aleatorios inicializados en el estado cero. Esto permite que el servicio elimine el sesgo de los valores esperados que se derivan del ruido de lectura. Para calcular la matriz de transferencia de errores de lectura es necesario ejecutar circuitos de calibración adicionales, lo que supone una pequeña sobrecarga.
Activa TREX utilizando la measure_mitigation opción
TREX se puede habilitar configurando measure_mitigation a True en las opciones de resiliencia Qiskit Runtime para Estimator. Aquí se describen las opciones para el aprendizaje del ruido de medición. Al igual que con el giro de compuertas, puede establecer el número de aleatorizaciones del circuito y el número de disparos por aleatorización.
La siguiente celda de código muestra cómo habilitar TREX y configurar estas opciones para Estimator. No es necesario configurar ninguna de estas opciones de forma explícita.
estimator = Estimator(mode=backend)
estimator.options.resilience.measure_mitigation = True
estimator.options.resilience.measure_noise_learning.num_randomizations = 32
estimator.options.resilience.measure_noise_learning.shots_per_randomization = 100Activa TREX utilizando la resilience_level opción
Puede activar TREX configurando el nivel de resiliencia en 1, tal y como se muestra en el siguiente ejemplo.
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import EstimatorV2 as Estimator
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
# Setting options during primitive initialization
estimator = Estimator(backend, options={"resilience_level": 1})Extrapolación sin ruido (ZNE)
La extrapolación de ruido cero (ZNE) es una técnica para mitigar los errores en la estimación de los valores de las expectativas de los observables. Aunque a menudo mejora los resultados, no está garantizado que produzca un resultado imparcial.
La ZNE consta de dos etapas:
- Amplificación de ruido : el circuito cuántico original se ejecuta varias veces con diferentes tasas de ruido.
- Extrapolación : El resultado ideal se estima extrapolando los resultados del valor de expectativa ruidoso al límite de ruido cero.
Tanto la etapa de amplificación como la de extrapolación del ruido pueden implementarse de muchas formas distintas. Qiskit Runtime implementa la amplificación del ruido mediante el "plegado digital de compuertas", lo que significa que las compuertas de dos qubits se sustituyen por secuencias equivalentes de la compuerta y su inversa. Por ejemplo, la sustitución de un unitario por produciría un factor de amplificación del ruido de 3. Para la extrapolación, puede elegir entre una de varias formas funcionales, incluido un ajuste lineal o un ajuste exponencial. La imagen inferior muestra el plegado de la puerta digital a la izquierda y el procedimiento de extrapolación a la derecha.
La sobrecarga de este método varía en función del número de factores de ruido. La configuración predeterminada calcula el valor esperado con tres factores de ruido, lo que da lugar a una sobrecarga de aproximadamente un 3x.
Activa ZNE utilizando la zne_mitigation opción
ZNE se puede habilitar configurando zne_mitigation a True en las opciones de resiliencia Qiskit Runtime para Estimator.
Las opciones Qiskit Runtime para ZNE se describen aquí. Destacan las siguientes opciones:
noise_factors: Los factores de ruido a utilizar para la amplificación del ruido.extrapolator: La forma funcional a utilizar para la extrapolación.
La siguiente celda de código muestra cómo habilitar ZNE y configurar estas opciones para Estimator. No es necesario configurar ninguna de estas opciones de forma explícita.
estimator = Estimator(mode=backend)
estimator.options.resilience.zne_mitigation = True
estimator.options.resilience.zne.noise_factors = (1, 3, 5)
estimator.options.resilience.zne.extrapolator = "exponential"Activa ZNE utilizando la resilience_level opción
Puedes activar ZNE (junto con TREX y el giro de puertas) configurando el nivel de resiliencia en 2, tal y como se muestra en el siguiente ejemplo.
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import EstimatorV2 as Estimator
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
# Setting options during primitive initialization
estimator = Estimator(backend, options={"resilience_level": 2})Amplificación probabilística del error (PEA)
Uno de los principales retos de la ZNE es amplificar con precisión el ruido que afecta al circuito objetivo. El plegado de compuertas proporciona una manera fácil de realizar esta amplificación, pero es potencialmente imprecisa y podría conducir a resultados incorrectos. Véase el artículo "Scalable error mitigation for noisy quantum circuits produces competitive expectation values", y concretamente la página 4 de la información suplementaria para más detalles. La amplificación probabilística de errores proporciona un enfoque más preciso que la amplificación de errores mediante el aprendizaje del ruido.
La PEA es una técnica más sofisticada que realiza experimentos preliminares para reconstruir el ruido y luego utiliza esta información para realizar una amplificación precisa. Comienza aprendiendo el modelo de ruido giratorio de cada capa de puertas de enredo del circuito antes de que se ejecuten (véase LayerNoiseLearningOptions para las opciones de aprendizaje pertinentes). Tras la fase de aprendizaje, los circuitos se ejecutan en cada factor de ruido, donde cada capa de enredo de los circuitos se amplifica inyectando probabilísticamente ruido de un solo qubit proporcional al correspondiente modelo de ruido aprendido. Consulte el artículo "Pruebas de la utilidad de la computación cuántica ante la tolerancia a fallos" para más detalles.
La PEA consta de tres etapas:
- Aprendizaje : Se aprende el modelo de ruido giratorio de cada capa de puertas de enredo del circuito.
- Amplificación de ruido : el circuito cuántico original se ejecuta varias veces con diferentes factores de ruido.
- Extrapolación : El resultado ideal se estima extrapolando los resultados del valor de expectativa ruidoso al límite de ruido cero.
Para los experimentos a escala comercial, la PEA suele ser la mejor opción.
Dado que PEA es una técnica de amplificación de ruido ZNE, también es necesario habilitar ZNE configurando resilience.zne_mitigation = True. Otras opciones de resilience.zne opciones pueden utilizarse adicionalmente para establecer extrapoladores, niveles de amplificación, etc. PEA requiere un modelo de ruido, que se genera automáticamente al utilizar primitivas.
El siguiente fragmento proporciona un ejemplo en el que se utiliza PEA para mitigar el resultado de un trabajo de Estimator:
estimator = Estimator(mode=backend)
estimator.options.resilience.zne_mitigation = True
estimator.options.resilience.zne.amplifier = "pea"Cancelación probabilística de errores (PEC)
La cancelación probabilística de errores (PEC) es una técnica para mitigar los errores en la estimación de los valores de las expectativas de los observables. A diferencia de la ZNE, devuelve una estimación insesgada del valor esperado. Sin embargo, suele conllevar una mayor sobrecarga.
En PEC, el efecto de un circuito objetivo ideal se expresa como una combinación lineal de circuitos ruidosos que son realmente implementables en la práctica:
La salida del circuito ideal puede entonces reproducirse ejecutando diferentes instancias de circuitos ruidosos extraídos de un conjunto aleatorio definido por la combinación lineal. Si los coeficientes forman una distribución de probabilidad, pueden utilizarse directamente como las probabilidades del conjunto. En la práctica, algunos de los coeficientes son negativos, por lo que forman una distribución casi probabilística. Aún pueden utilizarse para definir un conjunto aleatorio, pero existe una sobrecarga de muestreo relacionada con la negatividad de la distribución de cuasiprobabilidad, que se caracteriza por la cantidad
La sobrecarga de muestreo es un factor multiplicativo del número de disparos necesarios para estimar un valor de expectativa con una precisión determinada, en comparación con el número de disparos que se necesitarían del circuito ideal. Escala cuadráticamente con , que a su vez escala exponencialmente con la profundidad del circuito.
PEC se puede habilitar configurando pec_mitigation a True en las opciones de resiliencia Qiskit Runtime para Estimator.
Aquí se describen las opciones de Qiskit Runtime para PEC. La opción max_overhead permite limitar la sobrecarga de muestreo. Tenga en cuenta que la limitación de la sobrecarga de muestreo puede hacer que la precisión del resultado supere la precisión solicitada. El valor por defecto de max_overhead es 100.
La siguiente celda de código muestra cómo habilitar PEC y configurar la max_overhead opción de Estimator.
estimator = Estimator(mode=backend)
estimator.options.resilience.pec_mitigation = True
estimator.options.resilience.pec.max_overhead = 100Próximos pasos
- Consulte el tutorial sobre la combinación de opciones de mitigación de errores con la primitiva Estimator.
- Configura la gestión del ruido con Estimator.
- Configura la gestión del ruido con Sampler.
- Explora otras opciones para las primitivas de « Qiskit Runtime ».
- Decide en qué modo de ejecución quieres ejecutar tu tarea.