1. Ana sayfa
  2. İçerik planı
  3. Optimization seviyeleri · Qiskit
Qiskit · transpiler ve donanım eşlemesi

Optimization seviyeleri — tek tamsayıyla seçilen transpile politika profili

optimization_level, Qiskit preset transpile yolunda hangi pass paketinin, hangi sıklıkta ve ne kadar agresif çalışacağını kabaca kodlayan kullanıcı düğmesidir. Düşük seviye hızlı derleme ve daha ham çıktı; yüksek seviye daha geniş layout ve routing araması ile daha ağır optimizasyon dalgaları anlamına gelir. Bu sayfa; seviyelerin mimari rolünü, tipik davranış farklarını, derleme maliyeti ile devre kalitesi takasını ve raporlama disiplinini işler. Hangi pass'in tam olarak çalıştığı sürüme göre değişir; burada politika ve ölçütler ön plandadır, imza ezberi değildir.

  • Aralık: tipik olarak 0–3 (preset sözleşmesi)
  • Etki: arama bütçesi + optimizasyon dalgaları
  • Ölçüt: derinlik, iki-qubit, SWAP, transpile süresi

Kavram haritası ve politika düğmesi

optimization_level, tek bir optimizasyon algoritması değil, preset pass yöneticisi için seçilmiş bir politika profilidir. Bu profil; hangi ayrıştırma ve sadeleştirme dalgalarının açılacağını, layout ve routing aramasının ne kadar genişleyeceğini ve bazı şablon eşleştirmelerinin ne kadar agresif uygulanacağını birlikte etkiler. Sürüm yükseltmelerinde aynı sayısal seviye bile iç pass listesinde ince farklar gösterebilir; bu yüzden üretimde yalnızca “3 kullandım” demek yerine kütüphane sürümü ve hedef adı birlikte arşivlenmelidir.

Bu sayfanın sınırı

Belirli bir pass adının hangi sürümde eklendiği veya kaldırıldığı pass manager ve resmi sürüm notları ile takip edilir. Taban kümesinin ne anlama geldiği taban kapıları sayfasında; boru hattı evrelerinin genel sırası transpiler pipeline başlığında çerçevelenir. Burada odak seviye seçiminin maliyet–kalite ve operasyonel sonuçlarıdır.

Algoritma optimizasyonu ile karıştırmayın

Devre yazarken yaptığınız eşdeğerlik sadeleştirmeleri devre optimizasyonu konusuna aittir; optimization_level ise transpiler'ın otomatik derleme politikasını seçer. İkisi birbirini tamamlar; biri diğerinin yerine geçmez.

Mimari özet Seviye = preset içindeki arama ve sadeleştirme agresifliği. Aynı kaynak devrede çıktı metrikleri seviyeyle monoton değildir; hedef ve tohum ile birlikte okunmalıdır.

Seviye 0 ve 1: minimal ve hafif profil

Seviye 0 çoğu zaman “tabanı uygula, topolojik olarak yürütülebilir kıl, fakat ağır arama yapma” yaklaşımına yakındır: derleme hızlıdır, çıktı uzun ve ham kalabilir. Seviye 1 hafif optimizasyon ve daha kontrollü çeviri adımları ekler; üretim yükü olmayan hızlı döngülerde veya teşhis için makul bir başlangıç olabilir. Her iki profil de gerçek donanımda çalışır; fakat hata bütçesi sıkıysa çıktı derinliği gözle izlenmelidir.

Ne zaman tercih edilir?

Seviye 0–1; CI içinde hızlı duman testi, çok büyük devrelerde ön transpile kestirimi veya özel pass zincirinden önce ara durum üretmek için kullanılabilir. Sonuçların bilimsel kıyaslaması için genelde daha yüksek seviye veya özel politika gerekir.

Layout ve routing açısından

Düşük seviyelerde layout ve routing araması sınırlı kalır; uzun menzilli etkileşimlerde SWAP ve iki-qubit sayısı yükselebilir. Bu etkiler layout seçimi ve yönlendirme sayfalarıyla birlikte değerlendirilir.

Seviye 2: üretim için yaygın denge

