Zum Hauptinhalt springen

Noise Learning Helper

Paketversionen

Der Code auf dieser Seite wurde mit den folgenden Anforderungen entwickelt. Wir empfehlen, diese oder neuere Versionen zu verwenden.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

Die Fehlerminderungstechniken PEA und PEC nutzen beide eine Noise-Learning-Komponente, die auf einem Pauli-Lindblad-Rauschmodell basiert. Dieses wird normalerweise während der Ausführung verwaltet, nachdem ein oder mehrere Jobs über qiskit-ibm-runtime eingereicht wurden, ohne lokalen Zugriff auf das angepasste Rauschmodell. Ab qiskit-ibm-runtime 0.27.1 wurden jedoch ein NoiseLearner und eine zugehörige NoiseLearnerOptions-Klasse erstellt, um die Ergebnisse dieser Noise-Learning-Experimente abzurufen. Diese Ergebnisse können dann lokal als NoiseLearnerResult gespeichert und als Eingabe für spätere Experimente verwendet werden. Diese Seite bietet einen Überblick über die Verwendung und die verfügbaren Optionen.

Überblick

Die NoiseLearner-Klasse führt Experimente durch, die Rauschprozesse basierend auf einem Pauli-Lindblad-Rauschmodell für einen oder mehrere Circuits charakterisieren. Sie besitzt eine run()-Methode, die die Lernexperimente ausführt und entweder eine Liste von Circuits oder ein PUB als Eingabe entgegennimmt. Sie gibt ein NoiseLearnerResult zurück, das die erlernten Rauschkanäle und Metadaten zu den eingereichten Jobs enthält. Unten findest du einen Code-Ausschnitt, der die Verwendung des Helper-Programms zeigt.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit
from qiskit.transpiler import CouplingMap
from qiskit.transpiler import generate_preset_pass_manager

from qiskit_ibm_runtime import QiskitRuntimeService, EstimatorV2
from qiskit_ibm_runtime.noise_learner import NoiseLearner
from qiskit_ibm_runtime.options import (
NoiseLearnerOptions,
ResilienceOptionsV2,
EstimatorOptions,
)

# Build a circuit with two entangling layers
num_qubits = 27
edges = list(CouplingMap.from_line(num_qubits, bidirectional=False))
even_edges = edges[::2]
odd_edges = edges[1::2]

circuit = QuantumCircuit(num_qubits)
for pair in even_edges:
circuit.cx(pair[0], pair[1])
for pair in odd_edges:
circuit.cx(pair[0], pair[1])

# Choose a backend to run on
service = QiskitRuntimeService()
backend = service.least_busy()

# Transpile the circuit for execution
pm = generate_preset_pass_manager(backend=backend, optimization_level=3)
circuit_to_learn = pm.run(circuit)

# Instantiate a NoiseLearner object and execute the noise learning program
learner = NoiseLearner(mode=backend)
job = learner.run([circuit_to_learn])
noise_model = job.result()

Das resultierende NoiseLearnerResult.data ist eine Liste von LayerError-Objekten, die das Rauschmodell für jede einzelne verschränkende Schicht des Ziel-Circuits (oder der Ziel-Circuits) enthalten. Jeder LayerError speichert die Schichtinformationen in Form eines Circuits und einer Menge von Qubit-Labels sowie den PauliLindbladError für das erlernte Rauschmodell der jeweiligen Schicht.

print(
f"Noise learner result contains {len(noise_model.data)} entries"
f" and has the following type:\n {type(noise_model)}\n"
)
print(
f"Each element of `NoiseLearnerResult` then contains"
f" an object of type:\n {type(noise_model.data[0])}\n"
)
print(
f"And each of these `LayerError` objects possess"
f" data on the generators for the error channel: \n{noise_model.data[0].error.generators}\n"
)
print(f"Along with the error rates: \n{noise_model.data[0].error.rates}\n")
Noise learner result contains 2 entries and has the following type:
<class 'qiskit_ibm_runtime.utils.noise_learner_result.NoiseLearnerResult'>

Each element of `NoiseLearnerResult` then contains an object of type:
<class 'qiskit_ibm_runtime.utils.noise_learner_result.LayerError'>

