Przejdź do głównej treści

Określanie opcji Estimatora

Wersje pakietów

Kod na tej stronie został opracowany z użyciem poniższych wymagań. Zalecamy używanie tych wersji lub nowszych.

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

Możesz używać opcji do dostosowania prymitywu Estimator. Chociaż interfejs metody run() prymitywów jest wspólny dla wszystkich implementacji, ich opcje już nie są. Zapoznaj się z referencjami API, aby uzyskać informacje o opcjach qiskit.primitives.BaseEstimatorV2 i qiskit_aer.BaseEstimatorV2.

Notes :

Uwagi dotyczące określania opcji w prymitywach Estimatora
  • Możesz wyświetlić dostępne opcje i aktualizować ich wartości podczas inicjalizacji Estimatora lub po niej.
  • Użyj metody update(), aby zastosować zmiany do atrybutu options.
  • Jeśli nie określisz wartości dla opcji, otrzyma ona specjalną wartość Unset, a używane są domyślne ustawienia serwera.
  • Atrybut options jest typem Python dataclass. Możesz użyć wbudowanej metody asdict, aby przekonwertować go do słownika.

Ustawianie opcji Estimatora

Opcje możesz ustawiać podczas inicjalizacji Estimatora, po inicjalizacji lub (tylko dla precision) w metodzie run().

Inicjalizacja prymitywu

Możesz przekazać instancję klasy opcji lub słownik podczas inicjalizacji Estimatora, który następnie tworzy kopię tych opcji. Zmiana oryginalnego słownika lub instancji opcji nie wpływa zatem na opcje należące do prymitywu.

Klasa opcji

Tworząc instancję klasy EstimatorV2, możesz przekazać instancję klasy opcji. Te opcje zostaną następnie zastosowane podczas użycia metody run() do wykonania obliczeń. Określ opcje w tym formacie: options.option.sub-option.sub-sub-option = choice. Na przykład: options.dynamical_decoupling.enable = True

Przykład:

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

Słownik

Możesz określić opcje jako słownik podczas inicjalizacji Estimatora.

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]},
},
},
)

Aktualizacja opcji po inicjalizacji

Możesz określać opcje w tym formacie: estimator.options.option.sub-option.sub-sub-option = choice, aby skorzystać z autouzupełniania, lub użyć metody update() do wykonania zbiorczych aktualizacji.

Klasa opcji EstimatorV2 (EstimatorOptions) nie musi być tworzona, jeśli ustawiasz opcje po inicjalizacji prymitywu.

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

Metoda Run()

Jedyne wartości, które możesz przekazać do run(), to te zdefiniowane w interfejsie, czyli precision dla Estimatora. Nadpisuje to wartość ustawioną dla default_precision dla bieżącego uruchomienia.

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

Przypadek szczególny: precyzja

Metoda EstimatorV2.run przyjmuje dwa argumenty: listę PUBów, z których każdy może określać PUB-specyficzną wartość precyzji, oraz argument kluczowy precision. Te wartości precyzji są częścią interfejsu wykonania Estimatora i są niezależne od opcji Estimatora Runtime. Mają one pierwszeństwo przed wartościami określonymi jako opcje, aby zachować zgodność z abstrakcją Estimatora.

Jednak jeśli precision nie jest określone przez żaden PUB ani w argumencie kluczowym run (lub jeśli wszystkie są None), używana jest wartość precyzji z opcji, przede wszystkim default_precision.

uwaga

Te parametry precyzji służą jedynie do określania docelowej precyzji, a wyniki nie mają gwarancji osiągnięcia podanej precyzji.

Zauważ, że opcje Estimatora zawierają zarówno default_shots, jak i default_precision. Jednak ponieważ twirling bramek jest domyślnie włączony, iloczyn num_randomizations i shots_per_randomization ma pierwszeństwo przed tymi dwiema opcjami.

Konkretnie, dla każdego PUBa Estimatora:

  1. Jeśli PUB określa precyzję, użyj tej wartości.
  2. Jeśli argument kluczowy precision jest określony w run, użyj tej wartości.
  3. Jeśli twirling jest włączony (domyślnie True), używany jest iloczyn num_randomizations i shots_per_randomization, określony w opcjach twirling.
  4. Jeśli estimator.options.default_shots jest określone, użyj tej wartości do kontrolowania ilości danych.
  5. Jeśli estimator.options.default_precision jest określone, użyj tej wartości.

