Skip to main content
IBM Quantum Platform

Schaltkreistiming visualisieren

  • Der Code auf dieser Seite wurde unter Berücksichtigung der folgenden Anforderungen entwickelt. Wir empfehlen, diese Versionen oder neuere zu verwenden.

    qiskit[all]~=2.5.2
    qiskit-ibm-runtime~=0.47.0
    

Der in Qiskit integrierte Zeitachsen-Drawer ist zwar für statische Schaltungen nützlich, spiegelt jedoch aufgrund impliziter Operationen wie Broadcasting und Verzweigungsentscheidung möglicherweise nicht genau das Timing dynamischer Schaltungen wider. Im Rahmen der Unterstützung dynamischer Schaltkreise liefert der „ IBM Quantum -Compute-Service“ auf Anfrage genaue Zeitangaben zu den Schaltkreisen in den Auftragsergebnissen.

Hinweise
  • Dies ist eine experimentelle Funktion. Es handelt sich um eine Vorabversion, die sich daher noch ändern kann.
  • Diese Funktion gilt nur für Sampler-Aufträge unter IBM Quantum.
  • Obwohl die Gesamtlaufzeit in den „Compilation“-Metadaten angegeben wird, handelt es sich dabei NICHT um die für die Abrechnung herangezogene Zeit (QPU-Zeit).

Abruf von Zeitdaten aktivieren

Um das Abrufen von Zeitdaten zu ermöglichen, setzen Sie beim Ausführen des Primitive-Jobs True das experimentelle scheduler_timing Flag auf.

from qiskit import QuantumCircuit
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2
from qiskit.transpiler import generate_preset_pass_manager

service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()

pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(qc)

sampler = SamplerV2(backend)
sampler.options.experimental = {
    "execution": {
        "scheduler_timing": True,
    },
}

sampler_job = sampler.run([isa_circuit])
result = sampler_job.result()

Auf die Zeitmessdaten der Rennstrecke zugreifen

Auf Anfrage werden die Schaltungslaufzeitdaten für jeden „ PUB “ in den Metadaten des Auftragsergebnisses unter ["compilation"]["scheduler_timing"]["timing"][…] zurückgegeben. Dieses Feld enthält die Rohdaten zur Zeitmessung. Um die Zeitangaben anzuzeigen, verwenden Sie das integrierte Visualisierungstool, wie im Abschnitt „Zeitangaben visualisieren“ beschrieben.

Verwenden Sie den folgenden Code, um auf die Zeitdaten der ersten Runde von „ PUB “ zuzugreifen:

job_result = sampler_job.result()
circuit_schedule = job_result[0].metadata["compilation"]["scheduler_timing"]
circuit_schedule_timing = circuit_schedule["timing"]

Die Rohdaten zum Zeitablauf verstehen

Zwar ist die Visualisierung der Schaltungszeitdaten mithilfe dieser draw_circuit_schedule_timing Methode der häufigste Anwendungsfall, doch kann es hilfreich sein, die Struktur der zurückgegebenen Rohzeitdaten zu verstehen. Das könnte Ihnen beispielsweise dabei helfen, Informationen programmgesteuert zu extrahieren.

Die in ["compilation"]["scheduler_timing"]["timing"] zurückgegebenen Zeitdaten sind eine Liste von Zeichenfolgen. Jede Zeichenfolge steht für einen einzelnen Befehl auf einem Kanal und ist durch Kommas in die folgenden Datentypen unterteilt:

  • Branch - Bestimmt, ob sich die Anweisung in einem Kontrollfluss (then / else) oder in einem Hauptzweig befindet.
  • Instruction - Das Gatter und das Qubit, auf das es angewendet werden soll.
  • Channel - Der Kanal, dem der Befehl zugewiesen wird. Dabei kann es sich um Folgendes handeln:
    • Qubit x - Der Ansteuerungskanal für das Qubit x.
    • AWGRx_y (Anzeige des Arbiträrsignalgenerators) – Wird von den Auslesekanälen zur Kommunikation bei der Messung von Qubits verwendet. Die Argumente „x“ und „y“ entsprechen der ID des Auslesegeräts bzw. der Qubit-Nummer.
  • T0 - Der Beginn des Unterrichts innerhalb des Gesamtplans
  • Duration - Die Dauer der Anweisung in Einheiten von dt Sekunden, wobei 1 dt = 1 Scheduling-Zyklus. Den dt Wert eines Backends kannst du mithilfe von backend.dtermitteln.
  • Pulse - Die Art des verwendeten Impulsbetriebs.