Birçok ekip için seviye 2 varsayılan üretim profili olarak kabul edilir: derleme süresi ile devre kalitesi arasında makul bir denge kurar, layout ve routing için daha geniş arama bütçesi açar ve bir dizi sadeleştirme dalgasını çalıştırır. Tam olarak hangi pass'lerin devreye girdiği sürüme göre değişse de, zihinsel model şudur: “hemen çalıştır” ile “gece boyu agresif derle” arasında orta yol.

Metrik beklentisi

Aynı devre ve hedefte seviye 1'den 2'ye geçişte derinlik ve iki-qubit sayısında belirgin düşüş görmek yaygındır; kazanç sıfır veya negatif de olabilir çünkü hedefin hata modeli farklı kenarları ödüllendirebilir. Bu yüzden kıyaslama her zaman metrik + hedef + tohum üçlüsüyle yapılmalıdır.

Operasyonel not

Bulutta kısa süreli denemelerde seviye 2, kuyruk öncesi transpile maliyetini makul tutarken yürütülebilir devre üretir. Uzun varyasyonel döngülerde transpile'ı her iterasyonda tekrarlamak pahalıysa, önbellekleme veya sabit pass manager stratejisi düşünülmelidir.

Seviye 3: agresif arama ve sadeleştirme

Seviye 3, preset içinde mümkün olan en agresif genel profillerden birini seçer: daha geniş layout ve routing araması, daha fazla optimizasyon turu ve daha ağır şablon eşleştirmeleri. Bu, bazen derinlikte dramatik iyileşme getirirken transpile süresini ve bellek tüketimini belirgin biçimde artırır. Çok qubitli ve yoğun iki-qubit ağı olan devrelerde seviye 3'ün pratik süresi üstel büyüme gösterebilir.

Ne zaman mantıklıdır?

Yüksek maliyetli bir donanım koşusu öncesi, nihai yayın artefaktı üretirken veya bir kez derlenip çok kez yürütülecek bir devre paketinde seviye 3 araştırılabilir. Aynı betiğin her küçük değişiminde seviye 3 çalıştırmak ise geliştirici verimliliğini düşürür.

SWAP ve taban açısından

Agresif arama bazen açık swap sayısını düşürürken taban ayrıştırması sonrası toplam iki-qubit sayısını farklı şekilde yeniden dağıtır; raporlama önerisi SWAP ekleme sayfasındaki çift metrik disipliniyle uyumludur.

Derleme süresi, bellek ve CI disiplini

Transpile, klasik derleyicide olduğu gibi zaman ve bellek tüketir; seviye arttıkça bu maliyet genelde artar. Sürekli entegrasyon hatlarında “her commit'te seviye 3” politikası, küçük ekiplerde bile pipeline süresini şişirebilir. Pratik çözüm: geliştirme aşamasında düşük seviye veya önbellekli sonuç, yayın ve donanım öncesi doğrulamada yüksek seviye.

Önbellekleme ve artefakt

Aynı kaynak devre ve hedef için transpile çıktısını dosyaya yazmak, tekrarlanan derlemeyi ortadan kaldırır; ancak hedef kalibrasyonu değiştiğinde artefaktın geçerliliği sorgulanmalıdır.

Paralelleştirme sınırı

Python süreç modeli ve GIL nedeniyle tek bir transpile çağrısı çoğu zaman tek çekirdeği yoğun kullanır; yüksek seviye “ücretsiz paralellik” getirmez. Çoklu devre senaryolarında iş yükü dış süreçlere bölünebilir; bu mimari karar burada işlenmez, fakat seviye seçiminin toplam duvar saati süresine etkisini hesaba katın.

Hedef backend ve taban etkileşimi

Aynı optimization_level sayısı, farklı Target sözlüklerinde farklı sonuç üretir: native küme, coupling topolojisi ve kenar başına hata tahminleri arama uzayını şekillendirir. Bu yüzden “seviye 2 her zaman yeterlidir” cümlesi yalnızca belirli bir cihaz ailesi için savunulabilir. Simülatörde kısa görünen devre, gerçek cihaz tabanında uzayabilir.

Fake backend ile ölçüm

FakeBackend, gerçek bir cihazın target taklidini taşıdığı için seviye kıyasını yerel ve hesapsız yapmayı kolaylaştırır. Ayrıntı fake backend kullanımı sayfasındadır.

Taban ve zamanlama köprüsü

