Mewakili komputer kuantum untuk Transpiler
Versi pakej
Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan menggunakan versi ini atau yang lebih baharu.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Untuk menukar Circuit abstrak kepada Circuit ISA yang boleh berjalan pada QPU tertentu (unit pemprosesan kuantum), Transpiler memerlukan maklumat tertentu tentang QPU. Maklumat ini ditemui di dua tempat: objek BackendV2 (atau BackendV1 warisan) yang anda rancang untuk menghantar kerja, dan atribut Target backend.
Targetmengandungi semua kekangan yang relevan peranti, seperti Gate asas natif, konektiviti Qubit, dan maklumat denyutan atau pemasaan.BackendmemilikiTargetsecara lalai, mengandungi maklumat tambahan -- sepertiInstructionScheduleMap, dan menyediakan antara muka untuk menghantar kerja Circuit kuantum.
Anda juga boleh memberikan maklumat secara eksplisit untuk Transpiler gunakan, contohnya, jika anda mempunyai kes penggunaan tertentu, atau jika anda percaya maklumat ini akan membantu Transpiler menghasilkan Circuit yang lebih dioptimumkan.
Ketepatan di mana Transpiler menghasilkan Circuit yang paling sesuai untuk perkakasan tertentu bergantung pada berapa banyak maklumat yang dimiliki Target atau Backend tentang kekanannya.
Kerana banyak algoritma transpilasi asas adalah stokastik, tiada jaminan bahawa Circuit yang lebih baik akan ditemui.
Halaman ini menunjukkan beberapa contoh menghantar maklumat QPU kepada Transpiler. Contoh-contoh ini menggunakan target dari backend mock FakeSherbrooke.
Konfigurasi lalaiβ
Penggunaan paling mudah Transpiler adalah dengan menyediakan semua maklumat QPU dengan menyediakan Backend atau Target. Untuk memahami cara Transpiler berfungsi dengan lebih baik, bina Circuit dan transpilkannya dengan maklumat berbeza, seperti berikut.
Import perpustakaan yang diperlukan dan instantiasikan QPU:
Untuk menukar Circuit abstrak kepada Circuit ISA yang boleh berjalan pada pemproses tertentu, Transpiler memerlukan maklumat tertentu tentang pemproses. Biasanya, maklumat ini disimpan dalam Backend atau Target yang disediakan kepada Transpiler, dan tiada maklumat lanjut diperlukan. Walau bagaimanapun, anda juga boleh memberikan maklumat secara eksplisit untuk Transpiler gunakan, contohnya, jika anda mempunyai kes penggunaan tertentu, atau jika anda percaya maklumat ini akan membantu Transpiler menghasilkan Circuit yang lebih dioptimumkan.
Topik ini menunjukkan beberapa contoh menghantar maklumat kepada Transpiler. Contoh-contoh ini menggunakan target dari backend mock FakeSherbrooke.
# 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
Circuit contoh menggunakan instans efficient_su2 dari perpustakaan Circuit Qiskit.
from qiskit.circuit.library import efficient_su2
qc = efficient_su2(12, entanglement="circular", reps=1)
qc.draw("mpl")
Contoh ini menggunakan tetapan lalai untuk transpilasi ke target backend, yang menyediakan semua maklumat yang diperlukan untuk menukar Circuit kepada yang akan berjalan pada 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)
Contoh ini digunakan dalam bahagian kemudian topik ini untuk menggambarkan bahawa peta gandeng dan Gate asas adalah maklumat penting yang perlu diberikan kepada Transpiler untuk pembinaan Circuit yang optimum. QPU biasanya boleh memilih tetapan lalai untuk maklumat lain yang tidak diberikan, seperti pemasaan dan penjadualan.
Peta gandengβ
Peta gandeng adalah graf yang menunjukkan Qubit mana yang disambungkan dan oleh itu mempunyai Gate dua-Qubit antara mereka. Kadang-kadang graf ini adalah berarah, bermakna Gate dua-Qubit hanya boleh pergi dalam satu arah. Walau bagaimanapun, Transpiler boleh sentiasa membalikkan arah Gate dengan menambah Gate satu-Qubit tambahan. Circuit kuantum abstrak boleh sentiasa diwakili pada graf ini, walaupun konektivitinya terhad, dengan memperkenalkan Gate SWAP untuk memindahkan maklumat kuantum.
Qubit dari Circuit abstrak kami dipanggil Qubit maya dan yang pada peta gandeng adalah Qubit fizikal. Transpiler menyediakan pemetaan antara Qubit maya dan fizikal. Salah satu langkah pertama dalam transpilasi, peringkat susun atur, melakukan pemetaan ini.
Walaupun peringkat penghala saling berkait dengan peringkat susun atur β yang memilih Qubit sebenar β secara lalai, topik ini menganggap mereka sebagai peringkat berasingan untuk kesederhanaan. Gabungan penghala dan susun atur dipanggil pemetaan Qubit. Ketahui lebih lanjut tentang peringkat-peringkat ini dalam topik Peringkat Transpiler.
Hantar argumen kata kunci coupling_map untuk melihat kesannya pada 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)
Seperti yang ditunjukkan di atas, beberapa Gate SWAP telah dimasukkan (setiap satu terdiri daripada tiga Gate CX), yang akan menyebabkan banyak ralat pada peranti semasa. Untuk melihat Qubit mana yang dipilih pada topologi Qubit sebenar, gunakan plot_circuit_layout dari Visualisasi Qiskit:
from qiskit.visualization import plot_circuit_layout
plot_circuit_layout(qc_t_cm_lv0, backend, view="physical")
Ini menunjukkan bahawa Qubit maya 0-11 kami dipetakan secara trivial ke barisan Qubit fizikal 0-11. Mari kita kembali ke lalai (optimization_level=1), yang menggunakan VF2Layout jika sebarang penghala diperlukan.
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)
Kini tiada Gate SWAP dimasukkan dan Qubit fizikal yang dipilih adalah sama apabila menggunakan kelas target.
from qiskit.visualization import plot_circuit_layout
plot_circuit_layout(qc_t_cm_lv1, backend, view="physical")
Kini susun atur adalah dalam bentuk cincin. Kerana susun atur ini menghormati konektiviti Circuit, tiada Gate SWAP, memberikan Circuit yang jauh lebih baik untuk pelaksanaan.
Gate asasβ
Setiap komputer kuantum menyokong set arahan yang terhad, dipanggil Gate asas nya. Setiap Gate dalam Circuit mesti diterjemahkan kepada elemen set ini. Set ini hendaklah terdiri daripada Gate satu- dan dua-Qubit yang menyediakan set Gate universal, bermakna sebarang operasi kuantum boleh didekomposisikan kepada Gate-gate tersebut. Ini dilakukan oleh BasisTranslator, dan Gate asas boleh ditentukan sebagai argumen kata kunci kepada Transpiler untuk menyediakan maklumat ini.
basis_gates = list(target.operation_names)
print(basis_gates)
['sx', 'switch_case', 'x', 'if_else', 'measure', 'for_loop', 'delay', 'ecr', 'id', 'reset', 'rz']
Gate satu-Qubit lalai pada ibm_sherbrooke adalah rz, x, dan sx, dan Gate dua-Qubit lalai adalah ecr (resonans silang gema). Gate CX dibina dari Gate ecr, jadi pada beberapa QPU ecr ditentukan sebagai Gate asas dua-Qubit, sementara pada yang lain cx adalah lalai. Gate ecr adalah bahagian belitan Gate cx. Selain Gate kawalan, terdapat juga arahan delay dan measurement.
QPU mempunyai Gate asas lalai, tetapi anda boleh memilih Gate apa sahaja yang anda mahukan, selagi anda menyediakan arahan atau menambah Gate denyutan (lihat Cipta lintasan Transpiler.) Gate asas lalai adalah yang telah dilakukan penentukuran pada QPU, jadi tiada arahan/Gate denyutan lanjut perlu disediakan. Contohnya, pada beberapa QPU cx adalah Gate dua-Qubit lalai dan ecr pada yang lain. Lihat senarai kemungkinan Gate dan operasi natif untuk butiran lanjut.
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)
Perhatikan bahawa objek CXGate telah didekomposisikan kepada Gate ecr dan Gate asas satu-Qubit.
Kadar ralat perantiβ
Kelas Target boleh mengandungi maklumat tentang kadar ralat untuk operasi pada peranti.
Contohnya, kod berikut mendapatkan semula sifat-sifat Gate resonans silang gema (ECR) antara Qubit 1 dan 0 (perhatikan bahawa Gate ECR adalah berarah):
target["ecr"][(1, 0)]
InstructionProperties(duration=5.333333333333332e-07, error=0.007494257741828603)
Output memaparkan tempoh Gate (dalam saat) dan kadar ralatnya. Untuk mendedahkan maklumat ralat kepada Transpiler, bina model target dengan basis_gates dan coupling_map dari atas dan isi dengan nilai ralat dari backend FakeSherbrooke.
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)
Transpilasi dengan target baharu kami err_targ sebagai 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)
Kerana target mengandungi maklumat ralat, lintasan VF2PostLayout cuba mencari Qubit optimum untuk digunakan, menghasilkan Circuit yang sama yang asalnya ditemui dengan Qubit fizikal yang sama.
Langkah seterusnyaβ
- Fahami Tetapan lalai dan pilihan konfigurasi Transpilasi.
- Semak topik Parameter yang biasa digunakan untuk transpilasi.
- Cuba panduan Bandingkan tetapan Transpiler.
- Lihat Dokumentasi API Transpile.