Přeskočit na hlavní obsah
Tento projekt je v betě. Našel jsi chybu? Otevřít issue na GitHubu. Máš otázku nebo nápad? Zeptej se v Discussions — rádi si poslechneme tvou zpětnou vazbu!
Jaká je kvalita překladu na této stránce?

Vizualizace časování obvodů

Verze balíčků

Kód na této stránce byl vyvinut s použitím následujících požadavků. Doporučujeme používat tyto nebo novější verze.

qiskit[all]~=2.6.1
qiskit-ibm-runtime~=0.50.0

Zatímco nástroj pro kreslení časové osy zabudovaný v Qiskit je užitečný pro statické obvody, nemusí přesně odrážet časování dynamických obvodů kvůli implicitním operacím, jako je vysílání a určení větví. Jako součást podpory dynamických obvodů vrací IBM Quantum Compute Service přesné informace o časování obvodu uvnitř výsledků úlohy, pokud je to vyžádáno.

Poznámky
  • Toto je experimentální funkce. Je ve zkušební (preview) verzi, a proto se může měnit.
  • Tato funkce se vztahuje pouze na úlohy IBM Quantum Sampler a Executor.
  • Ačkoli je celkový čas obvodu vrácen v metadatech „compilation", NENÍ to čas používaný pro fakturaci (čas QPU).
tip

Tato možnost funguje i s dry-run joby. Předej dry_run=True do run(), abys získal časový plán Circuit bez spotřeby jakéhokoli času QPU.

Povolení načítání dat o časování​

Chceš-li povolit načítání dat o časování, nastav experimentální příznak scheduler_timing na True při spouštění úlohy primitiva.

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"qiskit": "qiskit", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit import QuantumCircuit
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit.transpiler import generate_preset_pass_manager

# Legacy server-side primitive before qiskit-ibm-runtime v0.50.0
# from qiskit_ibm_runtime import Sampler

# Client-side primitive introduced in qiskit-ibm-runtime v0.50.0
from qiskit_ibm_runtime.executor_sampler import Sampler

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 = Sampler(backend)
sampler.options.experimental = {
"execution": {
"scheduler_timing": True,
},
}

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

Přístup k datům časování obvodu​

Pokud je to vyžádáno, jsou data časování obvodu pro každý PUB vrácena v metadatech výsledku úlohy pod ["compilation"]["scheduler_timing"]["timing"]. Toto pole obsahuje nezpracované informace o časování. Chceš-li zobrazit informace o časování, použij vestavěný nástroj pro vizualizaci, jak je popsáno v části Vizualizace časování.

Pomocí následujícího kódu získáš data časování obvodu pro první PUB:

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

Pochopení nezpracovaných dat časování​

Zatímco vizualizace dat časování obvodu pomocí metody draw_circuit_schedule_timing je nejběžnějším případem použití, může být užitečné pochopit strukturu vrácených nezpracovaných dat časování. To by ti mohlo pomoci například extrahovat informace programově.

Data časování vrácená v ["compilation"]["scheduler_timing"]["timing"] jsou seznam řetězců. Každý řetězec představuje jednu instrukci na nějakém kanálu a obsahuje čárkami oddělené hodnoty těchto datových typů:

  • Branch - Určuje, zda je instrukce v řídicím toku (then / else) nebo hlavní větvi.

  • Instruction - Gate a qubit, na kterém se operuje.

  • Channel - Kanál, kterému je instrukce přiřazena. Může být jeden z následujících:

    • Qubit x - Budicí kanál pro qubit x.

    • AWGRx_y (odečet generátoru libovolných průběhů) - Používán vyčítacími kanály ke komunikaci při měření qubitů. Argumenty x a y odpovídají ID čtecího přístroje a číslu qubitu.

  • T0 - Čas začátku instrukce v rámci celého harmonogramu

  • Duration - Doba trvání instrukce v jednotkách dt sekund, kde 1 dt = 1 plánovací cyklus. Hodnotu dt backendu najdeš pomocí backend.dt.

  • Pulse - Typ pulzní operace, která se používá.

Příklad:

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
...

Vizualizace časování​