Seviye yükseldikçe üretilen kapı sayısı değişebileceği gibi, sonraki zamanlama aşamasının göreceği süre grafiği de değişir. Uçtan uca maliyet, yalnızca transpile seviyesiyle tamamlanmaz.

Tohum, sürüm ve raporlama

Yüksek seviyelerde stokastik arama ve eşdeğer çözüm kırılımları sıklaşır. Aynı devre, hedef ve seviye ile bile farklı seed_transpiler değerleri farklı layout ve routing sonuçları üretebilir. Yayınlanan sonuçlarda seviye yalnız başına yazılmamalı; tohum, kütüphane sürümü, backend adı ve özet metrikler (derinlik, iki-qubit, SWAP) birlikte arşivlenmelidir. Bu disiplin transpiler pipeline · determinizm bölümüyle örtüşür.

Önerilen log şeması

Minimum alanlar: kaynak devre özeti, hedef adı, optimization level, seed, Qiskit sürümü, transpile süresi (duvar saati), çıktı metrikleri, nihai layout kısa özeti.

Özel politika

Preset seviyeleri yeterli değilse, kullanıcı kendi pass manager politikasını kurar; bu, seviye sayısını aşan ince kontrol demektir. Özel pass sayfası bu genişlemeye köprüdür.

Pratik kural Üretimde tek bir seviye sabitleyin; deneysel iyileştirme için yüksek seviyeyi ayrı dalda ölçün, kazanç yoksa varsayılanı koruyun.

Kod laboratuvarı

Örnekler yerel FakeManilaV2 üzerindedir: seviye 0–3 için derinlik ve kapı sayımları, generate_preset_pass_manager ile aynı politikanın doğrudan çalıştırılması ve kaba süre ölçümü.

level_scan.py Python
from qiskit import QuantumCircuit, transpile
from qiskit_ibm_runtime.fake_provider import FakeManilaV2

qc = QuantumCircuit(4)
qc.h(range(4))
qc.cx(0, 3)
qc.cx(1, 2)
qc.cx(0, 2)

backend = FakeManilaV2()
seed = 7
for lvl in range(4):
    tqc = transpile(qc, backend=backend, optimization_level=lvl, seed_transpiler=seed)
    ops = tqc.count_ops()
    cx = ops.get("cx", 0)
    sw = ops.get("swap", 0)
    print(f"level {lvl}: depth={tqc.depth()} cx={cx} swap={sw}")
qiskit 0–3 taraması · metrikler UTF-8 · LF
preset_pm_level.py Python
from qiskit import QuantumCircuit
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime.fake_provider import FakeManilaV2

qc = QuantumCircuit(3)
qc.cx(0, 2)
qc.cx(0, 1)

backend = FakeManilaV2()
pm = generate_preset_pass_manager(optimization_level=3, backend=backend, seed_transpiler=42)
tqc = pm.run(qc)
print(dict(tqc.count_ops()), "depth", tqc.depth())
qiskit Preset PM · seviye 3 UTF-8 · LF
transpile_wall_time.py Python
import time
from qiskit import QuantumCircuit, transpile
from qiskit_ibm_runtime.fake_provider import FakeManilaV2

qc = QuantumCircuit(5)
qc.h(range(5))
for a in range(4):
    qc.cx(a, a + 1)
qc.cx(0, 4)

backend = FakeManilaV2()
for lvl in (1, 3):
    t0 = time.perf_counter()
    transpile(qc, backend=backend, optimization_level=lvl, seed_transpiler=0)
    dt = time.perf_counter() - t0
    print(f"level {lvl}: {dt:.4f} s wall time")
python Seviye · duvar saati (kabaca) UTF-8 · LF

İleri okuma ve özet

optimization_level, transpile politikasını tek düğmede toplar; içerik sürüme ve hedefe göre evrilir. Düşük seviye hız ve teşhis, orta seviye üretim dengesi, yüksek seviye ise nihai kalite araması için uygundur. Tüm kıyaslar tohum, sürüm ve metriklerle birlikte arşivlenmelidir.

Özet Seviye = preset agresifliği. Monoton iyileşme beklemeyin; hedef, tohum ve sürümle birlikte raporlayın. CI ve geliştirme için farklı seviye politikaları ayırın.