Especificar opciones del Estimator
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]~=2.4.0
qiskit-ibm-runtime~=0.46.1
Puedes usar opciones para personalizar la primitiva Estimator. Aunque la interfaz del método run() de las primitivas es común a todas las implementaciones, sus opciones no lo son. Consulta las referencias de API para obtener información sobre las opciones de qiskit.primitives.BaseEstimatorV2 y qiskit_aer.BaseEstimatorV2.
Notas :
- Puedes ver las opciones disponibles y actualizar los valores de las opciones durante o después de la inicialización del Estimator.
- Usa el método
update()para aplicar cambios al atributooptions. - Si no especificas un valor para una opción, se le asigna un valor especial de
Unsety se usan los valores predeterminados del servidor. - El atributo
optionses del tipo Pythondataclass. Puedes usar el método integradoasdictpara convertirlo en un diccionario.
Establecer opciones del Estimator
Puedes establecer opciones al inicializar el Estimator, después de inicializarlo, o (solo para precision), en el método run().
Inicialización de la primitiva
Puedes pasar una instancia de la clase de opciones o un diccionario al inicializar el Estimator, que luego hace una copia de esas opciones. Por lo tanto, cambiar el diccionario original o la instancia de opciones no afecta a las opciones del propietario de la primitiva.
Clase de opciones
Al crear una instancia de la clase EstimatorV2, puedes pasar una instancia de la clase de opciones. Esas opciones se aplicarán cuando uses run() para realizar el cálculo. Especifica las opciones en este formato: options.option.sub-option.sub-sub-option = choice. Por ejemplo: options.dynamical_decoupling.enable = True
Ejemplo:
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import EstimatorV2 as Estimator
from qiskit_ibm_runtime.options import EstimatorOptions
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
options = EstimatorOptions(
resilience_level=2,
resilience={"zne_mitigation": True, "zne": {"noise_factors": [1, 3, 5]}},
)
# or...
options = EstimatorOptions()
options.resilience_level = 2
options.resilience.zne_mitigation = True
options.resilience.zne.noise_factors = [1, 3, 5]
estimator = Estimator(mode=backend, options=options)
Diccionario
Puedes especificar opciones como un diccionario al inicializar el Estimator.
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 initialization
estimator = Estimator(
backend,
options={
"resilience_level": 2,
"resilience": {
"zne_mitigation": True,
"zne": {"noise_factors": [1, 3, 5]},
},
},
)
Actualizar opciones después de la inicialización
Puedes especificar las opciones en este formato: estimator.options.option.sub-option.sub-sub-option = choice para aprovechar el autocompletado, o usar el método update() para hacer actualizaciones masivas.
La clase de opciones de EstimatorV2 (EstimatorOptions) no necesita ser instanciada si estás configurando opciones después de inicializar la primitiva.
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import EstimatorV2 as Estimator
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
estimator = Estimator(mode=backend)
# Setting options after initialization
# This uses auto-complete.
estimator.options.default_precision = 0.01
# This does bulk update.
estimator.options.update(
default_precision=0.02, resilience={"zne_mitigation": True}
)
Método Run()
Los únicos valores que puedes pasar a run() son los definidos en la interfaz. Es decir, precision para el Estimator. Esto sobrescribe cualquier valor establecido para default_precision para la ejecución actual.
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import EstimatorV2 as Estimator
from qiskit.circuit.library import random_iqp
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.quantum_info import SparsePauliOp
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
circuit1 = random_iqp(3)
circuit1.measure_all()
circuit2 = random_iqp(3)
circuit2.measure_all()
observable = SparsePauliOp("Z" * 3)
pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend
)
transpiled1 = pass_manager.run(circuit1)
transpiled2 = pass_manager.run(circuit2)
isa_observable1 = observable.apply_layout(transpiled1.layout)
isa_observable2 = observable.apply_layout(transpiled2.layout)
estimator = Estimator(mode=backend)
# Default precision to use if not specified in run()
estimator.options.default_precision = 0.01
# Run two circuits, requiring a precision of .02 for both.
estimator.run(
[(transpiled1, isa_observable1), (transpiled2, isa_observable2)],
precision=0.02,
)
<RuntimeJobV2('d7amh42k86tc73a1sa20', 'estimator')>
Caso especial: precisión
El método EstimatorV2.run acepta dos argumentos: una lista de PUBs, cada uno de los cuales puede especificar un valor de precisión específico del PUB, y un argumento de palabra clave precision. Estos valores de precisión forman parte de la interfaz de ejecución del Estimator y son independientes de las opciones del Runtime Estimator. Tienen prioridad sobre cualquier valor especificado como opciones para cumplir con la abstracción del Estimator.
Sin embargo, si precision no está especificado por ningún PUB ni en el argumento de palabra clave run (o si todos son None), entonces se usa el valor de precisión de las opciones, principalmente default_precision.
Estos parámetros de precisión son solo para especificar la precisión objetivo, y no se garantiza que los resultados alcancen la precisión especificada.
Ten en cuenta que las opciones del Estimator contienen tanto default_shots como default_precision. Sin embargo, como el gate-twirling está habilitado de forma predeterminada, el producto de num_randomizations y shots_per_randomization tiene prioridad sobre esas dos opciones.
Específicamente, para cualquier PUB del Estimator:
- Si el PUB especifica precisión, usar ese valor.
- Si el argumento de palabra clave precision está especificado en
run, usar ese valor. - Si
twirlingestá habilitado (True por defecto), entonces se usa el producto denum_randomizationsyshots_per_randomization, tal como se especifica en las opcionestwirling. - Si
estimator.options.default_shotsestá especificado, usar ese valor para controlar la cantidad de datos. - Si
estimator.options.default_precisionestá especificado, usar ese valor.
Por ejemplo, si la precisión está especificada en los cuatro lugares, se usa el que tiene mayor prioridad (precisión especificada en el PUB).
Aunque la precisión especificada en el PUB y en run tienen mayor prioridad, el trabajo falla si twirling está habilitado y el producto de num_randomizations y shots_per_randomization es menor que los shots necesarios para alcanzar la precisión. En este escenario, EstimatorV2 no puede distribuir los shots entre los num_randomizations especificados.
La precisión escala inversamente con el uso. Es decir, cuanto menor sea la precisión, más tiempo de QPU se necesita para ejecutar.
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import EstimatorV2 as Estimator
from qiskit.circuit.library import random_iqp
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.quantum_info import SparsePauliOp
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
observable = SparsePauliOp("Z" * 3)
circuit = random_iqp(3)
circuit.measure_all()
pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend
)
isa_circuit = pass_manager.run(circuit)
isa_observable = observable.apply_layout(isa_circuit.layout)
# Setting precision during primitive initialization
estimator = Estimator(mode=backend, options={"default_precision": 0.05})
# Run with precision=0.02, overwriting the default.
estimator.run(
[(isa_circuit, isa_observable1)],
precision=0.02,
)
<RuntimeJobV2('d8286b00bvlc73d1vn50', 'estimator')>
Desactivar toda la mitigación y supresión de errores
Puedes desactivar toda la mitigación y supresión de errores si, por ejemplo, estás investigando tus propias técnicas de mitigación. Para lograr esto, establece resilience_level = 0.
Ejemplo:
from qiskit_ibm_runtime import EstimatorV2 as Estimator, QiskitRuntimeService
# Define the service. This allows you to access an IBM QPU.
service = QiskitRuntimeService()
# Get a backend
backend = service.least_busy(operational=True, simulator=False)
# Define Estimator
estimator = Estimator(backend)
options = estimator.options
# Turn off all error mitigation and suppression
options.resilience_level = 0
Opciones disponibles
La siguiente tabla documenta las opciones de la versión más reciente de qiskit-ibm-runtime. Para ver versiones de opciones anteriores, visita la referencia de API de qiskit-ibm-runtime y selecciona una versión anterior.
default_shots
El número total de shots a usar por circuito por configuración.
Opciones: Entero >= 0
Predeterminado: None
default_precision
La precisión predeterminada a usar para cualquier PUB o llamada run() que no especifique una.
Opciones: Float > 0
Predeterminado: 0.015625 (1 / sqrt(4096))
dynamical_decoupling
Controla los ajustes de mitigación de errores por desacoplamiento dinámico.
Documentación de API de dynamical_decoupling
dynamical_decoupling.enable
Opciones: True, False
Predeterminado: False
dynamical_decoupling.extra_slack_distribution
Opciones: middle, edges
Predeterminado: middle
dynamical_decoupling.scheduling_method
Opciones: asap, alap
Predeterminado: alap
dynamical_decoupling.sequence_type
Opciones: XX, XpXm, XY4
Predeterminado: XX
dynamical_decoupling.skip_reset_qubits
Opciones: True, False
Predeterminado: False
environment
Documentación de API de environment
environment.callback
Función invocable que recibe el Job ID y el Job result.
Opciones: None
Predeterminado: None
environment.job_tags
Lista de etiquetas.
Opciones: None
Predeterminado: None
environment.log_level
Opciones: DEBUG, INFO, WARNING, ERROR, CRITICAL
Predeterminado: WARNING
environment.private
Opciones: True, False
Predeterminado: False
execution
Documentación de API de execution
execution.init_qubits
Si se deben restablecer los qubits al estado base para cada shot.
Opciones: True, False
Predeterminado: True
execution.rep_delay
El retraso entre una medición y el circuito cuántico subsiguiente.
Opciones: Valor en el rango proporcionado por backend.rep_delay_range
Predeterminado: Dado por backend.default_rep_delay
max_execution_time
Limita cuánto tiempo puede ejecutarse un trabajo, en segundos. Consulta la guía de tiempo máximo de ejecución para más detalles.
Opciones: Número entero de segundos en el rango [1, 10800]
Predeterminado: 10800 (3 horas)
resilience
Opciones de resiliencia avanzadas para ajustar la estrategia de resiliencia.
Documentación de API de resilience
resilience.layer_noise_learning
Opciones para el aprendizaje del ruido de capa.
resilience.layer_noise_learning.layer_pair_depths
Opciones: list[int] de 2 a 10 valores en el rango [0, 200]
Predeterminado: (0, 1, 2, 4, 16, 32)
resilience.layer_noise_learning.max_layers_to_learn
Opciones: None, Entero >= 1
Predeterminado: 4
resilience.layer_noise_learning.num_randomizations
Opciones: Entero >= 1
Predeterminado: 32
resilience.layer_noise_learning.shots_per_randomization
Opciones: Entero >= 1
Predeterminado: 128
resilience.layer_noise_model
Opciones: NoiseLearnerResult, Sequence[LayerError]
Predeterminado: None
resilience.measure_mitigation
Opciones: True, False
Predeterminado: True
resilience.measure_noise_learning
Opciones para el aprendizaje del ruido de medición.
resilience.measure_noise_learning.num_randomizations
Opciones: Entero >= 1
Predeterminado: 32
resilience.measure_noise_learning.shots_per_randomization
Opciones: Entero, auto
Predeterminado: auto
resilience.pec_mitigation
Opciones: True, False
Predeterminado: False
resilience.pec
Opciones de mitigación por cancelación de errores probabilista.
resilience.pec.max_overhead
Opciones: None, Entero >= 1
Predeterminado: 100
resilience.pec.noise_gain
Opciones: auto, float en el rango [0, 1]
Predeterminado: auto
resilience.zne_mitigation
Opciones: True, False
Predeterminado: False
resilience.zne
resilience.zne.amplifier
Opciones: gate_folding, gate_folding_front, gate_folding_back, pea
Predeterminado: gate_folding
resilience.zne.extrapolated_noise_factors
Opciones: Lista de floats
Predeterminado: [0, *noise_factors]
resilience.zne.extrapolator
Opciones: Uno o más de: exponential, linear, double_exponential, polynomial_degree_(1 <= k <= 7), fallback
Predeterminado: (exponential, linear)
resilience.zne.noise_factors
Opciones: Lista de floats; cada float >= 1
Predeterminado: (1, 1.5, 2) para PEA, y (1, 3, 5) en caso contrario
resilience_level
El nivel de resiliencia a construir contra los errores. Los niveles más altos generan resultados más precisos a costa de tiempos de procesamiento más largos. Consulta la sección niveles de resiliencia en el tema Gestión del ruido para obtener más información.
Opciones: 0, 1, 2
Predeterminado: 1
seed_estimator
simulator
Opciones para pasar al simular un Backend
Documentación de API de simulator
simulator.basis_gates
Opciones: Lista de nombres de puertas base a desplegar
Predeterminado: El conjunto de todas las puertas base admitidas por el simulador Qiskit Aer
simulator.coupling_map
Opciones: Lista de interacciones de dos qubits dirigidas
Predeterminado: None, lo que implica que no hay restricciones de conectividad (conectividad completa).
simulator.noise_model
Opciones: Qiskit Aer NoiseModel, o su representación
Predeterminado: None
simulator.seed_simulator
Opciones: Entero
Predeterminado: None
twirling
Opciones de twirling
Documentación de API de twirling
twirling.enable_gates
Opciones: True, False
Predeterminado: False
twirling.enable_measure
Opciones: True, False
Predeterminado: True
twirling.num_randomizations
Opciones: auto, Entero >= 1
Predeterminado: auto
twirling.shots_per_randomization
Opciones: auto, Entero >= 1
Predeterminado: auto
twirling.strategy
Opciones: active, active-circuit, active-accum, all
Predeterminado: active-accum
experimental
Opciones experimentales, cuando estén disponibles.
Compatibilidad de funcionalidades
Ciertas funcionalidades de runtime no pueden usarse juntas en un solo job. Haz clic en la pestaña correspondiente para ver la lista de funcionalidades incompatibles con la funcionalidad seleccionada:
Fractional gates
Incompatible con:
- Gate twirling
- PEA
- PEC
Gate-folding ZNE
Puede no funcionar cuando se usan gates personalizados. Incompatible con:
- PEA
- PEC
Gate twirling
Incompatible con:
- Fractional gates
- Stretches
Otras notas:
- El measurement twirling solo puede aplicarse a mediciones terminales.
- No funciona con entangladores no-Clifford.
PEA
Incompatible con:
- Fractional gates
- Gate-folding ZNE
- PEC
PEC
Incompatible con:
- Fractional gates
- Gate-folding ZNE
- PEA
Próximos pasos
- Encuentra más detalles sobre los métodos
EstimatorV2en la referencia de API de Estimator. - Decide en qué modo de ejecución ejecutar tu job.
- Aprende sobre la gestión del ruido con Estimator.