1. Ana sayfa
  2. İçerik planı
  3. Fake backend kullanımı · Qiskit
Qiskit · devre yürütme

Fake backend kullanımı — gerçek bir cihazın donmuş kopyasıyla geliştirme

Qiskit'in fake provider kataloğu, gerçek IBM cihazlarının belirli bir andaki sözleşmesini (qubit sayısı, native kapı seti, coupling map, kapı süreleri ve hata oranları) ve genellikle eşlik eden gürültü profilini donmuş bir Python sınıfı olarak paketler. Bu sınıflar, "quantum bilgisayar mimarisini yazılım üzerinden kontrol etme sistemi" yaklaşımımızda kritik bir rol oynar: cihazın anlık durumunu beklemeden, ağa çıkmadan, hesap açmadan, gerçek mimariyle aynı arayüzde geliştirme yapmayı sağlar. Bu sayfa daha önce yazdığımız backend özellikleri, coupling map ve kalibrasyon verileri sayfalarındaki okuma rehberlerini tekrar etmez; doğrudan fake backend nesnesinin kendisini — kataloğunu, davranışını, gerçek cihazla farkını, geliştirme/test desenlerindeki yerini — inceler. Tüm kod örnekleri yereldir.

  • Nesne: qiskit_ibm_runtime.fake_provider
  • Rol: çevrimdışı + tekrar üretilebilir
  • Sınır: donmuş anlık · canlı değil

FakeBackend nedir, ne değildir?

FakeBackend, gerçek bir IBM cihazının belirli bir tarihteki sözleşmesini ve gürültü profilini, aynı BackendV2 arayüzünü uygulayan bir Python sınıfı olarak paketleyen yapıdır. Sınıfı çağırdığınızda ortaya çıkan nesne, gerçek bir cihazla aynı şekilde sorgulanır: backend.name, backend.num_qubits, backend.target, backend.coupling_map, backend.qubit_properties(q). Aradaki tek fark: tüm bu alanlar donmuş bir anın değerlerini taşır ve değişmez.

"Mock" değil, kayıt

FakeBackend bir mock değildir; eline geçen değerler yazılımcı tarafından uydurulmuş rakamlar değildir. Gerçek cihazda o tarihte ölçülmüş kalibrasyonun kaydıdır. Bu, "simüle ediyoruz ama gerçeğe yakın" cümlesinin somut karşılığıdır.

Ne değildir?

FakeBackend gerçek cihazın bugünkü hâli değildir. Aylık kalibrasyonlar yüzünden paketlenmiş anın gerçek cihaza göre farkı zaman içinde büyür. Aynı şekilde FakeBackend, aktif bir kuyruk, oturum, iş yöneticisi de değildir; arkasında ne queue (kuyruk) ne kalibrasyon sürüklenmesi vardır.

Tek cümle FakeBackend = gerçek cihazın belirli bir andaki fotoğraflanmış sözleşmesi + donmuş gürültü profili.

Fake provider kataloğu ve sürümler

Fake backend katalogu, gerçek cihaz hattındaki farklı boyutları ve farklı topolojileri yansıtan sınıflardan oluşur: küçük 5-qubit cihazların donmuş örnekleri (örneğin FakeBelemV2, FakeManilaV2), daha büyük topolojilere ait V2 ekosistemi içindeki örnekler ve eski hat üzerinde kalan V1 sınıfları. Genel kural: yeni içerik için V2 sınıfları tercih edilir; V1'ler eski kodla uyumluluk için durur.

V1 vs V2 ayrımı

Eski (V1) sınıflarda kalibrasyon bilgisi backend.properties() üzerinden okunur; yeni (V2) sınıflarda aynı bilgi backend.target üzerinden gelir. Bu sayfada hep V2'yi kullanırız; V2 arayüzü, gerçek cihazlarla doğrudan örtüşür.

Hangi sınıfı seçmeli?

Seçim, "cihazın benzemesini istediğim taraf" üzerinden yapılır: 5-qubit doğrusal topoloji için bir tip, daha karmaşık çok-qubit topolojisi için başka bir tip. Sayıların kendisi (T1/T2/hata) hangi sınıfı seçtiğinize bağlıdır; bu yüzden iki farklı sınıfta yapılan deneyler birbiriyle kalitatif karşılaştırılır.

