Zum Hauptinhalt springen

IBM Circuit-Funktion

Hinweis
  • Qiskit Functions sind ein experimentelles Feature, das ausschließlich für Nutzer des IBM Quantum® Premium Plan, Flex Plan und On-Prem (über die IBM Quantum Platform API) Plan verfügbar ist. Sie befinden sich im Preview-Status und können sich noch ändern.

Überblick

Die IBM® Circuit function nimmt abstrakte PUBs als Eingabe und gibt geminderte Erwartungswerte als Ausgabe zurück. Diese Circuit function umfasst eine automatisierte und individuell angepasste Pipeline, damit sich Forschende auf die Entdeckung neuer Algorithmen und Anwendungen konzentrieren können.

Beschreibung

Nachdem du deinen PUB eingereicht hast, werden deine abstrakten Circuits und Observablen automatisch transpiliert, auf Hardware ausgeführt und nachbearbeitet, um geminderte Erwartungswerte zurückzugeben. Dafür werden folgende Tools kombiniert:

IBM Circuit function

Erste Schritte

Authentifiziere dich mit deinem API-Schlüssel und wähle die Qiskit Function wie folgt aus. (Dieser Codeausschnitt setzt voraus, dass du dein Konto bereits in deiner lokalen Umgebung gespeichert hast.)

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-catalog qiskit-ibm-runtime
from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

function = catalog.load("ibm/circuit-function")

Beispiel

Probiere zunächst dieses einfache Beispiel aus:

from qiskit.circuit.random import random_circuit
from qiskit_ibm_runtime import QiskitRuntimeService

# You can skip this step if you have a target backend, e.g.
# backend_name = "ibm_brisbane"
# You'll need to specify the credentials when initializing QiskitRuntimeService, if they were not previously saved.
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

circuit = random_circuit(num_qubits=2, depth=2, seed=42)
observable = "Z" * circuit.num_qubits
pubs = [(circuit, observable)]

job = function.run(
# Use `backend_name=backend_name` if you didn't initialize a backend object
backend_name=backend.name,
pubs=pubs,
)

Überprüfe den Status deines Qiskit Function-Workloads oder rufe die Ergebnisse wie folgt ab:

print(job.status())
result = job.result()
QUEUED

Die Ergebnisse haben dasselbe Format wie ein Estimator-Ergebnis:

print(f"The result of the submitted job had {len(result)} PUB\n")
print(
f"The associated PubResult of this job has the following DataBins:\n {result[0].data}\n"
)
print(f"And this DataBin has attributes: {result[0].data.keys()}")
print(
f"The expectation values measured from this PUB are: \n{result[0].data.evs}"
)
The result of the submitted job had 1 PUB

The associated PubResult of this job has the following DataBins:
DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>))

And this DataBin has attributes: dict_keys(['evs', 'stds', 'ensemble_standard_error'])
The expectation values measured from this PUB are:
1.02116704805492

Eingaben

Die folgende Tabelle zeigt alle Eingabeparameter, die die IBM Circuit function akzeptiert. Der nachfolgende Abschnitt Optionen geht detaillierter auf die verfügbaren options ein.

NameTypBeschreibungErforderlichStandardBeispiel
backend_namestrName des Backends, auf dem die Anfrage ausgeführt wird.JaN/Aibm_fez
pubsIterable[EstimatorPubLike]Ein iterierbares Objekt aus abstrakten PUB-ähnlichen (Primitive Unified Bloc) Objekten, etwa Tupel (circuit, observables) oder (circuit, observables, parameter_values). Siehe Überblick über PUBs für weitere Informationen. Die Circuits können abstrakt (nicht-ISA) sein.JaN/A(circuit, observables, parameter_values)
optionsdictEingabeoptionen. Weitere Details findest du im Abschnitt Optionen.NeinSiehe den Abschnitt Optionen für Details.{"optimization_level": 3}
instancestrDer Cloud-Ressourcenname der zu verwendenden Instanz im entsprechenden Format.NeinEine Instanz wird zufällig ausgewählt, wenn dein Konto Zugriff auf mehrere Instanzen hat.CRN

Optionen

Struktur

Ähnlich wie bei Qiskit Runtime-Primitiven können Optionen für die IBM Circuit function als verschachteltes Dictionary angegeben werden. Häufig verwendete Optionen wie optimization_level und mitigation_level befinden sich auf der ersten Ebene. Weitere, fortgeschrittenere Optionen sind in verschiedene Kategorien gruppiert, z. B. resilience.

Standardwerte

Wenn du keinen Wert für eine Option angibst, wird der vom Service festgelegte Standardwert verwendet.

