Aller au contenu principal

Spécifier les options de l'Estimator

Versions des packages

Le code de cette page a été développé avec les exigences suivantes. Nous recommandons d'utiliser ces versions ou des versions plus récentes.

qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1

Tu peux utiliser les options pour personnaliser la primitive Estimator. Bien que l'interface de la méthode run() des primitives soit commune à toutes les implémentations, leurs options ne le sont pas. Consulte les références API pour obtenir des informations sur les options de qiskit.primitives.BaseEstimatorV2 et qiskit_aer.BaseEstimatorV2.

Notes :

Notes about specifying options in the Estimator primitives
  • Tu peux voir les options disponibles et mettre à jour les valeurs d'options pendant ou après l'initialisation de l'Estimator.
  • Utilise la méthode update() pour appliquer les modifications à l'attribut options.
  • Si tu ne spécifies pas de valeur pour une option, elle reçoit une valeur spéciale Unset et les valeurs par défaut du serveur sont utilisées.
  • L'attribut options est de type Python dataclass. Tu peux utiliser la méthode intégrée asdict pour le convertir en dictionnaire.

Définir les options de l'Estimator

Tu peux définir les options lors de l'initialisation de l'Estimator, après l'initialisation de l'Estimator, ou (pour precision uniquement), dans la méthode run().

Initialisation de la primitive

Tu peux passer une instance de la classe d'options ou un dictionnaire lors de l'initialisation de l'Estimator, qui fait alors une copie de ces options. Ainsi, modifier le dictionnaire ou l'instance d'options d'origine n'affecte pas les options appartenant à la primitive.

Classe d'options

Lors de la création d'une instance de la classe EstimatorV2, tu peux passer une instance de la classe d'options. Ces options seront ensuite appliquées lorsque tu utiliseras run() pour effectuer le calcul. Spécifie les options dans ce format : options.option.sub-option.sub-sub-option = choice. Par exemple : options.dynamical_decoupling.enable = True

Exemple :

# 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)

Dictionnaire

Tu peux spécifier les options sous forme de dictionnaire lors de l'initialisation de l'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]},
},
},
)

Mettre à jour les options après l'initialisation

Tu peux spécifier les options dans ce format : estimator.options.option.sub-option.sub-sub-option = choice pour profiter de l'auto-complétion, ou utiliser la méthode update() pour effectuer des mises à jour en masse.

La classe d'options EstimatorV2 (EstimatorOptions) n'a pas besoin d'être instanciée si tu définis les options après l'initialisation de la primitive.

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éthode Run()

Les seules valeurs que tu peux passer à run() sont celles définies dans l'interface. C'est-à-dire precision pour Estimator. Cela écrase toute valeur définie pour default_precision pour l'exécution courante.

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')>

Cas particulier : précision

La méthode EstimatorV2.run accepte deux arguments : une liste de PUBs, chacun pouvant spécifier une valeur de précision spécifique au PUB, et un argument de mot-clé precision. Ces valeurs de précision font partie de l'interface d'exécution de l'Estimator, et sont indépendantes des options du Runtime Estimator. Elles ont la priorité sur toutes les valeurs spécifiées en tant qu'options afin de se conformer à l'abstraction de l'Estimator.