Bir fake backend'in içinde ne var?

Bir V2 fake backend nesnesinin içinde üç paket bilgi vardır. Birincisi sözleşme — qubit sayısı, native kapı seti, coupling map; ikincisi kalibrasyon — qubit başına T1/T2/frekans ve (kapı, qargs) için duration/error; üçüncüsü çoğu fake'te aynı zamanda gürültü modeli — yani backend.run(...) çağrıldığında devre, depolanan kalibrasyona uygun olarak gürültülü simüle edilir. Bu üçlü, fake backend'i "okunabilir kayıt"tan "çalıştırılabilir model"e dönüştürür.

Çalıştırma davranışı

FakeBackendV2.run(circuit, shots=...) çağrısı, devreyi arka planda Aer çekirdeğinde simüle eder ama kalibrasyon-türevi bir gürültü modeli ile zenginleştirir. Bu sayede aynı devreyi gerçek cihaza göndermeden, "bu cihaz nasıl cevap verirdi?" sezgisini elde edersiniz. Sonuç gerçek değildir; gerçeğe tahmindir.

Runtime primitive uyumu

Aynı fake backend'i SamplerV2 / EstimatorV2 primitive'lerinin mode=... parametresine vererek yerel primitive akışını da kurgulayabilirsiniz. Aynı PUB yazımı, gerçek cihaza dönüldüğünde değişmez.

FakeBackend vs AerSimulator

İkisini birbirinin yerine koymak yaygın bir karışıklıktır. AerSimulator bir genel amaçlı simülatördür: varsayılan olarak ideal (gürültüsüz) çalışır; topoloji kısıtı, native kapı kümesi yoktur, herhangi bir qubit çiftinde iki-qubit kapısı uygulanabilir. FakeBackend ise belirli bir cihazın topolojisini, kapı setini ve gürültü profilini taşıyan cihaza özgü simülatördür.

Karar tablosu

Algoritmanın doğrusunu görmek istiyorsanız (matematiksel olarak ne çıkar?) ideal AerSimulator işinizi görür. Algoritmanın donanımda nasıl davranacağına dair fikir istiyorsanız (kaç SWAP, kaç ölçüm hatası?) FakeBackend daha bilgilendiricidir. İdeal sonuç ile donanım sonucu arasındaki fark, "hata bütçesi"nin sezgisidir.

Hibrit kullanım

Pratikte her ikisi de aynı pipeline'da yer alır: ideal Aer ile algoritmanın doğru cevabı bulunur, ardından FakeBackend ile tahmini gerçek cevap üretilir; iki sayı arasındaki fark, gerçek donanıma çıkmadan önce somut bir kalite göstergesidir.

Sade ayrım AerSimulator = "matematik doğru olsun" ; FakeBackend = "cihaz donmuş ânındaki gibi davransın". Kullanılan soru, hangisini seçeceğinizi belirler.

FakeBackend vs gerçek donanım

Fake backend, gerçek donanımın belirli bir anının kayıtlı yansımasıdır; gerçek donanım ise canlı, sürüklenen, başka deneylerin yan etkilerini de taşıyan bir sistemdir. Aralarındaki farklar üç başlık altında yığılır.

Zaman ekseni

FakeBackend'in T1/T2/hata değerleri "ön gönderi tarihi"ne aittir; gerçek cihaz bugün farklıdır. Yani fake üzerinde alınan kararlar (örneğin "bu qubit yolu daha iyi") genel formül olarak doğru, somut sayı olarak güncel değildir.

Operasyonel taraf

FakeBackend her zaman uygundur: kuyruk yok, oturum yok, hesap yok. Gerçek cihaz bakımda olabilir, kuyruk patlamış olabilir, sizin oturumunuz açılamayabilir. Bu yüzden fake üzerinde yazdığınız "çalıştır ve sonucu al" akışı, gerçeğe taşınınca "çalıştır + bekle + dön" akışına dönüşür.

Karşı korelasyonlar

Gerçek cihazda gözlenen bazı gürültüler (yan-bağlanmalar, ölçüm geri kazanım hataları, kapı çapraz-konuşması) fake'te basitleştirilmiştir. Yani fake "iyimser" bir model değil ama "basitleştirilmiş" bir modeldir.

Kullanım desenleri: geliştirme, test, öğretim

