Lumaktaw sa pangunahing nilalaman

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 LevelPaglalarawan
0

Walang optimization: karaniwang ginagamit para sa hardware characterization

  • Pangunahing pagsasalin
  • Layout/Routing: TrivialLayout, kung saan pinipili nito ang parehong pisikal na bilang ng qubit gaya ng virtual at naglalagay ng mga SWAP para gumana ito (gamit ang SabreSwap)
1

Magaang na optimization:

  • Layout/Routing: Unang sinusubukan ang Layout gamit ang TrivialLayout. Kung kailangan ng karagdagang SWAP, hinahanap ang layout na may pinakamaliit na bilang ng SWAP sa pamamagitan ng SabreSwap, pagkatapos ay gumagamit ito ng VF2LayoutPostLayout upang subukang piliin ang pinakamainam na mga qubit sa graph.
  • InverseCancellation
  • 1Q gate optimization
2

Katamtamang optimization:

  • Layout/Routing: Optimization level 1 (walang trivial) + heuristic na na-optimize na may mas malalim na paghahanap at mas maraming pagsubok ng optimization function. Dahil hindi ginagamit ang TrivialLayout, walang pagtatangkang gamitin ang parehong pisikal at virtual na bilang ng qubit.
  • CommutativeCancellation
3

Mataas na Optimization:

  • Optimization level 2 + heuristic na mas na-optimize pa sa layout/routing na may mas malaking pagsisikap/pagsubok
  • Muling synthesis ng mga two-qubit block gamit ang Cartan's KAK Decomposition.
  • Mga unitarity-breaking pass:
    • OptimizeSwapBeforeMeasure: Inililipat ang mga measurement para maiwasan ang mga SWAP
    • RemoveDiagonalGatesBeforeMeasure: Inaalis ang mga gate bago ang mga measurement na hindi makakaapekto sa mga measurement

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

Output of the previous code cell

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)

Output of the previous code cell

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)

Output of the previous code cell

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)

Output of the previous code cell

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)

Output of the previous code cell

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)

Output of the previous code cell

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​

Mga Rekomendasyon