Tetapkan tahap pengoptimuman Transpiler
Versi pakej
Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan penggunaan versi ini atau yang lebih baharu.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Peranti kuantum sebenar terdedah kepada hingar dan ralat Gate, jadi mengoptimumkan Circuit untuk mengurangkan kedalaman dan bilangan Gate boleh meningkatkan keputusan yang diperoleh daripada pelaksanaan Circuit tersebut dengan ketara.
Fungsi generate_preset_pass_manager mempunyai satu argumen kedudukan yang diperlukan, optimization_level, yang mengawal sejauh mana usaha yang dihabiskan Transpiler untuk mengoptimumkan Circuit. Argumen ini boleh berupa integer yang mengambil salah satu nilai 0, 1, 2, atau 3.
Tahap pengoptimuman yang lebih tinggi menghasilkan Circuit yang lebih dioptimumkan dengan kos masa kompilasi yang lebih lama.
Jadual berikut menerangkan pengoptimuman yang dilakukan dengan setiap tetapan.
| Tahap Pengoptimuman | Penerangan |
|---|---|
| 0 | Tiada pengoptimuman: biasanya digunakan untuk pencirian perkakasan
|
| 1 | Pengoptimuman ringan:
|
| 2 | Pengoptimuman sederhana:
|
| 3 | Pengoptimuman tinggi:
|
Tahap pengoptimuman dalam tindakan​
Memandangkan Gate dua Qubit biasanya merupakan sumber ralat yang paling ketara, kita boleh menganggarkan "kecekapan perkakasan" transpilasi secara kasar dengan mengira bilangan Gate dua Qubit dalam Circuit yang dihasilkan. Di sini, kita akan mencuba tahap pengoptimuman yang berbeza pada Circuit input yang terdiri daripada unitari rawak diikuti oleh Gate SWAP.
# 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")
Kita akan menggunakan Backend tiruan FakeSherbrooke dalam contoh kita. Pertama, mari transpil menggunakan tahap pengoptimuman 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)
Circuit yang ditranspil mempunyai enam Gate ECR dua Qubit.
Ulang untuk tahap pengoptimuman 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)
Circuit yang ditranspil masih mempunyai enam Gate ECR, tetapi bilangan Gate satu Qubit telah berkurangan.
Ulang untuk tahap pengoptimuman 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)
Ini menghasilkan keputusan yang sama seperti tahap pengoptimuman 1. Perhatikan bahawa meningkatkan tahap pengoptimuman tidak selalu membuat perbezaan.
Ulang semula, dengan tahap pengoptimuman 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)
Kini, hanya ada tiga Gate ECR. Kita memperoleh keputusan ini kerana pada tahap pengoptimuman 3, Qiskit cuba mensintesis semula blok Gate dua Qubit, dan mana-mana Gate dua Qubit boleh dilaksanakan menggunakan paling banyak tiga Gate ECR. Kita boleh mendapatkan lebih sedikit Gate ECR jika kita menetapkan approximation_degree kepada nilai kurang daripada 1, membenarkan Transpiler membuat anggaran yang mungkin memperkenalkan beberapa ralat dalam penguraian Gate (lihat Parameter yang kerap digunakan untuk transpilasi):
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)
Circuit ini hanya mempunyai dua Gate ECR, tetapi ia adalah Circuit anggaran. Untuk memahami bagaimana kesannya berbeza daripada Circuit tepat, kita boleh mengira kesetiaan antara operator unitari yang dilaksanakan oleh Circuit ini, dan unitari tepat. Sebelum melakukan pengiraan, kita terlebih dahulu mengurangkan Circuit yang ditranspil, yang mengandungi 127 Qubit, kepada Circuit yang hanya mengandungi Qubit aktif, iaitu dua.
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
Melaraskan tahap pengoptimuman juga boleh mengubah aspek lain Circuit, bukan sekadar bilangan Gate ECR. Untuk contoh bagaimana menetapkan tahap pengoptimuman mengubah susun atur, lihat Mewakili komputer kuantum.
Langkah seterusnya​
- Untuk mengetahui lebih lanjut tentang fungsi
generate_preset_passmanager, mulakan dengan topik Tetapan lalai dan pilihan konfigurasi transpilasi. - Teruskan pembelajaran tentang transpilasi dengan topik Peringkat Transpiler.
- Cuba panduan Bandingkan tetapan Transpiler.
- Cuba tutorial Bina kod ulangan.
- Lihat Dokumentasi API Transpile.