Na przykład, jeśli precyzja jest określona we wszystkich czterech miejscach, używana jest ta z najwyższym pierwszeństwem (precyzja określona w PUBie).

uwaga

Choć precyzja określona w PUBie i w run ma wyższy priorytet, zadanie zakończy się niepowodzeniem, jeśli twirling jest włączony, a iloczyn num_randomizations i shots_per_randomization jest mniejszy niż liczba ujęć potrzebna do osiągnięcia podanej precyzji. W tym scenariuszu EstimatorV2 nie jest w stanie rozdzielić ujęć pomiędzy podane num_randomizations.

uwaga

Precyzja skaluje się odwrotnie do użycia. To znaczy, im niższa precyzja, tym więcej czasu QPU zajmuje uruchomienie.

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

Wyłączanie wszystkich mitygacji i tłumienia błędów

Możesz wyłączyć wszystkie mitygacje i tłumienie błędów, jeśli na przykład prowadzisz badania nad własnymi technikami mitygacji. Aby to osiągnąć, ustaw resilience_level = 0.

Przykład:

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

Dostępne opcje

Poniższa tabela dokumentuje opcje z najnowszej wersji qiskit-ibm-runtime. Aby zobaczyć starsze wersje opcji, odwiedź referencję API qiskit-ibm-runtime i wybierz poprzednią wersję.

default_shots

Całkowita liczba shotów do użycia na obwód na konfigurację.

Wybory: Liczba całkowita >= 0

Domyślnie: None

Dokumentacja API default_shots

default_precision

Domyślna precyzja do użycia dla dowolnego PUBa lub wywołania run(), które jej nie określa.

Wybory: Float > 0

Domyślnie: 0.015625 (1 / sqrt(4096))

Dokumentacja API default_precision

dynamical_decoupling

Kontroluj ustawienia mitygacji błędów dynamicznego odsprzęgania.

Dokumentacja API dynamical_decoupling

dynamical_decoupling.enable

Wybory: True, False

Domyślnie: False

dynamical_decoupling.extra_slack_distribution

Wybory: middle, edges

Domyślnie: middle

dynamical_decoupling.scheduling_method

Choices: asap, alap Default: alap

dynamical_decoupling.sequence_type

Choices: XX, XpXm, XY4 Default: XX

dynamical_decoupling.skip_reset_qubits

Choices: True, False Default: False

environment

Dokumentacja API environment

environment.callback

Funkcja wywoływalna, która otrzymuje Job ID i Job result.

Wybory: None

Domyślnie: None

environment.job_tags

Lista tagów.

Wybory: None

Domyślnie: None

environment.log_level

Wybory: DEBUG, INFO, WARNING, ERROR, CRITICAL

Domyślnie: WARNING

environment.private

Wybory: True, False

Domyślnie: False

execution

Dokumentacja API execution

execution.init_qubits

Czy resetować qubity do stanu podstawowego przy każdym shocie.

Wybory: True, False

Domyślnie: True

execution.rep_delay

Opóźnienie między pomiarem a kolejnym obwodem kwantowym.

Wybory: Wartość w zakresie podanym przez backend.rep_delay_range

Domyślnie: Podane przez backend.default_rep_delay

max_execution_time

Ogranicza czas działania zadania, w sekundach. Szczegóły znajdziesz w przewodniku maksymalny czas wykonania.

Wybory: Liczba całkowita sekund w zakresie [1, 10800]

Domyślnie: 10800 (3 godziny)

resilience

Zaawansowane opcje odporności do dostrajania strategii odporności.

Dokumentacja API resilience

resilience.layer_noise_learning
resilience.layer_noise_learning.layer_pair_depths

Wybory: list[int] od 2 do 10 wartości w zakresie [0, 200]

Domyślnie: (0, 1, 2, 4, 16, 32)

resilience.layer_noise_learning.max_layers_to_learn

Wybory: None, Liczba całkowita >= 1

Domyślnie: 4

resilience.layer_noise_learning.num_randomizations

Wybory: Liczba całkowita >= 1

Domyślnie: 32

resilience.layer_noise_learning.shots_per_randomization

Wybory: Liczba całkowita >= 1

Domyślnie: 128

resilience.layer_noise_model

Wybory: NoiseLearnerResult, Sequence[LayerError]