Beispiel:

main,barrier,Qubit 0,7,0,barrier # A barrier on the main branch on qubit 0 at time 7 with 0 duration
main,reset_0,Qubit 0,7,64,play # A reset instruction on the main branch on qubit 0 at time 7 with duration 64 and a play operation
...

Stellen Sie sich die Zeitabläufe vor

Mit „ qiskit-ibm-runtimev0.43.0 “ oder einer neueren Version können Sie Schaltungsabläufe visualisieren. Um die Zeitangaben darzustellen, müssen Sie zunächst die Metadaten des Ergebnisses mithilfe der Funktion fig in draw_circuit_schedule_timing Methodekonvertieren. Diese Methode gibt eine plotly Abbildung zurück, die Sie direkt anzeigen, in einer Datei speichern oder beides tun können. Weitere Informationen zu den zu plotly verwendenden Befehlen finden Sie unter fig.show() und fig.write_image("<path.format>").

from qiskit_ibm_runtime.visualization import draw_circuit_schedule_timing

# Create a figure from the metadata
fig = draw_circuit_schedule_timing(
    circuit_schedule=circuit_schedule_timing,
    included_channels=None,
    filter_readout_channels=False,
    filter_barriers=False,
    width=1000,
)

# Uncomment the following line to display the figure
# fig.show(renderer="notebook")

# Save to a file
# fig.write_html("scheduler_timing.html")
Wenn man mit der Maus über die Ausgabe fährt, werden Informationen wie Start, Ende und Dauer angezeigt.
Beispiel für eine generierte Abbildung

Die erstellte Abbildung verstehen

Das Bild der von ausgegebenen draw_circuit_schedule_timing Schaltungszeitdaten enthält folgende Informationen:

  • Die X-Achse stellt die Zeit in Einheiten von dt Sekunden dar, wobei 1 dt = 1 Planungszyklus. Den dt Wert eines Backends kannst du mithilfe von backend.dtermitteln.
  • Die Y-Achse stellt den Kanal dar (stellen Sie sich Kanäle als Instrumente vor, die Impulse aussenden).
    • Receive channel - Der einzige Kanal, der kein eigenständiges Instrument ist. Es handelt sich um einen Befehl, der auf allen Kanälen gesendet wird, die zu diesem Zeitpunkt an einem Kommunikationsvorgang mit dem Hub beteiligt sind.
    • Qubit x - Der Ansteuerungskanal für das Qubit x.
    • AWGRx_y (Anzeige des Arbiträrsignalgenerators) – Wird von den Auslesekanälen zur Kommunikation bei der Messung von Qubits verwendet. Die Argumente „x“ und „y“ entsprechen der ID des Auslesegeräts bzw. der Qubit-Nummer.
    • Hub - Steuert die Übertragung.

Zudem hat jeder Befehl das Format X_Y, wobei X für den Namen des Befehls und Y für die Impulsart steht. Ein play Typ gibt Steuerimpulse ab, und ein anderer capture zeichnet den Zustand des Qubits auf. Sie können auch mit der Maus über die einzelnen Anweisungen fahren, um weitere Informationen anzuzeigen. Die vorangegangene Abbildung zeigt beispielsweise einen Steuerimpuls für das X-Gatter, der bei 1161 dt an das Qubit 10 angelegt wird.

End-to-End-Bespiel

Dieses Beispiel zeigt Ihnen, wie Sie die Option aktivieren, die Schaltungszeitinformationen aus den Metadaten abrufen und als Bild anzeigen können.

