Atur level optimasi transpiler
Versi paket
Kode di halaman ini dikembangkan menggunakan persyaratan berikut. Kami merekomendasikan menggunakan versi ini atau yang lebih baru.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Perangkat kuantum nyata rentan terhadap noise dan error gate, sehingga mengoptimalkan sirkuit untuk mengurangi kedalaman dan jumlah gate-nya bisa secara signifikan meningkatkan hasil yang diperoleh dari eksekusi sirkuit tersebut.
Fungsi generate_preset_pass_manager memiliki satu argumen posisional yang wajib, optimization_level, yang mengontrol seberapa besar usaha yang dikeluarkan transpiler untuk mengoptimalkan sirkuit. Argumen ini bisa berupa integer dengan nilai 0, 1, 2, atau 3.
Level optimasi yang lebih tinggi menghasilkan sirkuit yang lebih optimal dengan konsekuensi waktu kompilasi yang lebih lama.
Tabel berikut menjelaskan optimasi yang dilakukan pada setiap pengaturan.
| Level Optimasi | Deskripsi |
|---|---|
| 0 | Tanpa optimasi: biasanya digunakan untuk karakterisasi hardware
|
| 1 | Optimasi ringan:
|
| 2 | Optimasi menengah:
|
| 3 | Optimasi tinggi:
|
Level optimasi dalam aksi​
Karena gate dua-qubit biasanya menjadi sumber error yang paling signifikan, kita bisa mengukur "efisiensi hardware" dari transpilasi secara kasar dengan menghitung jumlah gate dua-qubit dalam sirkuit yang dihasilkan. Di sini, kita akan mencoba berbagai level optimasi pada sirkuit input yang terdiri dari unitary acak 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-contoh ini. Pertama, mari transpilasi menggunakan level optimasi 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)
Sirkuit hasil transpilasi memiliki enam gate ECR dua-qubit.
Ulangi untuk level optimasi 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)
Sirkuit hasil transpilasi masih memiliki enam gate ECR, tapi jumlah gate single-qubit sudah berkurang.
Ulangi untuk level optimasi 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 hasil yang sama dengan level optimasi 1. Perlu dicatat bahwa meningkatkan level optimasi tidak selalu membuat perbedaan.
Ulangi lagi, dengan level optimasi 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)
Sekarang, hanya ada tiga gate ECR. Kita mendapatkan hasil ini karena pada level optimasi 3, Qiskit mencoba mensintesis ulang blok gate dua-qubit, dan gate dua-qubit manapun bisa diimplementasikan menggunakan paling banyak tiga gate ECR. Kita bisa mendapatkan lebih sedikit gate ECR lagi jika kita mengatur approximation_degree ke nilai kurang dari 1, yang memungkinkan transpiler membuat aproksimasi yang mungkin menimbulkan sedikit error dalam dekomposisi gate (lihat Parameter yang umum 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)
Sirkuit ini hanya memiliki dua gate ECR, tapi ini adalah sirkuit aproksimasi. Untuk memahami seberapa berbeda efeknya dari sirkuit eksak, kita bisa menghitung fidelitas antara operator unitary yang diimplementasikan sirkuit ini dengan unitary eksak. Sebelum melakukan komputasi, kita terlebih dahulu mereduksi sirkuit hasil transpilasi yang berisi 127 qubit menjadi sirkuit yang hanya berisi qubit aktif, yaitu dua qubit.
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
Mengatur level optimasi juga bisa mengubah aspek lain dari sirkuit, tidak hanya jumlah gate ECR. Untuk contoh bagaimana pengaturan level optimasi mengubah layout, lihat Merepresentasikan komputer kuantum.
Langkah selanjutnya​
- Untuk mempelajari lebih lanjut tentang fungsi
generate_preset_passmanager, mulai dengan topik Pengaturan default dan opsi konfigurasi transpilasi. - Lanjutkan belajar tentang transpilasi dengan topik Tahap-tahap Transpiler.
- Coba panduan Bandingkan pengaturan transpiler.
- Coba tutorial Buat kode repetisi.
- Lihat Dokumentasi API Transpile.