And each of these `LayerError` objects possess data on the generators for the error channel:
['IIIIIIIIIIIIIIIIIIIIIIIIIIX', 'IIIIIIIIIIIIIIIIIIIIIIIIIIY',
'IIIIIIIIIIIIIIIIIIIIIIIIIIZ', 'IIIIIIIIIIIIIIIIIIIIIIIIIXI',
'IIIIIIIIIIIIIIIIIIIIIIIIIXX', 'IIIIIIIIIIIIIIIIIIIIIIIIIXY',
'IIIIIIIIIIIIIIIIIIIIIIIIIXZ', 'IIIIIIIIIIIIIIIIIIIIIIIIIYI',
'IIIIIIIIIIIIIIIIIIIIIIIIIYX', 'IIIIIIIIIIIIIIIIIIIIIIIIIYY',
'IIIIIIIIIIIIIIIIIIIIIIIIIYZ', 'IIIIIIIIIIIIIIIIIIIIIIIIIZI',
'IIIIIIIIIIIIIIIIIIIIIIIIIZX', 'IIIIIIIIIIIIIIIIIIIIIIIIIZY',
'IIIIIIIIIIIIIIIIIIIIIIIIIZZ', 'IIIIIIIIIIIIIIIIIIIIIIIIXII',
'IIIIIIIIIIIIIIIIIIIIIIIIXXI', 'IIIIIIIIIIIIIIIIIIIIIIIIXYI',
'IIIIIIIIIIIIIIIIIIIIIIIIXZI', 'IIIIIIIIIIIIIIIIIIIIIIIIYII',
'IIIIIIIIIIIIIIIIIIIIIIIIYXI', 'IIIIIIIIIIIIIIIIIIIIIIIIYYI',
'IIIIIIIIIIIIIIIIIIIIIIIIYZI', 'IIIIIIIIIIIIIIIIIIIIIIIIZII',
'IIIIIIIIIIIIIIIIIIIIIIIIZXI', 'IIIIIIIIIIIIIIIIIIIIIIIIZYI',
'IIIIIIIIIIIIIIIIIIIIIIIIZZI', 'IIIIIIIIIIIIIIIIIIIIIIIXIII',
'IIIIIIIIIIIIIIIIIIIIIIIXXII', 'IIIIIIIIIIIIIIIIIIIIIIIXYII',
'IIIIIIIIIIIIIIIIIIIIIIIXZII', 'IIIIIIIIIIIIIIIIIIIIIIIYIII',
'IIIIIIIIIIIIIIIIIIIIIIIYXII', 'IIIIIIIIIIIIIIIIIIIIIIIYYII',
'IIIIIIIIIIIIIIIIIIIIIIIYZII', 'IIIIIIIIIIIIIIIIIIIIIIIZIII',
'IIIIIIIIIIIIIIIIIIIIIIIZXII', 'IIIIIIIIIIIIIIIIIIIIIIIZYII',
'IIIIIIIIIIIIIIIIIIIIIIIZZII', 'IIIIIIIIIIIIIIIIIIIIIIXIIII',
'IIIIIIIIIIIIIIIIIIIIIIXXIII', 'IIIIIIIIIIIIIIIIIIIIIIXYIII',
'IIIIIIIIIIIIIIIIIIIIIIXZIII', 'IIIIIIIIIIIIIIIIIIIIIIYIIII',
'IIIIIIIIIIIIIIIIIIIIIIYXIII', 'IIIIIIIIIIIIIIIIIIIIIIYYIII',
'IIIIIIIIIIIIIIIIIIIIIIYZIII', 'IIIIIIIIIIIIIIIIIIIIIIZIIII',
'IIIIIIIIIIIIIIIIIIIIIIZXIII', 'IIIIIIIIIIIIIIIIIIIIIIZYIII',
'IIIIIIIIIIIIIIIIIIIIIIZZIII', 'IIIIIIIIIIIIIIIIIIIIIXIIIII',
'IIIIIIIIIIIIIIIIIIIIIXXIIII', 'IIIIIIIIIIIIIIIIIIIIIXYIIII',
'IIIIIIIIIIIIIIIIIIIIIXZIIII', 'IIIIIIIIIIIIIIIIIIIIIYIIIII',
'IIIIIIIIIIIIIIIIIIIIIYXIIII', 'IIIIIIIIIIIIIIIIIIIIIYYIIII',
'IIIIIIIIIIIIIIIIIIIIIYZIIII', 'IIIIIIIIIIIIIIIIIIIIIZIIIII',
'IIIIIIIIIIIIIIIIIIIIIZXIIII', 'IIIIIIIIIIIIIIIIIIIIIZYIIII',
'IIIIIIIIIIIIIIIIIIIIIZZIIII', 'IIIIIIIIIIIIIIIIIIIIXIIIIII',
'IIIIIIIIIIIIIIIIIIIIYIIIIII', 'IIIIIIIIIIIIIIIIIIIIZIIIIII',
'IIIIIIIIIIIIIIIIIIIXIIIIIII', 'IIIIIIIIIIIIIIIIIIIXXIIIIII',
'IIIIIIIIIIIIIIIIIIIXYIIIIII', 'IIIIIIIIIIIIIIIIIIIXZIIIIII',
'IIIIIIIIIIIIIIIIIIIYIIIIIII', 'IIIIIIIIIIIIIIIIIIIYXIIIIII',
'IIIIIIIIIIIIIIIIIIIYYIIIIII', 'IIIIIIIIIIIIIIIIIIIYZIIIIII', ...]

