Paglalarawan ng mga quantum computer para sa 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
Para ma-convert ang isang abstract circuit sa isang ISA circuit na maaaring tumakbo sa isang partikular na QPU (quantum processing unit), kailangan ng transpiler ng ilang impormasyon tungkol sa QPU. Ang impormasyong ito ay makikita sa dalawang lugar: ang BackendV2 (o legacy na BackendV1) na object na plano mong gamitin para mag-submit ng mga job, at ang Target attribute ng backend.
- Ang
Targetay naglalaman ng lahat ng nauugnay na mga limitasyon ng isang device, tulad ng mga native basis gate nito, koneksyon ng qubit, at impormasyon tungkol sa pulse o timing. - Ang
Backenday may kasamangTargetbilang default, naglalaman ng karagdagang impormasyon -- tulad ngInstructionScheduleMap, at nagbibigay ng interface para sa pag-submit ng mga quantum circuit job.
Maaari ka ring explicitly na magbigay ng impormasyon para gamitin ng transpiler, halimbawa, kung mayroon kang tiyak na use case, o kung naniniwala kang makakatulong ang impormasyong ito sa transpiler na makabuo ng mas optimized na circuit.
Ang katumpakan ng transpiler sa paglikha ng pinakaangkop na circuit para sa partikular na hardware ay nakasalalay sa dami ng impormasyon na mayroon ang Target o Backend tungkol sa mga limitasyon nito.
Dahil marami sa mga pinagbabatayan na transpilation algorithm ay stochastic, walang garantiya na mahahanap ang mas magandang circuit.
Ipinapakita ng pahinang ito ang ilang halimbawa ng pagpapasa ng impormasyon ng QPU sa transpiler. Ginagamit ng mga halimbawang ito ang target mula sa FakeSherbrooke mock backend.
Default na configurationβ
Ang pinakasimpleng paggamit ng transpiler ay ang magbigay ng lahat ng impormasyon ng QPU sa pamamagitan ng pagbibigay ng Backend o Target. Para mas maunawaan kung paano gumagana ang transpiler, bumuo ng circuit at i-transpile ito gamit ang iba't ibang impormasyon, tulad ng sumusunod.
I-import ang mga kinakailangang library at i-instantiate ang QPU:
Para ma-convert ang isang abstract circuit sa isang ISA circuit na maaaring tumakbo sa isang partikular na processor, kailangan ng transpiler ng ilang impormasyon tungkol sa processor. Karaniwan, ang impormasyong ito ay naka-store sa Backend o Target na ibinibigay sa transpiler, at hindi na kailangan ng karagdagang impormasyon. Gayunpaman, maaari ka ring explicitly na magbigay ng impormasyon para gamitin ng transpiler, halimbawa, kung mayroon kang tiyak na use case, o kung naniniwala kang makakatulong ang impormasyong ito sa transpiler na makabuo ng mas optimized na circuit.
Ipinapakita ng paksang ito ang ilang halimbawa ng pagpapasa ng impormasyon sa transpiler. Ginagamit ng mga halimbawang ito ang target mula sa FakeSherbrooke mock backend.
# Added by doQumentation β required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
backend = FakeSherbrooke()
target = backend.target
Ang halimbawang circuit ay gumagamit ng instance ng efficient_su2 mula sa circuit library ng Qiskit.
from qiskit.circuit.library import efficient_su2
qc = efficient_su2(12, entanglement="circular", reps=1)
qc.draw("mpl")
Ginagamit ng halimbawang ito ang mga default na setting para i-transpile sa target ng backend, na nagbibigay ng lahat ng impormasyong kailangan para ma-convert ang circuit sa isang maaaring tumakbo sa backend.
from qiskit.transpiler import generate_preset_pass_manager
pass_manager = generate_preset_pass_manager(
optimization_level=1, target=target, seed_transpiler=12345
)
qc_t_target = pass_manager.run(qc)
qc_t_target.draw("mpl", idle_wires=False, fold=-1)
Ginagamit ang halimbawang ito sa mga susunod na seksyon ng paksang ito para ipakita na ang coupling map at basis gates ang mahahalagang piraso ng impormasyon na ipapasa sa transpiler para sa pinakamainam na pagbuo ng circuit. Karaniwan, maaaring pumili ang QPU ng mga default na setting para sa iba pang impormasyon na hindi ipinasa, tulad ng timing at scheduling.
Coupling mapβ
Ang coupling map ay isang graph na nagpapakita kung aling mga qubit ang magkakaugnay at samakatuwid ay may two-qubit gates sa pagitan nila. Minsan ang graph na ito ay may direksyon, ibig sabihin ang mga two-qubit gate ay isang direksyon lang maaaring tumakbo. Gayunpaman, palagi naming mababago ng transpiler ang direksyon ng gate sa pamamagitan ng pagdaragdag ng mga karagdagang single-qubit gate. Ang isang abstract quantum circuit ay palaging maaaring katawanin sa graph na ito, kahit limitado ang koneksyon nito, sa pamamagitan ng pagdaragdag ng mga SWAP gate para ilipat ang quantum na impormasyon.
Ang mga qubit mula sa ating mga abstract circuit ay tinatawag na virtual qubits at ang mga nasa coupling map ay physical qubits. Nagbibigay ang transpiler ng mapping sa pagitan ng virtual at physical qubits. Isa sa mga unang hakbang sa transpilation, ang layout stage, ang gumaganap ng mapping na ito.
Kahit magkaugnay ang routing stage at ang layout stage β na pumipili ng aktwal na mga qubit β bilang default, itinuturing ng paksang ito ang mga ito bilang magkahiwalay na mga stage para sa pagiging simple. Ang kumbinasyon ng routing at layout ay tinatawag na qubit mapping. Matuto pa tungkol sa mga stage na ito sa paksa ng Mga stage ng Transpiler.
Ipasa ang coupling_map keyword argument para makita ang epekto nito sa transpiler:
coupling_map = target.build_coupling_map()
pass_manager = generate_preset_pass_manager(
optimization_level=0, coupling_map=coupling_map, seed_transpiler=12345
)
qc_t_cm_lv0 = pass_manager.run(qc)
qc_t_cm_lv0.draw("mpl", idle_wires=False, fold=-1)
Tulad ng nakikita sa itaas, ilang SWAP gates ang naipasok (bawat isa ay binubuo ng tatlong CX gates), na magdudulot ng maraming error sa mga kasalukuyang device. Para makita kung aling mga qubit ang napili sa aktwal na qubit topology, gamitin ang plot_circuit_layout mula sa Qiskit Visualizations:
from qiskit.visualization import plot_circuit_layout
plot_circuit_layout(qc_t_cm_lv0, backend, view="physical")
Ipinapakita nito na ang ating mga virtual qubit 0-11 ay simpleng na-map sa linya ng mga physical qubit 0-11. Bumalik tayo sa default (optimization_level=1), na gumagamit ng VF2Layout kung kailangan ng anumang routing.
pass_manager = generate_preset_pass_manager(
optimization_level=1, coupling_map=coupling_map, seed_transpiler=12345
)
qc_t_cm_lv1 = pass_manager.run(qc)
qc_t_cm_lv1.draw("mpl", idle_wires=False, fold=-1)
Ngayon walang mga SWAP gate na naipasok at ang mga physical qubit na napili ay katulad noong ginamit ang target class.
from qiskit.visualization import plot_circuit_layout
plot_circuit_layout(qc_t_cm_lv1, backend, view="physical")
Ngayon ang layout ay nasa isang ring. Dahil iginagalang ng layout na ito ang koneksyon ng circuit, walang mga SWAP gate, na nagbibigay ng mas magandang circuit para sa pagpapatupad.
Basis gatesβ
Bawat quantum computer ay sumusuporta sa limitadong set ng instruksyon, na tinatawag na basis gates nito. Bawat gate sa circuit ay dapat i-translate sa mga elemento ng set na ito. Ang set na ito ay dapat binubuo ng mga single- at two-qubit gate na nagbibigay ng universal gates set, ibig sabihin maaaring i-decompose ang anumang quantum operation sa mga gate na iyon. Ginagawa ito ng BasisTranslator, at ang basis gates ay maaaring tukuyin bilang keyword argument sa transpiler para ibigay ang impormasyong ito.
basis_gates = list(target.operation_names)
print(basis_gates)
['sx', 'switch_case', 'x', 'if_else', 'measure', 'for_loop', 'delay', 'ecr', 'id', 'reset', 'rz']
Ang mga default na single-qubit gate sa ibm_sherbrooke ay rz, x, at sx, at ang default na two-qubit gate ay ecr (echoed cross-resonance). Ang mga CX gate ay ginawa mula sa mga ecr gate, kaya sa ilang QPU ang ecr ang tinukoy bilang two-qubit basis gate, habang sa iba ang cx ang default. Ang ecr gate ay ang entangling na bahagi ng cx gate. Bukod sa mga control gate, mayroon ding mga delay at measurement na instruksyon.
Ang mga QPU ay may mga default na basis gate, ngunit maaari kang pumili ng anumang gate na gusto mo, basta't nagbigay ka ng instruksyon o nagdaragdag ng pulse gates (tingnan ang Gumawa ng mga transpiler pass.) Ang mga default na basis gate ay ang mga nagkaroon ng calibration sa QPU, kaya hindi na kailangang magbigay ng karagdagang instruksyon/pulse gate. Halimbawa, sa ilang QPU ang cx ang default na two-qubit gate at ecr naman sa iba. Tingnan ang listahan ng posibleng native gates at operations para sa karagdagang detalye.
pass_manager = generate_preset_pass_manager(
optimization_level=1,
coupling_map=coupling_map,
basis_gates=basis_gates,
seed_transpiler=12345,
)
qc_t_cm_bg = pass_manager.run(qc)
qc_t_cm_bg.draw("mpl", idle_wires=False, fold=-1)
Pansinin na ang mga CXGate object ay na-decompose sa mga ecr gate at single-qubit basis gate.
Mga rate ng error ng deviceβ
Ang Target class ay maaaring maglaman ng impormasyon tungkol sa mga rate ng error para sa mga operasyon sa device.
Halimbawa, kinukuha ng sumusunod na code ang mga katangian para sa echoed cross-resonance (ECR) gate sa pagitan ng qubit 1 at 0 (pansinin na ang ECR gate ay may direksyon):
target["ecr"][(1, 0)]
InstructionProperties(duration=5.333333333333332e-07, error=0.007494257741828603)
Ipinapakita ng output ang tagal ng gate (sa segundo) at ang rate ng error nito. Para ipakita ang impormasyon ng error sa transpiler, bumuo ng target model gamit ang basis_gates at coupling_map mula sa itaas at punan ito ng mga halaga ng error mula sa FakeSherbrooke backend.
from qiskit.transpiler import Target
from qiskit.circuit.controlflow import IfElseOp, SwitchCaseOp, ForLoopOp
err_targ = Target.from_configuration(
basis_gates=basis_gates,
coupling_map=coupling_map,
num_qubits=target.num_qubits,
custom_name_mapping={
"if_else": IfElseOp,
"switch_case": SwitchCaseOp,
"for_loop": ForLoopOp,
},
)
for i, (op, qargs) in enumerate(target.instructions):
if op.name in basis_gates:
err_targ[op.name][qargs] = target.instruction_properties(i)
I-transpile gamit ang ating bagong target na err_targ bilang target:
pass_manager = generate_preset_pass_manager(
optimization_level=1, target=err_targ, seed_transpiler=12345
)
qc_t_cm_bg_et = pass_manager.run(qc)
qc_t_cm_bg_et.draw("mpl", idle_wires=False, fold=-1)
Dahil kasama sa target ang impormasyon ng error, sinusubukan ng VF2PostLayout pass na hanapin ang pinakamainam na mga qubit na gagamitin, na nagbubunga ng parehong circuit na orihinal na nahanap gamit ang parehong mga physical qubit.
Mga susunod na hakbangβ
- Unawain ang Mga default na setting at configuration option ng Transpilation.
- Suriin ang paksa ng Mga karaniwang ginagamit na parameter para sa transpilation.
- Subukan ang gabay na Ikumpara ang mga setting ng transpiler.
- Tingnan ang Dokumentasyon ng Transpile API.