Langkau ke kandungan utama

Bandingkan tetapan Transpiler

Package versions

The code on this page was developed using the following requirements. We recommend using these versions or newer.

qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1

Tetapan Transpiler yang berbeza memberikan pelbagai jenis pengoptimuman kepada Circuit, sering dengan kos masa pemprosesan klasikal yang lebih lama. Panduan ini menelusuri proses penuh membuat, mentranspil, dan menghantar Circuit untuk menunjukkan cara menguji prestasi pelbagai tetapan.

Perhatikan bahawa tetapan yang sama boleh meningkatkan keputusan satu Circuit sambil menghalang yang lain. Pastikan untuk memeriksa Circuit yang ditranspil sebelum menjalankan pada perkakasan sebenar.

Sediakan dan cipta Circuit sampel

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
# Create circuit to test transpiler on
from qiskit import QuantumCircuit
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.circuit.library import grover_operator, DiagonalGate

# Use Statevector object to calculate the ideal output
from qiskit.quantum_info import Statevector
from qiskit.visualization import plot_histogram
from qiskit.transpiler import PassManager

from qiskit.circuit.library import XGate
from qiskit.quantum_info import hellinger_fidelity

Cipta Circuit kecil untuk dicuba dioptimumkan oleh Transpiler. Contoh ini mencipta Circuit yang melaksanakan algoritma Grover dengan oracle yang menandai keadaan 111. Seterusnya, simulasikan taburan ideal (apa yang anda jangka untuk diukur jika anda menjalankan ini pada komputer kuantum sempurna sebanyak kali yang tak terhingga) untuk perbandingan kemudian.

oracle = DiagonalGate([1] * 7 + [-1])
qc = QuantumCircuit(3)
qc.h([0, 1, 2])
qc = qc.compose(grover_operator(oracle))

qc.draw(output="mpl", style="iqp")

Output of the previous code cell

ideal_distribution = Statevector.from_instruction(qc).probabilities_dict()

plot_histogram(ideal_distribution)

Output of the previous code cell

Transpil

Seterusnya, transpil Circuit untuk QPU. Anda akan membandingkan prestasi Transpiler dengan optimization_level ditetapkan kepada 0 (terendah) berbanding 3 (tertinggi). Tahap pengoptimuman terendah melakukan yang minimum yang diperlukan untuk menjalankan Circuit pada peranti; ia memetakan qubit Circuit kepada qubit peranti dan menambah gate swap untuk membenarkan semua operasi dua qubit. Tahap pengoptimuman tertinggi jauh lebih pintar dan menggunakan banyak helah untuk mengurangkan jumlah bilangan gate. Oleh sebab gate berbilang qubit mempunyai kadar ralat yang tinggi dan qubit menyahkoheren dari masa ke masa, Circuit yang lebih pendek seharusnya memberikan keputusan yang lebih baik.

important

Contoh ini menggunakan perkakasan IBM Quantum®, tetapi anda boleh mencubanya pada mana-mana QPU yang serasi dengan Qiskit. Keputusan anda mungkin berbeza.

Sel berikut mentranspil qc untuk kedua-dua nilai optimization_level, mencetak bilangan gate dua qubit, dan menambah Circuit yang ditranspil ke dalam senarai. Sesetengah algoritma Transpiler adalah rawak, jadi ia menetapkan benih untuk kebolehulangan.

# Use Qiskit Runtime to run jobs on hardware
from qiskit_ibm_runtime import (
QiskitRuntimeService,
SamplerV2 as Sampler,
)
# Select the backend with the fewest number of jobs in the queue
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
backend.name
'ibm_marrakesh'
# Need to add measurements to the circuit
qc.measure_all()

# Find the correct two-qubit gate
twoQ_gates = set(["ecr", "cz", "cx"])
for gate in backend.basis_gates:
if gate in twoQ_gates:
twoQ_gate = gate

circuits = []
for optimization_level in [0, 3]:
pm = generate_preset_pass_manager(
optimization_level, backend=backend, seed_transpiler=0
)
t_qc = pm.run(qc)
print(
f"Two-qubit gates (optimization_level={optimization_level}): ",
t_qc.count_ops()[twoQ_gate],
)
circuits.append(t_qc)
Two-qubit gates (optimization_level=0): 21
Two-qubit gates (optimization_level=3): 12

Oleh sebab CNOT biasanya mempunyai kadar ralat yang tinggi, Circuit yang ditranspil dengan optimization_level=3 seharusnya berprestasi jauh lebih baik.

Satu lagi cara anda boleh meningkatkan prestasi ialah melalui penyahgandingan dinamikal, dengan menggunakan urutan gate pada qubit yang melahu. Ini membatalkan beberapa interaksi yang tidak dikehendaki dengan persekitaran. Sel berikut menambah penyahgandingan dinamikal kepada Circuit yang ditranspil dengan optimization_level=3 dan menambahnya ke dalam senarai.

from qiskit_ibm_runtime.transpiler.passes.scheduling import (
ASAPScheduleAnalysis,
PadDynamicalDecoupling,
)

# Get gate durations so the transpiler knows how long each operation takes
durations = backend.target.durations()

# This is the sequence we'll apply to idling qubits
dd_sequence = [XGate(), XGate()]

# Run scheduling and dynamic decoupling passes on circuit
pm = PassManager(
[
ASAPScheduleAnalysis(durations),
PadDynamicalDecoupling(durations, dd_sequence),
]
)
circ_dd = pm.run(circuits[1])

# Add this new circuit to our list
circuits.append(circ_dd)
circ_dd.draw(output="mpl", style="iqp", idle_wires=False)

Output of the previous code cell

Laksanakan Circuit

Pada ketika ini, anda mempunyai senarai Circuit yang ditranspil dengan tetapan yang berbeza. Seterusnya, jalankan Circuit ini menggunakan primitif Sampler dan simpan keputusan ke result.

sampler = Sampler(backend)
job = sampler.run(
[(circuit) for circuit in circuits], # sample all three circuits
shots=8000,
)
result = job.result()

Lihat keputusan

Akhir sekali, plot keputusan daripada jalankan peranti berbanding taburan ideal. Anda boleh melihat keputusan dengan optimization_level=3 lebih hampir kepada taburan ideal disebabkan bilangan gate yang lebih rendah, dan optimization_level=3 + dd lebih hampir lagi disebabkan penyahgandingan dinamikal.

binary_prob = [
{
k: v / res.data.meas.num_shots
for k, v in res.data.meas.get_counts().items()
}
for res in result
]
plot_histogram(
binary_prob + [ideal_distribution],
bar_labels=False,
legend=[
"optimization_level=0",
"optimization_level=3",
"optimization_level=3 + dd",
"ideal distribution",
],
)

Output of the previous code cell

Anda boleh mengesahkan ini dengan mengira kesetiaan Hellinger antara setiap set keputusan dan taburan ideal (lebih tinggi adalah lebih baik, dan 1 adalah kesetiaan sempurna).

for prob in binary_prob:
print(f"{hellinger_fidelity(prob, ideal_distribution):.3f}")
0.985
0.989
0.988

Langkah seterusnya

Cadangan