Along with the error rates:
[8.80e-04 6.50e-04 3.10e-04 5.60e-04 0.00e+00 0.00e+00 0.00e+00 3.00e-04
6.00e-05 1.30e-04 7.00e-05 3.90e-04 0.00e+00 0.00e+00 3.00e-05 3.70e-04
0.00e+00 5.00e-05 7.50e-04 5.50e-04 5.00e-05 0.00e+00 7.60e-04 5.00e-04
5.60e-04 5.60e-04 2.50e-04 5.00e-05 7.00e-05 2.00e-04 1.40e-04 8.00e-05
2.80e-04 0.00e+00 1.70e-04 4.20e-04 3.00e-05 1.00e-05 1.30e-04 4.40e-04
1.00e-04 2.60e-04 7.10e-04 1.10e-04 2.60e-04 1.00e-04 6.80e-04 1.02e-03
4.60e-04 5.30e-04 3.00e-04 0.00e+00 0.00e+00 3.40e-04 0.00e+00 0.00e+00
2.70e-04 0.00e+00 5.00e-05 6.70e-04 0.00e+00 2.20e-04 0.00e+00 4.40e-04
4.30e-04 8.30e-04 1.42e-03 0.00e+00 0.00e+00 1.44e-03 8.70e-04 0.00e+00
0.00e+00 1.05e-03 6.80e-04 5.90e-04 5.10e-04 3.10e-04 5.60e-04 0.00e+00
4.00e-05 0.00e+00 5.50e-04 1.00e-05 2.00e-05 0.00e+00 1.10e-04 0.00e+00
1.20e-04 0.00e+00 2.20e-04 7.00e-05 4.00e-05 3.80e-04 2.80e-04 4.00e-05
7.00e-05 3.00e-04 1.20e-04 6.00e-04 5.80e-04 1.80e-04 5.00e-04 1.20e-04
2.00e-05 2.00e-05 4.80e-04 2.00e-05 0.00e+00 1.40e-04 4.00e-04 3.00e-05
0.00e+00 0.00e+00 4.40e-04 1.10e-04 5.00e-05 6.00e-04 2.30e-04 5.00e-05
1.10e-04 5.30e-04 3.60e-04 6.80e-04 6.70e-04 2.80e-04 4.90e-04 1.30e-04
6.00e-05 7.20e-04 3.00e-05 9.00e-05 1.10e-04 3.30e-04 6.00e-05 1.30e-04
7.60e-04 1.30e-04 1.50e-04 1.30e-04 0.00e+00 3.10e-04 2.50e-04 5.10e-04
0.00e+00 6.00e-05 2.50e-04 2.40e-04 8.00e-05 0.00e+00 0.00e+00 2.70e-04
0.00e+00 8.00e-05 0.00e+00 7.80e-04 7.00e-05 0.00e+00 0.00e+00 2.50e-04
1.70e-04 2.00e-05 4.50e-04 3.10e-04 2.00e-05 1.70e-04 4.60e-04 1.30e-04
3.20e-04 3.50e-04 3.80e-04 2.70e-04 2.00e-04 8.00e-05 1.00e-05 4.10e-04
0.00e+00 0.00e+00 0.00e+00 2.36e-03 0.00e+00 7.00e-05 1.20e-04 9.40e-04
0.00e+00 1.90e-04 1.38e-03 7.50e-04 1.90e-04 0.00e+00 1.14e-03 7.30e-04
5.70e-04 4.20e-04 6.20e-04 0.00e+00 2.20e-04 5.00e-05 1.20e-04 0.00e+00
0.00e+00 1.90e-04 6.00e-05 1.10e-04 2.10e-04 1.50e-04 1.20e-04 2.90e-04
4.60e-04 2.10e-04 4.00e-05 3.00e-05 1.70e-04 3.10e-04 1.00e-04 1.70e-04
3.00e-05 3.90e-04 0.00e+00 6.00e-04 5.60e-04 1.40e-04 3.50e-04 1.00e-04
1.20e-04 9.00e-05 3.20e-04 2.00e-05 1.70e-04 3.00e-05 4.00e-04 1.50e-04
0.00e+00 1.60e-04 1.90e-04 9.00e-05 6.00e-05 4.50e-04 3.10e-04 6.00e-05
9.00e-05 3.70e-04 2.80e-04 6.50e-04 5.30e-04 3.30e-04 8.00e-05 8.00e-05
5.00e-05 2.50e-04 3.50e-04 4.00e-05 0.00e+00 0.00e+00 1.70e-04 1.30e-04
0.00e+00 0.00e+00 7.00e-05 1.70e-04 1.00e-05 4.20e-04 2.00e-04 1.00e-05
1.70e-04 4.80e-04 1.40e-03 4.70e-04 4.00e-04 3.90e-04 4.40e-04 2.00e-04
1.90e-04 7.20e-04 1.80e-04 1.00e-04 0.00e+00 5.70e-04 1.90e-04 2.00e-04
8.70e-04 1.20e-04 1.70e-04 0.00e+00 0.00e+00 3.80e-04 2.40e-04 4.80e-04
6.00e-05 0.00e+00 9.00e-05 6.50e-04 2.00e-05 8.00e-05 1.40e-04 5.80e-04
1.30e-04 0.00e+00 2.00e-05 1.00e-05 1.60e-04 1.00e-05 1.80e-04 4.40e-04
8.00e-05 1.40e-04 4.40e-04 3.90e-04 1.40e-04 8.00e-05 3.90e-04 4.10e-04
8.80e-04 7.30e-04 1.90e-04]