Domyślnie: None

resilience.measure_mitigation

Wybory: True, False

Domyślnie: True

resilience.measure_noise_learning
resilience.measure_noise_learning.num_randomizations

Wybory: Liczba całkowita >= 1

Domyślnie: 32

resilience.measure_noise_learning.shots_per_randomization

Wybory: Liczba całkowita, auto

Domyślnie: auto

resilience.pec_mitigation

Wybory: True, False

Domyślnie: False

resilience.pec

Opcje mitygacji probabilistycznego anulowania błędów.

Dokumentacja API resilience.pec

resilience.pec.max_overhead

Wybory: None, Liczba całkowita >= 1

Domyślnie: 100

resilience.pec.noise_gain

Wybory: auto, float w zakresie [0, 1]

Domyślnie: auto

resilience.zne_mitigation

Wybory: True, False

Domyślnie: False

resilience.zne
resilience.zne.amplifier

Wybory: gate_folding, gate_folding_front, gate_folding_back, pea

Domyślnie: gate_folding

resilience.zne.extrapolated_noise_factors

Wybory: Lista wartości float

Domyślnie: [0, *noise_factors]

resilience.zne.extrapolator

Wybory: Jedna lub więcej z: exponential, linear, double_exponential, polynomial_degree_(1 <= k <= 7), fallback

Domyślnie: (exponential, linear)

resilience.zne.noise_factors

Wybory: Lista wartości float; każdy float >= 1

Domyślnie: (1, 1.5, 2) dla PEA i (1, 3, 5) w przeciwnym razie

resilience_level

Poziom odporności na błędy. Wyższe poziomy generują dokładniejsze wyniki kosztem dłuższego czasu przetwarzania. Zobacz sekcję poziomy odporności w temacie Zarządzanie szumem, aby dowiedzieć się więcej.

Wybory: 0, 1, 2

Domyślnie: 1

Dokumentacja API resilience_level

seed_estimator

Wybory: Liczba całkowita

Domyślnie: None

seed_estimator

simulator

Opcje przekazywane podczas symulacji backendu

Dokumentacja API simulator

simulator.basis_gates

Wybory: Lista nazw bramek bazowych do rozwinięcia

Domyślnie: Zbiór wszystkich bramek bazowych obsługiwanych przez symulator Qiskit Aer

simulator.coupling_map

Wybory: Lista skierowanych interakcji dwu-qubitowych

Domyślnie: None, co oznacza brak ograniczeń łączności (pełna łączność).

simulator.noise_model

Wybory: Model szumu Qiskit Aer NoiseModel lub jego reprezentacja

Domyślnie: None

simulator.seed_simulator

Wybory: Liczba całkowita

Domyślnie: None

twirling

Opcje twirling

Dokumentacja API twirling

twirling.enable_gates

Wybory: True, False

Domyślnie: False

twirling.enable_measure

Wybory: True, False

Domyślnie: True

twirling.num_randomizations

Wybory: auto, Liczba całkowita >= 1

Domyślnie: auto

twirling.shots_per_randomization

Wybory: auto, Liczba całkowita >= 1

Domyślnie: auto

twirling.strategy

Wybory: active, active-circuit, active-accum, all

Domyślnie: active-accum

experimental

Opcje eksperymentalne, gdy dostępne.

Kompatybilność funkcji

Niektóre funkcje runtime nie mogą być używane razem w jednym zadaniu. Kliknij odpowiednią zakładkę, aby zobaczyć listę funkcji niekompatybilnych z wybraną funkcją:

Bramki ułamkowe

Niekompatybilne z:

  • Twirlingiem bramek
  • PEA
  • PEC
Gate-folding ZNE

Może nie działać przy użyciu niestandardowych bramek. Niekompatybilne z:

  • PEA
  • PEC
Twirling bramek

Niekompatybilne z:

  • Bramkami ułamkowymi
  • Stretch

Inne uwagi:

  • Twirling pomiarów można stosować tylko do pomiarów terminalnych.
  • Nie działa z splątaczami nie-Cliffordowymi.
PEA

Niekompatybilne z:

  • Bramkami ułamkowymi
  • Gate-folding ZNE
  • PEC
PEC

Niekompatybilne z:

  • Bramkami ułamkowymi
  • Gate-folding ZNE
  • PEA

Następne kroki

Zalecenia