FakeBackend'in üç tipik kullanım yeri vardır: yerel geliştirme (gerçek cihaza her seferinde çıkmadan kod yazma), otomatik test (CI'da hız ve tekrar üretilebilirlik), ve öğretim (gerçek mimariyle aynı API üzerinde, herkesin kolayca tekrar yapabileceği örnekler).

Geliştirme: ağa çıkmadan iterate

Algoritmanın kabasını yazarken her satır değişikliğinde gerçek cihaza çıkmak hem pahalı hem yavaştır. FakeBackend ile aynı arayüzde dakikada onlarca iterasyon yapılabilir; ancak son adımda gerçek donanıma çıkıldığında aynı kod çalışır.

Test: regresyonu sabitlemek

CI pipeline'ında "bu algoritma şu cihaz türünde şu davranışı göstermeli" şeklindeki testler, FakeBackend ile yazılabilir. Donmuş kalibrasyon, deterministik seed ile birlikte testin tekrar üretilebilirliğini garanti eder.

Öğretim: aynı kayık, aynı yön

Öğrencinin/okuyucunun cihaz hesabı, token sorunu, kuyruk beklemesi olmadan kavramı denemesi gerekir. FakeBackend bu zemini sağlar; örneklerin üretim davranışıyla aynı yapı taşlarını kullanmasını mümkün kılar.

Gerçek backend'e geçiş ve uyum

FakeBackend ile geliştirilen bir kod, gerçek backend'e taşınırken "backend" nesnesini değiştirmek dışında ideal olarak başka bir değişiklik gerektirmez. Bu uyum, BackendV2'nin ve runtime primitive arayüzünün tasarlandığı gibi çalışmasıyla mümkün olur: transpile(qc, backend=...), SamplerV2(mode=backend), backend.target okumaları — hepsi aynı yöntem adlarıyla yer değiştirebilir.

Bağımlılık enjeksiyonu

Kodunuzu "backend"i dışarıdan alan fonksiyonlar olarak yazınca, geçiş tek satıra iner: "backend = FakeManilaV2()" yerine "backend = service.backend('ibm_...')". Bu desen, hem testte fake, hem üretimde gerçek kullanımı sıfır kod farkıyla sağlar.

Geçişte gözden geçirme