Richten Sie zunächst die Umgebung ein, definieren Sie die Schaltungen und konvertieren Sie diese in ISA-Schaltungen; anschließend definieren und starten Sie die Jobs.

from qiskit_ibm_runtime import SamplerV2, QiskitRuntimeService
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.transpiler import generate_preset_pass_manager

service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

# Create a dynamic circuit

qubits = QuantumRegister(1)
clbits = ClassicalRegister(1)
qc = QuantumCircuit(qubits, clbits)
(q0,) = qubits
(c0,) = clbits

qc.h(q0)
qc.measure(q0, c0)
with qc.if_test((c0, 1)):
    qc.x(q0)
qc.measure(q0, c0)

# Convert to an ISA circuit for the given backend

pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(qc)

# Generate samplers for backend targets
sampler = SamplerV2(backend)
sampler.options.experimental = {"execution": {"scheduler_timing": True}}

# Submit jobs
sampler_job = sampler.run([isa_circuit])
result = sampler_job.result()

print(
    f">>> {' Job ID:':<10}  {sampler_job.job_id()} ({sampler_job.status()})"
)

Output:

>>>  Job ID:    dab83qbvpcac73ddf510 (DONE)

Als Nächstes rufst du den Zeitplan der Rennstrecke ab:

# Get the circuit schedule timing
result[0].metadata["compilation"]["scheduler_timing"]["timing"]

Output:

'main,rz_0,Qubit 0,1393,0,shift_phase\nmain,sx_0,Qubit 0,1393,9,play\nmain,sx_0,Qubit 0,1397,0,shift_phase\nmain,rz_0,Qubit 0,1402,0,shift_phase\nmain,barrier,Qubit 0,1402,0,barrier\nmain,measure_0,Qubit 0,1402,64,play\nmain,measure_0,Qubit 0,1466,108,play\nmain,measure_0,AWGR0_0,1523,325,capture\nmain,measure_0,Qubit 0,1574,64,play\nmain,measure_0,Qubit 0,1638,64,play\nmain,barrier,Qubit 0,2049,0,barrier\nmain,broadcast,Hub,1523,526,broadcast\nmain,receive,Receive,2049,7,receive\nthen,x_0,Qubit 0,2064,9,play\nmain,barrier,Qubit 0,2082,0,barrier\nmain,measure_0,Qubit 0,2082,64,play\nmain,measure_0,Qubit 0,2146,108,play\nmain,measure_0,AWGR0_0,2203,325,capture\nmain,measure_0,Qubit 0,2254,64,play\nmain,measure_0,Qubit 0,2318,64,play\nmain,barrier,Qubit 0,2753,0,barrier\nmain,barrier,Qubit 0,2753,0,barrier\nmain,FINI_0,Qubit 0,2753,64,play\nmain,FINI_0,Qubit 0,2817,108,play\nmain,FINI_0,AWGR0_0,2874,325,capture\nmain,FINI_0,Qubit 0,2925,64,play\nmain,FINI_0,Qubit 0,2989,64,play\nmain,FINI_0,Qubit 0,3424,9,play\nmain,FINI_0,Qubit 0,3433,64,play\nmain,FINI_0,Qubit 0,3497,108,play\nmain,FINI_0,AWGR0_0,3554,325,capture\nmain,FINI_0,Qubit 0,3605,64,play\nmain,FINI_0,Qubit 0,3669,64,play\nmain,FINI_0,Qubit 0,4104,9,play\nmain,barrier,Qubit 0,4113,0,barrier\n'

Zuletzt kannst du den Zeitablauf anzeigen und speichern:

from qiskit_ibm_runtime.visualization import draw_circuit_schedule_timing

circuit_schedule = result[0].metadata["compilation"]["scheduler_timing"][
    "timing"
]
fig = draw_circuit_schedule_timing(
    circuit_schedule=circuit_schedule,
    included_channels=None,
    filter_readout_channels=False,
    filter_barriers=False,
    width=1000,
)

# Uncomment the following line to display the figure
# fig.show(renderer="notebook")

# Save to a file
# fig.write_html("scheduler_timing.html")

Nächste Schritte

War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.