Minderungsstufe

Die IBM Circuit function unterstützt außerdem mitigation_level. Die Minderungsstufe legt fest, wie viel Fehlerunterdrückung und -minderung auf den Job angewendet wird. Höhere Stufen liefern genauere Ergebnisse, auf Kosten längerer Verarbeitungszeiten. Das Ausmaß der Fehlerreduktion hängt von der angewendeten Methode ab. Die Minderungsstufe abstrahiert die detaillierte Auswahl von Fehlerminderungs- und -unterdrückungsmethoden, damit Nutzer das für ihre Anwendung passende Kosten-/Genauigkeitsverhältnis abwägen können. Die folgende Tabelle zeigt die entsprechenden Methoden für jede Stufe.

hinweis

Obwohl die Namen ähnlich sind, wendet mitigation_level andere Techniken an als die vom resilience_level des Estimators verwendeten.

Ähnlich wie resilience_level im Qiskit Runtime Estimator legt mitigation_level einen Basissatz kuratierter Optionen fest. Alle Optionen, die du zusätzlich zur Minderungsstufe manuell angibst, werden auf den durch die Minderungsstufe definierten Basissatz angewendet. Grundsätzlich könntest du also die Minderungsstufe auf 1 setzen, aber die Messungsminderung deaktivieren – auch wenn dies nicht empfohlen wird.

MinderungsstufeTechnik
1 [Standard]Dynamical Decoupling + Messung-Twirling + TREX
2Stufe 1 + Gate-Twirling + ZNE via Gate-Faltung
3Stufe 1 + Gate-Twirling + ZNE via PEA

Das folgende Beispiel zeigt, wie die Minderungsstufe gesetzt wird:

options = {"mitigation_level": 2}

job = function.run(backend_name=backend.name, pubs=pubs, options=options)

Alle verfügbaren Optionen

Zusätzlich zu mitigation_level bietet die IBM Circuit function eine Auswahl an erweiterten Optionen, mit denen du das Kosten-/Genauigkeitsverhältnis fein abstimmen kannst. Die folgende Tabelle zeigt alle verfügbaren Optionen:

OptionSub-OptionSub-Sub-OptionBeschreibungAuswahlmöglichkeitenStandard
default_precisionDie Standard-Präzision für jeden PUB oder run()-Aufruf,
der keine eigene Präzision angibt.
Jeder Eingabe-PUB kann seine eigene Präzision festlegen. Wenn der run()-Methode eine Präzision übergeben wird, gilt dieser Wert für alle PUBs im run()-Aufruf, die keine eigene Präzision angeben.
float > 00.015625
max_execution_timeMaximale Ausführungszeit in Sekunden, basierend auf der
QPU-Nutzung (nicht auf der Wanduhrzeit). QPU-Nutzung ist die
Zeitspanne, in der der QPU ausschließlich für die Verarbeitung deines Jobs genutzt wird. Überschreitet ein Job dieses Zeitlimit, wird er zwangsweise abgebrochen.
Ganzzahl in Sekunden im Bereich [1, 10800]
mitigation_levelWie viel Fehlerunterdrückung und -minderung angewendet wird. Weitere Informationen zu den auf jeder Stufe verwendeten Methoden findest du im Abschnitt Minderungsstufe.1 / 2 / 31
optimization_levelWie viel Optimierung an den Circuits durchgeführt wird. Höhere Stufen erzeugen stärker optimierte Circuits, auf Kosten längerer Transpilierungszeit.1 / 2 / 32
dynamical_decouplingenableOb Dynamical Decoupling aktiviert werden soll. Eine Erklärung der Methode findest du unter Fehlerunterdrückung und -minderungstechniken.True/FalseTrue
sequence_typeWelche Dynamical-Decoupling-Sequenz verwendet werden soll.
* XX: verwendet die Sequenz tau/2 - (+X) - tau - (+X) - tau/2
* XpXm: verwendet die Sequenz tau/2 - (+X) - tau - (-X) - tau/2
* XY4: verwendet die Sequenz
tau/2 - (+X) - tau - (+Y) - tau (-X) - tau - (-Y) - tau/2
'XX'/'XpXm'/'XY4''XX'
twirlingenable_gatesOb 2-Qubit-Clifford-Gate-Twirling angewendet werden soll.True/FalseFalse
enable_measureOb Twirling bei Messungen aktiviert werden soll.True/FalseTrue
resiliencemeasure_mitigationOb die TREX-Messfehlerminderungsmethode aktiviert werden soll. Eine Erklärung der Methode findest du unter Fehlerunterdrückung und -minderungstechniken.True/FalseTrue
zne_mitigationOb die Zero-Noise-Extrapolation-Fehlerminderungsmethode aktiviert werden soll. Eine Erklärung der Methode findest du unter Fehlerunterdrückung und -minderungstechniken.True/FalseFalse
zneamplifierWelche Technik zur Rauschverstärkung verwendet werden soll. Eine der folgenden:
- gate_folding (Standard) verwendet 2-Qubit-Gate-Faltung zur Rauschverstärkung. Wenn der Rauschfaktor nur eine Teilmenge der Gates verstärken muss, werden diese zufällig ausgewählt.