Cependant, si precision n'est pas spécifié par un PUB ou dans l'argument de mot-clé run (ou s'ils sont tous None), alors la valeur de précision des options est utilisée, notamment default_precision.

remarque

Ces paramètres de précision servent uniquement à spécifier la précision cible, et les résultats ne sont pas garantis d'atteindre la précision spécifiée.

Note que les options de l'Estimator contiennent à la fois default_shots et default_precision. Cependant, comme le gate-twirling est activé par défaut, le produit de num_randomizations et shots_per_randomization prend la priorité sur ces deux options.

Spécifiquement, pour tout PUB d'Estimator :

  1. Si le PUB spécifie la précision, utiliser cette valeur.
  2. Si l'argument de mot-clé precision est spécifié dans run, utiliser cette valeur.
  3. Si twirling est activé (True par défaut), alors le produit de num_randomizations et shots_per_randomization, tel que spécifié dans les options twirling, est utilisé.
  4. Si estimator.options.default_shots est spécifié, utiliser cette valeur pour contrôler la quantité de données.
  5. Si estimator.options.default_precision est spécifié, utiliser cette valeur.

Par exemple, si la précision est spécifiée dans les quatre endroits, celui avec la priorité la plus haute (précision spécifiée dans le PUB) est utilisé.

remarque

Bien que la précision spécifiée dans le PUB et dans run ait une priorité plus élevée, le job échoue si twirling est activé et que le produit de num_randomizations et shots_per_randomization est inférieur au nombre de shots nécessaires pour atteindre la précision. Dans ce scénario, EstimatorV2 est incapable de répartir les shots parmi les num_randomizations spécifiés.

remarque

La précision évolue inversement avec l'utilisation. C'est-à-dire que plus la précision est faible, plus le temps QPU nécessaire à l'exécution est long.

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')>

Désactiver toute la mitigation d'erreurs et la suppression d'erreurs

Tu peux désactiver toute la mitigation et la suppression d'erreurs si tu effectues, par exemple, des recherches sur tes propres techniques de mitigation. Pour ce faire, définis resilience_level = 0.

Exemple :

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

Options disponibles

Le tableau suivant documente les options de la dernière version de qiskit-ibm-runtime. Pour voir les versions d'options antérieures, consulte la référence API qiskit-ibm-runtime et sélectionne une version précédente.

default_shots

Le nombre total de shots à utiliser par circuit et par configuration.

Choix : Entier >= 0

Par défaut : None

Documentation API default_shots

default_precision

La précision par défaut à utiliser pour tout PUB ou appel run() qui n'en spécifie pas une.

Choix : Float > 0

Par défaut : 0.015625 (1 / sqrt(4096))

Documentation API default_precision

dynamical_decoupling

Contrôler les paramètres de la mitigation d'erreur par découplage dynamique.

Documentation API dynamical_decoupling

dynamical_decoupling.enable

Choix : True, False

Par défaut : False

dynamical_decoupling.extra_slack_distribution

Choix : middle, edges

Par défaut : middle

dynamical_decoupling.scheduling_method

Choix : asap, alap Par défaut : alap

dynamical_decoupling.sequence_type

Choix : XX, XpXm, XY4 Par défaut : XX

dynamical_decoupling.skip_reset_qubits

Choix : True, False Par défaut : False

environment

Documentation API environment

environment.callback

Fonction callable qui reçoit le Job ID et le Job result.

Choix : None

Par défaut : None

environment.job_tags

Liste de balises.

Choix : None

Par défaut : None

environment.log_level

Choix : DEBUG, INFO, WARNING, ERROR, CRITICAL

Par défaut : WARNING

environment.private

Choix : True, False

Par défaut : False

execution

Documentation API execution

execution.init_qubits

Indique s'il faut réinitialiser les qubits à l'état fondamental pour chaque shot.

Choix : True, False

Par défaut : True

execution.rep_delay

Le délai entre une mesure et le circuit quantique suivant.

Choix : Valeur dans la plage fournie par backend.rep_delay_range

Par défaut : Donné par backend.default_rep_delay

max_execution_time

Limite la durée d'exécution d'un job, en secondes. Consulte le guide sur le temps d'exécution maximum pour plus de détails.

Choix : Nombre entier de secondes dans la plage [1, 10800]

Par défaut : 10800 (3 heures)

resilience

Options de résilience avancées pour affiner la stratégie de résilience.

Documentation API resilience

resilience.layer_noise_learning

Options pour l'apprentissage du bruit des couches.

Documentation API resilience.layer_noise_learning

resilience.layer_noise_learning.layer_pair_depths

Choix : list[int] de 2 à 10 valeurs dans la plage [0, 200]

Par défaut : (0, 1, 2, 4, 16, 32)

resilience.layer_noise_learning.max_layers_to_learn

Choix : None, Entier >= 1

Par défaut : 4

resilience.layer_noise_learning.num_randomizations

Choix : Entier >= 1

Par défaut : 32

resilience.layer_noise_learning.shots_per_randomization

Choix : Entier >= 1

Par défaut : 128

resilience.layer_noise_model

Choix : NoiseLearnerResult, Sequence[LayerError]

Par défaut : None

resilience.measure_mitigation

Choix : True, False

Par défaut : True

resilience.measure_noise_learning

Options pour l'apprentissage du bruit de mesure.

Documentation API resilience.measure_noise_learning

resilience.measure_noise_learning.num_randomizations

Choix : Entier >= 1

Par défaut : 32

resilience.measure_noise_learning.shots_per_randomization

Choix : Entier, auto

Par défaut : auto

resilience.pec_mitigation

Choix : True, False

Par défaut : False

resilience.pec

Options de mitigation par cancellation d'erreurs probabiliste.

Documentation API resilience.pec

resilience.pec.max_overhead

Choix : None, Entier >= 1

Par défaut : 100

resilience.pec.noise_gain

Choix : auto, float dans la plage [0, 1]

Par défaut : auto

resilience.zne_mitigation

Choix : True, False

Par défaut : False

resilience.zne
resilience.zne.amplifier

Choix : gate_folding, gate_folding_front, gate_folding_back, pea

Par défaut : gate_folding

resilience.zne.extrapolated_noise_factors

Choix : Liste de floats

Par défaut : [0, *noise_factors]

resilience.zne.extrapolator

Choix : Un ou plusieurs de : exponential, linear, double_exponential, polynomial_degree_(1 <= k <= 7), fallback

Par défaut : (exponential, linear)

resilience.zne.noise_factors

Choix : Liste de floats ; chaque float >= 1

Par défaut : (1, 1.5, 2) pour PEA, et (1, 3, 5) sinon

resilience_level

Niveau de résilience à construire contre les erreurs. Des niveaux plus élevés génèrent des résultats plus précis au détriment de temps de traitement plus longs. Consulte la section niveaux de résilience dans le sujet Gestion du bruit pour en savoir plus.

Choix : 0, 1, 2

Par défaut : 1

Documentation API resilience_level

seed_estimator

Choix : Entier

Par défaut : None

seed_estimator

simulator

Options à passer lors de la simulation d'un Backend

Documentation API simulator

simulator.basis_gates

Choix : Liste des noms de portes de base à déplier

Par défaut : L'ensemble de toutes les portes de base supportées par le simulateur Qiskit Aer

simulator.coupling_map

Choix : Liste d'interactions à deux qubits dirigées

Par défaut : None, ce qui implique l'absence de contraintes de connectivité (connectivité complète).

simulator.noise_model

Choix : Qiskit Aer NoiseModel, ou sa représentation

Par défaut : None

simulator.seed_simulator

Choix : Entier

Par défaut : None

twirling

Options de twirling

Documentation API twirling

twirling.enable_gates

Choix : True, False

Par défaut : False

twirling.enable_measure

Choix : True, False

Par défaut : True

twirling.num_randomizations

Choix : auto, Entier >= 1

Par défaut : auto

twirling.shots_per_randomization

Choix : auto, Entier >= 1

Par défaut : auto

twirling.strategy

Choix : active, active-circuit, active-accum, all

Par défaut : active-accum

experimental

Options expérimentales, le cas échéant.

Compatibilité des fonctionnalités

Certaines fonctionnalités de runtime ne peuvent pas être utilisées ensemble dans un seul job. Clique sur l'onglet approprié pour obtenir la liste des fonctionnalités incompatibles avec la fonctionnalité sélectionnée :

Fractional gates

Incompatible avec :

  • Gate twirling
  • PEA
  • PEC
Gate-folding ZNE

Peut ne pas fonctionner lors de l'utilisation de gates personnalisés. Incompatible avec :

  • PEA
  • PEC
Gate twirling

Incompatible avec :

  • Fractional gates
  • Stretches

Autres remarques :

  • Le measurement twirling ne peut être appliqué qu'aux mesures terminales.
  • Ne fonctionne pas avec les entangleurs non-Clifford.
PEA

Incompatible avec :

  • Fractional gates
  • Gate-folding ZNE
  • PEC
PEC

Incompatible avec :

  • Fractional gates
  • Gate-folding ZNE
  • PEA

Prochaines étapes

Recommandations