Das Attribut LayerError.error des Noise-Learning-Ergebnisses enthält die Generatoren und Fehlerraten des angepassten Pauli-Lindblad-Modells, das die folgende Form hat:

Λ(ρ)=expjrj(PjρPjρ),\Lambda(\rho) = \exp{\sum_j r_j \left(P_j \rho P_j^\dagger - \rho\right)},

wobei die rjr_j die LayerError.rates sind und PjP_j die in LayerError.generators angegebenen Pauli-Operatoren.

Noise-Learning-Optionen

Du kannst beim Instanziieren eines NoiseLearner-Objekts unter verschiedenen Optionen wählen. Diese Optionen werden durch die Klasse qiskit_ibm_runtime.options.NoiseLearnerOptions gekapselt und bieten unter anderem die Möglichkeit, die maximale Anzahl zu erlernender Schichten, die Anzahl der Randomisierungen und die Twirling-Strategie festzulegen. Weitere Informationen findest du in der API-Dokumentation zu NoiseLearnerOptions.

Unten findest du ein einfaches Beispiel, das zeigt, wie du NoiseLearnerOptions in einem NoiseLearner-Experiment verwendest:

# Build a GHZ circuit
circuit = QuantumCircuit(10)
circuit.h(0)
circuit.cx(range(0, 9), range(1, 10))
# Choose a backend to run on
service = QiskitRuntimeService()
backend = service.least_busy()

# Transpile the circuit for execution
pm = generate_preset_pass_manager(backend=backend, optimization_level=3)
circuit_to_run = pm.run(circuit_to_learn)

# Instantiate a noise learner options object
learner_options = NoiseLearnerOptions(
max_layers_to_learn=3, num_randomizations=32, twirling_strategy="all"
)

# Instantiate a NoiseLearner object and execute the noise learning program
learner = NoiseLearner(mode=backend, options=learner_options)
job = learner.run([circuit_to_run])
noise_model = job.result()

Rauschmodell als Eingabe für ein Primitive

Das für den Circuit erlernte Rauschmodell kann auch als Eingabe für das EstimatorV2-Primitive in Qiskit IBM Runtime verwendet werden. Es gibt verschiedene Möglichkeiten, das Modell an das Primitive zu übergeben. Die folgenden drei Beispiele zeigen, wie du das Rauschmodell direkt an das estimator.options-Attribut, über ein ResilienceOptionsV2-Objekt vor dem Instanziieren eines Estimator-Primitives oder als entsprechend formatiertes Dictionary übergibst.

# pass the noise model to the `estimator.options` attribute directly
estimator = EstimatorV2(mode=backend)
estimator.options.resilience.layer_noise_model = noise_model
# Specify options via a ResilienceOptionsV2 object
resilience_options = ResilienceOptionsV2(layer_noise_model=noise_model)
estimator_options = EstimatorOptions(resilience=resilience_options)
estimator = EstimatorV2(mode=backend, options=estimator_options)
# Specify options via a dictionary
options_dict = {
"resilience_level": 2,
"resilience": {"layer_noise_model": noise_model},
}

estimator = EstimatorV2(mode=backend, options=options_dict)

Sobald das Rauschmodell in das EstimatorV2-Objekt übergeben wurde, kann es wie gewohnt zum Ausführen von Workloads und zur Fehlerminderung verwendet werden.

Nächste Schritte

Empfehlungen