- gate_folding_front verwendet 2-Qubit-Gate-Faltung zur Rauschverstärkung. Wenn der Rauschfaktor nur eine Teilmenge der Gates verstärken muss, werden diese vom Anfang des topologisch geordneten DAG-Circuits ausgewählt.

- gate_folding_back verwendet 2-Qubit-Gate-Faltung zur Rauschverstärkung. Wenn der Rauschfaktor nur eine Teilmenge der Gates verstärken muss, werden diese vom Ende des topologisch geordneten DAG-Circuits ausgewählt.

- pea verwendet eine Technik namens Probabilistic Error Amplification (PEA) zur Rauschverstärkung. Eine Erklärung der Methode findest du unter Fehlerunterdrückung und -minderungstechniken.
gate_folding / gate_folding_front / gate_folding_back / peagate_folding
noise_factorsRauschfaktoren für die Rauschverstärkung.Liste von Floats; jeder Float >= 1(1, 1.5, 2) für PEA, und (1, 3, 5) andernfalls.
extrapolatorRauschfaktoren, bei denen die Extrapolationsmodelle ausgewertet werden sollen. Diese Option hat keinen Einfluss auf die Ausführung oder das Modell-Fitting; sie bestimmt lediglich die Punkte, an denen die extrapolator-Objekte ausgewertet werden, um in den Datenfeldern evs_extrapolated und stds_extrapolated zurückgegeben zu werden.eines oder mehrere von exponential, linear, double_exponential, polynomial_degree_(1 <= k <= 7)(exponential, linear)
pec_mitigationOb die Probabilistic-Error-Cancellation-Fehlerminderungsmethode aktiviert werden soll. Eine Erklärung der Methode findest du unter Fehlerunterdrückung und -minderungstechniken.True/FalseFalse
pecmax_overheadDer maximal zulässige Circuit-Sampling-Overhead, oder None für kein Maximum.None / Ganzzahl > 1100

Im folgenden Beispiel deaktiviert das Setzen der Minderungsstufe auf 1 zunächst die ZNE-Minderung, aber das Setzen von zne_mitigation auf True überschreibt die entsprechende Einstellung aus mitigation_level.

options = {"mitigation_level": 1, "resilience": {"zne_mitigation": True}}

Ausgaben

Die Ausgabe einer Circuit function ist ein PrimitiveResult, das zwei Felder enthält:

  • Ein oder mehrere PubResult-Objekte. Diese können direkt aus dem PrimitiveResult indiziert werden.

  • Metadaten auf Job-Ebene.

Jedes PubResult enthält ein data- und ein metadata-Feld.

  • Das data-Feld enthält mindestens ein Array von Erwartungswerten (PubResult.data.evs) und ein Array von Standardfehlern (PubResult.data.stds). Je nach verwendeten Optionen kann es weitere Daten enthalten.

  • Das metadata-Feld enthält PUB-Metadaten (PubResult.metadata).

Der folgende Codeausschnitt beschreibt das Format von PrimitiveResult (und dem zugehörigen PubResult).

print(f"The result of the submitted job had {len(result)} PUB")
print(
f"The expectation values measured from this PUB are: \n{result[0].data.evs}"
)
print(f"And the associated metadata is: \n{result[0].metadata}")
The result of the submitted job had 1 PUB
The expectation values measured from this PUB are:
1.02116704805492
And the associated metadata is:
{'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}

Fehlermeldungen abrufen

Wenn der Status deines Workloads ERROR ist, kannst du mit job.result() die Fehlermeldung zum Debuggen abrufen:

job = function.run(
backend_name="bad_backend_name", pubs=pubs, options=options
)

print(job.result())

Support erhalten

Wende dich an den IBM Quantum Support und gib dabei folgende Informationen an:

  • Qiskit Function Job-ID (qiskit-ibm-catalog), job.job_id
  • Eine detaillierte Beschreibung des Problems
  • Alle relevanten Fehlermeldungen oder -codes
  • Schritte zur Reproduktion des Problems

Nächste Schritte

Empfehlungen