"Tek satır geçiş" idealdir; pratikte gerçek cihazın güncel kalibrasyonu nedeniyle ağırlıkları (örneğin backend seçimi'ndeki skor sözlüğünü) yeniden değerlendirmek, transpile seçeneklerini (örneğin optimization_level) tekrar gözden geçirmek iyi bir alışkanlıktır.

Sınırlar ve etik kullanım

FakeBackend güçlüdür ama yanlış kullanıldığında iyimser bir yanılsama yaratır. "Bu algoritma fake üzerinde harika çalışıyor" cümlesi, gerçek cihazda da aynı sonucu garanti etmez. Bu yüzden raporlarda fake üzerinde alınan sonuçların üzeri çizilerek "FakeBackend kullanıldı, gerçek hesap değil" notu tutulmalıdır.

"Fake ile çalıştı, gerçekte de çalışacak" yanılgısı

Bu yanılgıyı engellemek için, üretim raporunda yalnızca gerçek cihaz sonuçları sunulur; fake sonuçlar geliştirme ve önbakış için "" malzeme kalır. Bu ayrım, çıktıların bilimsel saygınlığını korur.

Etiketlemeden çıktı yayınlamamak

Bir grafik ya da tablo üzerinde sayıların hangi cihaz, hangi tarihte, fake mi gerçek mi olduğunu açıkça yazmak gerekir. Bu, hem dürüstlüktür hem de gelecekteki okuyucunun yorumlama hatasını engeller.

Etiket kuralı Yayınlanan her sayı cihaz adı + tarih + kaynak (fake/gerçek) üçlüsüyle etiketlenmelidir. Bu üçlü, kuantum yazılımının bilimsel zeminidir.

Kod laboratuvarı

Üç blok da yereldir. İlk blok bir fake backend nesnesini içe alır, üzerindeki temel sözleşme alanlarını dışarı yazar ve nesnenin tipini gösterir. İkinci blok aynı fake backend üzerinde uçtan uca bir akış kurar: transpile + backend.run + sayım histogramı. Üçüncü blok, geliştirme/test/üretim için "geçilebilir backend" deseninin nasıl yazıldığını gösterir; aynı fonksiyon hem fake hem gerçek backend'le çağrılabilir.

Referans iskelet — çalıştırmayın Aşağıdaki kalıp IBM hesabı ve token gerektirir; statik sayfada çalıştırılması önerilmez. Yalnızca akışı hatırlatmak içindir.
# from qiskit_ibm_runtime import QiskitRuntimeService
# service = QiskitRuntimeService()
# real_backend = service.backend("ibm_brisbane")
# # geliştirme: fake = FakeManilaV2()
# # üretim:    fake = real_backend
# # ortak kod: run(fake, qc) — tek satır geçiş
fake_backend_intro.py Python
from qiskit_ibm_runtime.fake_provider import FakeManilaV2

backend = FakeManilaV2()

print(f"sınıf       : {type(backend).__name__}")
print(f"isim        : {backend.name}")
print(f"qubit       : {backend.num_qubits}")
print(f"native kapı : {sorted(backend.target.operation_names)}")
print(f"kenar sayısı: {len(list(backend.coupling_map.get_edges()))}")
print(f"dt          : {getattr(backend, 'dt', 'yok')}")
qiskit FakeBackendV2 · sözleşmenin özet okuması UTF-8 · LF
fake_backend_end_to_end.py Python
from qiskit import QuantumCircuit, transpile
from qiskit_ibm_runtime.fake_provider import FakeManilaV2

backend = FakeManilaV2()

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

tqc    = transpile(qc, backend=backend, optimization_level=3, seed_transpiler=42)
result = backend.run(tqc, shots=2048, seed_simulator=7).result()
counts = result.get_counts()

print(f"derinlik={tqc.depth()}  2q kapı={sum(1 for d in tqc.data if d.operation.num_qubits == 2)}")
for bs, n in sorted(counts.items(), key=lambda x: -x[1])[:6]:
    print(f"  {bs}  {n:5d}  ({n/2048:.2%})")
qiskit Uçtan uca · transpile + backend.run + sayım UTF-8 · LF
backend_injection_pattern.py Python
from qiskit import QuantumCircuit, transpile
from qiskit_ibm_runtime.fake_provider import FakeManilaV2, FakeBelemV2

def run_bell(backend, shots=1024):
    """Verilen backend üzerinde küçük bir Bell devresi çalıştırır."""
    qc = QuantumCircuit(2)
    qc.h(0); qc.cx(0, 1); qc.measure_all()
    tqc = transpile(qc, backend=backend, optimization_level=3, seed_transpiler=1)
    res = backend.run(tqc, shots=shots, seed_simulator=1).result()
    return res.get_counts()

# Geliştirme/test: farklı fake backend'lerle aynı fonksiyon
for cls in (FakeManilaV2, FakeBelemV2):
    counts = run_bell(cls())
    total  = sum(counts.values())
    ok = sum(v for k, v in counts.items() if k in ("00 00", "00", "11 11", "11", "0011", "1100"))
    print(f"{cls.__name__:>14}  shots={total}  '00/11 ailesi'≈{ok/total:.2%}")

# Üretim: tek satır geçişle gerçek backend
# real = service.backend("ibm_brisbane")
# counts = run_bell(real)
# print(counts)
qiskit Bağımlılık enjeksiyonu · fake ↔ gerçek tek satır geçiş UTF-8 · LF

İleri okuma ve özet

FakeBackend; gerçek cihazın donmuş anının paketlenmiş hâlidir. Aynı arayüzle geliştirme, test ve öğretim mümkün olur; üretime taşınırken kod ideal olarak tek satırda yer değiştirir. Sınırı bilmek (donmuş anlık olduğu, kuyruk/operasyonel taraf taşımadığı, basitleştirilmiş bir gürültü modeli olduğu) etik kullanımın şartıdır. Yayınlarda cihaz adı + tarih + kaynak (fake/gerçek) etiketi kuralı bilimsel zemini korur.

Özet FakeBackend = donmuş gerçek; AerSimulator = matematik motoru; gerçek backend = canlı sistem. Üçü tek bir API üzerinden konuşur; üçünün arasında ne zaman hangisini seçtiğinizi açık tutmak, kuantum yazılımının disiplinidir.