Itakda ang optimization level ng transpiler
Package versions
Ang code sa pahinang ito ay ginawa gamit ang mga sumusunod na kinakailangan. Inirerekomenda naming gamitin ang mga bersyong ito o mas bago pa.
qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0
Ang mga tunay na quantum device ay naaapektuhan ng ingay at mga gate error, kaya ang pag-optimize ng mga circuit para mabawasan ang kanilang depth at bilang ng gate ay malaki ang maiaambag sa pagpapabuti ng mga resultang makukuha mula sa pagpapatakbo ng mga circuit na iyon.
Ang function na generate_preset_pass_manager ay may isang kinakailangang positional argument, ang optimization_level, na kumokontrol kung gaano kalaking pagsisikap ang ginugugol ng Transpiler sa pag-optimize ng mga circuit. Ang argument na ito ay maaaring maging integer na may halagang 0, 1, 2, o 3.
Ang mas mataas na optimization level ay nagbibigay ng mas na-optimize na mga circuit, ngunit mas matagal ang oras ng pag-compile.
Ang sumusunod na talahanayan ay nagpapaliwanag ng mga optimization na isinasagawa sa bawat setting.
| Optimization Level | Paglalarawan |
|---|---|
| 0 | Walang optimization: karaniwang ginagamit para sa hardware characterization
|
| 1 | Magaan na optimization:
|
| 2 | Katamtamang optimization:
|
| 3 | Mataas na Optimization:
|
Ang optimization level sa praktika
Dahil ang mga two-qubit gate ay karaniwang pinaka-malaking pinagmumulan ng mga error, maaari nating tantiyahin ang "hardware efficiency" ng transpilation sa pamamagitan ng pagbibilang ng bilang ng mga two-qubit gate sa resultang circuit. Dito, susubukan natin ang iba't ibang optimization level sa isang input circuit na binubuo ng isang random unitary na sinusundan ng isang SWAP gate.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "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.circuit.library import UnitaryGate
from qiskit.quantum_info import Operator, random_unitary
UU = random_unitary(4, seed=12345)
rand_U = UnitaryGate(UU)
qc = QuantumCircuit(2)
qc.append(rand_U, range(2))
qc.swap(0, 1)
qc.draw("mpl", style="iqp")
Ang FakeSherbrooke mock backend mula sa qiskit_ibm_runtime ay ginagamit sa mga halimbawang ito, ngunit maaari mo itong subukan sa anumang Qiskit-compatible na tunay o pekeng backend. Ang iyong mga resulta ay maaaring mag-iba.
Una, i-transpile natin gamit ang optimization level 0.
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
backend = FakeSherbrooke()
pass_manager = generate_preset_pass_manager(
optimization_level=0, backend=backend, seed_transpiler=12345
)
qc_t1_exact = pass_manager.run(qc)
qc_t1_exact.draw("mpl", idle_wires=False)
Ang na-transpile na circuit ay may anim na two-qubit ECR gate.
Ulitin para sa optimization level 1:
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
backend = FakeSherbrooke()
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, seed_transpiler=12345
)
qc_t1_exact = pass_manager.run(qc)
qc_t1_exact.draw("mpl", idle_wires=False)
Ang na-transpile na circuit ay mayroon pa ring anim na ECR gate, ngunit nabawasan ang bilang ng mga single-qubit gate.
Ulitin para sa optimization level 2:
pass_manager = generate_preset_pass_manager(
optimization_level=2, backend=backend, seed_transpiler=12345
)
qc_t2_exact = pass_manager.run(qc)
qc_t2_exact.draw("mpl", idle_wires=False)
Ito ay nagbibigay ng parehong resulta gaya ng optimization level 1. Tandaan na ang pagdaragdag ng antas ng optimization ay hindi palaging nagbabago ng resulta.
Ulitin muli, gamit ang optimization level 3:
pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, seed_transpiler=12345
)
qc_t3_exact = pass_manager.run(qc)
qc_t3_exact.draw("mpl", idle_wires=False)
Ngayon, tatlo na lang ang ECR gate. Nakukuha natin ang resultang ito dahil sa optimization level 3, sinusubukan ng Qiskit na muling i-synthesize ang mga two-qubit block ng mga gate, at anumang two-qubit gate ay maaaring ipatupad gamit ang hindi hihigit sa tatlong ECR gate. Maaari pa nating mabawasan ang bilang ng ECR gate kung itatakda natin ang approximation_degree sa halagang mas mababa sa 1, na nagpapahintulot sa Transpiler na gumawa ng mga approximation na maaaring magdulot ng kaunting error sa gate decomposition (tingnan ang Mga karaniwang ginagamit na parameter para sa transpilation):
pass_manager = generate_preset_pass_manager(
optimization_level=3,
approximation_degree=0.99,
backend=backend,
seed_transpiler=12345,
)
qc_t3_approx = pass_manager.run(qc)
qc_t3_approx.draw("mpl", idle_wires=False)
Ang circuit na ito ay may dalawang ECR gate lamang, ngunit ito ay isang approximate circuit. Para maunawaan kung paano naiiba ang epekto nito mula sa eksaktong circuit, maaari nating kalkulahin ang fidelity sa pagitan ng unitary operator na ipinapatupad ng circuit na ito, at ng eksaktong unitary. Bago gawin ang kalkulasyon, unang binabawasan natin ang na-transpile na circuit, na naglalaman ng 127 qubit, pababa sa isang circuit na naglalaman lamang ng mga aktibong qubit, na dalawa ang bilang.
import numpy as np
def trace_to_fidelity_2q(trace: float) -> float:
return (4.0 + trace * trace.conjugate()) / 20.0
# Reduce circuits down to 2 qubits so they are easy to simulate
qc_t3_exact_small = QuantumCircuit.from_instructions(qc_t3_exact)
qc_t3_approx_small = QuantumCircuit.from_instructions(qc_t3_approx)
# Compute the fidelity
exact_fid = trace_to_fidelity_2q(
np.trace(np.dot(Operator(qc_t3_exact_small).adjoint().data, UU))
)
approx_fid = trace_to_fidelity_2q(
np.trace(np.dot(Operator(qc_t3_approx_small).adjoint().data, UU))
)
print(
f"Synthesis fidelity\nExact: {exact_fid:.3f}\nApproximate: {approx_fid:.3f}"
)
Synthesis fidelity
Exact: 1.000+0.000j
Approximate: 0.992+0.000j
Ang pag-aayos ng optimization level ay maaari ring magbago ng iba pang aspeto ng circuit, hindi lamang ang bilang ng ECR gate. Para sa mga halimbawa ng kung paano binabago ng optimization level ang layout, tingnan ang Paglalarawan ng mga quantum computer.
Mga susunod na hakbang
- Para matuto pa tungkol sa function na
generate_preset_passmanager, magsimula sa paksa na Mga default na setting at opsyon sa configuration ng Transpilation. - Magpatuloy sa pag-aaral tungkol sa transpilation gamit ang paksa na Mga yugto ng Transpiler.
- Subukan ang gabay na Ikumpara ang mga setting ng transpiler.
- Subukan ang tutorial na Bumuo ng mga repetition code.
- Tingnan ang dokumentasyon ng Transpile API.