S qiskit-ibm-runtime v0.43.0 nebo novějším můžeš vizualizovat časování obvodů. Chceš-li vizualizovat časování, musíš nejprve převést metadata výsledku na fig pomocí metody draw_circuit_schedule_timing. Tato metoda vrací objekt plotly s grafem, který můžeš zobrazit přímo, uložit do souboru nebo obojí. Více informací o příkazech plotly, které se mají použít, najdeš v fig.show() a 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")

Hovering over the output shows information such as the start, finish, and duration.

Pochopení vygenerovaného grafu​

Obrázek výstupu dat časování obvodu z draw_circuit_schedule_timing přenáší následující informace:

  • Osa X je čas v jednotkách dt sekund, kde 1 dt = 1 plánovací cyklus. Hodnotu dt backendu najdeš pomocí backend.dt.

  • Osa Y je kanál (představ si kanály jako nástroje, které vysílají pulzy).

    • Receive channel - Jediný kanál, který není sám o sobě nástrojem. Je to instrukce přehrávaná na všech kanálech, které jsou v danou dobu součástí komunikačního postupu s hubem.

    • Qubit x - Budicí kanál pro qubit x.

    • AWGRx_y (odečet generátoru libovolných průběhů) - Používán vyčítacími kanály ke komunikaci při měření qubitů. Argumenty x a y odpovídají ID čtecího přístroje a číslu qubitu.

    • Hub - Řídí vysílání.

Každá instrukce má navíc formát X_Y, kde X je název instrukce a Y je typ pulzu. Typ play aplikuje řídicí pulzy a capture zaznamenává stav Qubitu. Můžeš také najet myší na každou instrukci a získat více podrobností. Předchozí obrázek například ukazuje řídicí pulz pro Gate X aplikovaný na qubit 10 v čase 1161 dt.

Ucelený příklad (od začátku do konce)​

Tento příklad ukazuje, jak povolit tuto možnost, získat informace o časování obvodu z metadat a zobrazit je jako obrázek.

Nejprve nastav prostředí, definuj obvody a převeď je na obvody ISA a definuj a spusť úlohy.

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

# Legacy server-side primitive before qiskit-ibm-runtime v0.50.0
# from qiskit_ibm_runtime import Sampler

# Client-side primitive introduced in qiskit-ibm-runtime v0.50.0
from qiskit_ibm_runtime.executor_sampler import Sampler

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 = Sampler(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()})"
)
>>> Job ID: dbjed5pkdqps7390ev00 (DONE)

Dále získej časování harmonogramu obvodu:

# Get the circuit schedule timing
result[0].metadata["compilation"]["scheduler_timing"]["timing"]
'main,rz_0,Qubit 0,875,0,shift_phase\nmain,sx_0,Qubit 0,875,6,play\nmain,sx_0,Qubit 0,879,0,shift_phase\nmain,rz_0,Qubit 0,882,0,shift_phase\nmain,barrier,Qubit 0,882,0,barrier\nmain,measure_0,Qubit 0,882,180,play\nmain,measure_0,AWGR0_0,1003,205,capture\nmain,barrier,Qubit 0,1409,0,barrier\nmain,broadcast,Hub,1003,406,broadcast\nmain,receive,Receive,1409,7,receive\nthen,x_0,Qubit 0,1424,6,play\nmain,barrier,Qubit 0,1437,0,barrier\nmain,measure_0,Qubit 0,1437,180,play\nmain,measure_0,AWGR0_0,1558,205,capture\nmain,barrier,Qubit 0,1852,0,barrier\nmain,barrier,Qubit 0,1852,0,barrier\nmain,FINI_0,Qubit 0,1852,180,play\nmain,FINI_0,AWGR0_0,1973,205,capture\nmain,FINI_0,Qubit 0,2267,6,play\nmain,FINI_0,Qubit 0,2273,180,play\nmain,FINI_0,AWGR0_0,2394,205,capture\nmain,FINI_0,Qubit 0,2688,6,play\nmain,barrier,Qubit 0,2694,0,barrier\n'

Nakonec můžeš vizualizovat a uložit časování:

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

Další kroky​