Itakda ang optimization level ng transpiler
Mga bersyon ng package
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.3.0
qiskit-ibm-runtime~=0.43.1
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 sa gaano kahirap subukan ng Transpiler na i-optimize ang 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 | Magaang na optimization:
|
| 2 | Katamtamang optimization:
|
| 3 | Mataas na Optimization:
|
Ang optimization level sa gawa​
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 — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
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")
Gagamitin natin ang FakeSherbrooke mock backend sa ating mga halimbawa. 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.