---
title: 'Çıkarım Ölçekleme'
source: 'https://academia.sh/tr/kurslar/mlops-temelleri/cikarim-olcekleme'
course: 'MLOps Temelleri'
language: tr
updated: '2026-08-17T18:08:53+00:00'
license: 'CC BY-SA 4.0'
---

# Çıkarım Ölçekleme

Toplu isteme, önbellekleme ve hızlandırıcı sınıfı seçiminin tahmin başına maliyet ile bekleyen isteğin gecikmesi arasında verildiğinin sayılması: aynı 600 istek toplu boyut bir, iki, dört, sekiz, on altı, otuz iki, altmış dört, yüz yirmi sekiz ve iki yüzde tahmin başına 463,87'den 22,00'ye inerken en kötü bekleme 0'dan 199 varışa ve ortalama bekleme 99,50'ye çıkar; yanıtlar dokuz satırda da birebir aynıdır ve isabet 0,8067'de kalır, yani toplu boyut bir kalite ayarı değildir. Her dönemin son grubu boyut on altı, otuz iki ve altmış dörtte sekiz istekte kalır ve dolmayacak bir grubu bekler; bu bekleme en kötü bekleme sütununda hiç görünmez. İki hızlandırıcı sınıfının kesişme noktası kurulum farkının birim farkına oranıdır ve 80 istektir, ama tabloda geçiş yüz yirmi sekizde görünür çünkü ölçülen şey istenen boyut değil gerçekleşen grup boyutudur. Önbellek 600 isteklik akışta 0,6783 isabetle istek başına okunan satırı 464,86'dan 148,70'e indirir ve toplu istemeyle birlikte 26,38 verir; iki kazanç çarpılamaz.

Bir önceki ders üç sunum kalıbını yan yana koydu ve tahmin başına maliyetin bir payda kararı
olduğunu gösterdi. Çevrimiçi kalıp orada en pahalı olandı: istek başına ortalama 463,87 satır. O
sayının içinde bir varsayım vardı — her istek **tek başına** işleniyordu. Oysa aynı bölgeye ait iki
istek bölge geçmişini iki kez okumak zorunda değildir; ikisi bir arada işlenirse o geçmiş bir kez
okunur.

Bu ders o birlikteliği bir ayar hâline getirir. Gelen istekler bir grup dolana kadar biriktirilir,
sonra tek çağrıda işlenir. Kazanç ölçülebilir ve büyüktür; bedeli de ölçülebilir ve aynı yerde durur:
grubu bekleyen ilk istek, grup dolana kadar hiçbir yanıt almaz. Ders bu iki sayıyı süpürür, sonra
aynı süpürmeyi iki **hızlandırıcı** sınıfında ve bir önbellek altında tekrarlar.

- **ED48.** Kaynak, hat, model ve iki hızlandırıcı sınıfı **kurgudur** ve ders içinde üretilir.
  Hiçbir çıkarım servisi, sunum çatısı, hızlandırıcı donanım ya da bulut servisi adı yazılmaz;
  hızlandırıcılar yalnız **türleriyle** anılır. Tohum 20260218.
- **ED49.** Etiket dengesizdir: dağılım `{0: 1752, 1: 448}`, **taban sınıf oranı 0,7964**. Sınama
  kümesi 600 satırdır, isabetin en küçük adımı 0,0017'dir.
- **ED50.** Toplu çağrı ve önbellek yordamı Yapay Zekâ Mühendisliği müfredatındaki Model API'leri ile
  Uygulama Geliştirme kursunda ölçüldü — bağlam penceresinin koyduğu üst sınır, başarısızlığın
  yaydığı zarar ve önbellek ömrünün bayatlığı orada sayıldı. **Tekrarlanmaz**; burada yalnız **tahmin
  başına maliyet** ve **bekleme** sayılır.
- **ED51.** Gecikme **varış** olarak sayılır: bir isteğin grubu dolana kadar beklediği varış sayısı.
  Ham milisaniye yazılmaz.
- **ED52.** Bir gruptaki her abonenin ve her bölgenin geçmişi **bir kez** okunur; toplu istemenin
  bütün kazancı bu paylaşımdan gelir.
- **ED53.** İki hızlandırıcı sınıfı **iş birimi** ile yazılır: genel amaçlı işlem birimi `(60, 4)`,
  hızlandırıcı `(300, 1)`; ilki çağrı başına kurulum, ikincisi istek başına birim. Bu bir **seçimdir**
  ve duyarlılığı aşağıda süpürülür.
- **ED54.** Sunum ufku bir önceki dersinkidir: `2026-10`, `2026-11`, `2026-12` ve her dönem iki yüz
  istek. Gruplar dönem içinde oluşur.

## Toplu Boyut Süpürmesi

İlk blok kaynağı, hattı, öznitelik yolunu ve modeli kurar; sonra aynı 600 isteği dokuz ayrı toplu
boyutta koşturur. Öznitelikler ağırlıktan bağımsızdır ve **bir kez** hesaplanır.

```python
# KURGUDUR. Olcum aginin sayac okumalari , hattin ilk uc asamasi , oznitelik
# yolu , uc agirlikli esik modeli ve iki hizlandirici sinifi ders icinde
# uretilir; hicbir cikarim servisi ya da donanim cagrilmaz. Tohum 20260218.
TOHUM, M32 = 20260218, 0xFFFFFFFF


def uretec(t):
    x = ((t ^ (t >> 16)) * 2246822507) & M32
    x = ((x ^ (x >> 13)) * 3266489909) & M32
    s = [(x ^ (x >> 16)) & M32]

    def sonraki():
        s[0] = (s[0] * 1664525 + 1013904223) & M32
        return s[0] / 4294967296
    return sonraki


BOLGE = ["dogu", "bati", "kuzey", "guney", "merkez"]
TIP = ["mesken", "isyeri"]
DONEM = [f"2026-{a:02d}" for a in range(1, 13)]
ABONE = {}
for i in range(200):
    r = uretec(TOHUM + 37 * i)
    ABONE[f"A{i + 1:03d}"] = {"bolge": BOLGE[int(r() * 5)], "tip": TIP[int(r() * 2)],
                              "baslangic": 10000 + int(r() * 60000)}


def kaynak_uret():
    kayit = []
    for i, (ab, a) in enumerate(ABONE.items()):
        e = a["baslangic"]
        for d in DONEM:
            r = uretec(TOHUM + 101 * i + 7 * DONEM.index(d))
            e += 4 + int(r() * 46)
            kayit.append({"abone": ab, "donem": d, "bolge": a["bolge"], "tip": a["tip"],
                          "endeks": e, "birim": "m3"})
    return kayit


def a3_tuketim(kayit):
    tablo = {(k["abone"], k["donem"]): k for k in kayit}
    cikti = []
    for k in kayit:
        i = DONEM.index(k["donem"])
        onceki = tablo.get((k["abone"], DONEM[i - 1])) if i else None
        if onceki is not None:
            cikti.append(dict(k, m3=int(k["endeks"]) - int(onceki["endeks"])))
    return cikti


EGITIM, SINAMA, ESIK = DONEM[1:9], DONEM[9:], 40


def etiket(k):
    return 1 if k["m3"] > ESIK else 0


def oznitelikler(kayitlar):
    """Egitim yolu tam gecmisi gorur. Agirliktan bagimsiz , bir kez hesaplanir."""
    sirali = sorted(kayitlar, key=lambda k: DONEM.index(k["donem"]))
    ab, bo = {}, {}
    for k in sirali:
        ab.setdefault(k["abone"], []).append((DONEM.index(k["donem"]), k["m3"]))
        bo.setdefault(k["bolge"], []).append((DONEM.index(k["donem"]), k["m3"]))

    def ortalama(dizi, i):
        secili = [v for d, v in dizi if d < i]
        return round(sum(secili) / len(secili), 4) if secili else 0.0

    return {(k["abone"], k["donem"]): {
        "abone_ort": ortalama(ab[k["abone"]], DONEM.index(k["donem"])),
        "bolge_ort": ortalama(bo[k["bolge"]], DONEM.index(k["donem"])),
        "isyeri": 1 if k["tip"] == "isyeri" else 0} for k in kayitlar}


IZGARA = [(a, b, c) for a in (0.6, 0.8, 1.0) for b in (0.0, 0.2, 0.4) for c in (0, 4, 8)]


def puan(o, w):
    return w[0] * o["abone_ort"] + w[1] * o["bolge_ort"] + w[2] * o["isyeri"]


TUM = a3_tuketim(kaynak_uret())
OZ = oznitelikler(TUM)
EG = [k for k in TUM if k["donem"] in EGITIM]
W = max(IZGARA, key=lambda w: sum(
    1 for k in EG if (1 if puan(OZ[(k["abone"], k["donem"])], w) > ESIK else 0) == etiket(k)))

SUNUM, ISTEK = SINAMA, sorted(ABONE)
ab, bo = {}, {}
for k in TUM:
    ab.setdefault(k["abone"], []).append(k)
    bo.setdefault(k["bolge"], []).append(k)
GERCEK = {(k["abone"], k["donem"]): etiket(k) for k in TUM if k["donem"] in SUNUM}
N = len(ISTEK) * len(SUNUM)


def grup_isle(istekler, donem):
    """Bir gruptaki her abonenin ve her bolgenin gecmisi BIR kez okunur."""
    i = DONEM.index(donem)
    aa = sorted(set(istekler))
    bb = sorted(set(ABONE[a]["bolge"] for a in aa))
    okunan = sum(len(ab[a]) for a in aa) + sum(len(bo[b]) for b in bb)
    bort = {}
    for b in bb:
        s = [k["m3"] for k in bo[b] if DONEM.index(k["donem"]) < i]
        bort[b] = round(sum(s) / len(s), 4) if s else 0.0
    t = {}
    for a in aa:
        s = [k["m3"] for k in ab[a] if DONEM.index(k["donem"]) < i]
        t[(a, donem)] = 1 if puan({"abone_ort": round(sum(s) / len(s), 4) if s else 0.0,
                                   "bolge_ort": bort[ABONE[a]["bolge"]],
                                   "isyeri": 1 if ABONE[a]["tip"] == "isyeri" else 0},
                                  W) > ESIK else 0
    return t, okunan


GENEL, HIZ = (60, 4), (300, 1)
BOYUT = (1, 2, 4, 8, 16, 32, 64, 128, 200)


def supur(boyut):
    okunan, bekleme, cagri, tumt, is_g, is_h, eksik = 0, 0, 0, {}, 0, 0, 0
    for d in SUNUM:
        gr = [ISTEK[i:i + boyut] for i in range(0, len(ISTEK), boyut)]
        for g in gr:
            t, o = grup_isle(g, d)
            tumt.update(t)
            okunan += o
            bekleme += len(g) * (len(g) - 1) // 2
            cagri += 1
            is_g += GENEL[0] + GENEL[1] * len(g)
            is_h += HIZ[0] + HIZ[1] * len(g)
        eksik = len(gr[-1]) if len(gr[-1]) != boyut else 0
    return tumt, okunan, bekleme, cagri, eksik, is_g, is_h


TEK = supur(1)[0]
IS = {}
print("boyut  cagri  eksik  okunan satir  satir/tahmin  en kotu bekleme"
      "  ort bekleme  ayni yanit  isabet")
for b in BOYUT:
    t, ok, bk, cg, ek, ig, ih = supur(b)
    IS[b] = (ig, ih)
    isa = round(sum(1 for c in GERCEK if t[c] == GERCEK[c]) / N, 4)
    print(f"{b:>5}  {cg:>5}  {ek:>5}  {ok:>12}  {ok / N:>12.2f}  {b - 1:>15}"
          f"  {bk / N:>11.2f}  {str(all(t[c] == TEK[c] for c in TEK)):>10}  {isa}")
```

```
boyut  cagri  eksik  okunan satir  satir/tahmin  en kotu bekleme  ort bekleme  ayni yanit  isabet
    1    600      0        278322        463.87                0         0.00        True  0.8067
    2    300      0        252450        420.75                1         0.50        True  0.8067
    4    150      0        203610        339.35                3         1.50        True  0.8067
    8     75      0        140316        233.86                7         3.50        True  0.8067
   16     39      8         87318        145.53               15         7.34        True  0.8067
   32     21      8         51183         85.31               31        15.02        True  0.8067
   64     12      8         31383         52.30               63        30.38        True  0.8067
  128      6     72         19800         33.00              127        53.42        True  0.8067
  200      3      0         13200         22.00              199        99.50        True  0.8067
```

İki sütun ters yönlere gider ve hiç geri dönmez. Tahmin başına okunan satır 463,87'den **22,00**'ye
iner, yirmi bir kat; en kötü bekleme 0'dan **199 varışa**, ortalama bekleme 99,50'ye çıkar. Son iki
sütun kararın **kalite** tarafını kapatır: dokuz boyutta da yanıtlar birebir aynıdır ve isabet
0,8067'de kalır — taban sınıf oranı 0,7964, sınama kümesinin taban oranı ise 0,8067, yani bu kurulum
tabanın **0,0000** üstündedir. **Toplu boyut bir kalite ayarı değil, maliyet ile bekleme arasında
bir ayardır.**

Kazanç doğrusal değildir. İlk ikiye katlama 463,87'yi yalnız 420,75'e indirir, çünkü iki isteğin
bölgesi beş bölge arasında çoğunlukla farklıdır ve iki bölge geçmişi yine ayrı ayrı okunur. Kazanç
boyut 16 ile 32 arasında en yüksek hızına ulaşır, sonra yavaşlar: boyut 200'de zaten bütün bölgeler
tek bir grupta olduğu için paylaşılacak yeni geçmiş kalmaz. **Toplu istemenin kazandırdığı şey
isteğin sayısı değil, isteklerin ortak okuduğu satırdır.**

Üçüncü sütun tablonun kendi kusurunu taşır. Boyut 16, 32 ve 64'te her dönemin son grubu **sekiz**
istekte kalır, boyut 128'de yetmiş iki istekte. Bu istekler hiç dolmayacak bir grubu bekler ve ancak
bir zaman aşımıyla boşaltılır. Beklemeleri "en kötü bekleme" sütununda **görünmez**, çünkü o sütun
grubun dolduğunu varsayar. Ölçülen en kötü değer, ölçülmemiş bir varsayımın altındadır.

## Kurulum Bedeli ve Önbellek

Okunan satır bedelin tek adı değildir. Her çağrı bir kurulum bedeli öder ve bu bedel, çağrının
koştuğu birime göre değişir. İkinci blok iki hızlandırıcı sınıfını aynı süpürmede karşılaştırır,
kesişme noktasını hesaplar ve sonuna tekrarlı bir istek akışı ekler.

```python
# Bu blok ilk bloktaki TUM , ISTEK , SUNUM , N , BOYUT , IS , GENEL , HIZ ,
# ABONE , DONEM , TOHUM , uretec ve grup_isle tanimlarini surdurur.
print("boyut  gerceklesen grup  genel amacli  hizlandirici  ucuz olan")
for b in BOYUT:
    ig, ih = IS[b]
    gr = [len(ISTEK[i:i + b]) for i in range(0, len(ISTEK), b)]
    print(f"{b:>5}  {len(ISTEK) / len(gr):>16.1f}  {ig / N:>12.2f}  {ih / N:>12.2f}"
          f"  {'hizlandirici' if ih < ig else 'genel amacli':>13}")
for kh in (150, 300, 600):
    print(f"kurulum {kh:>3} -> donus noktasi {(kh - GENEL[0]) / (GENEL[1] - HIZ[1]):.1f} istek")


def istek_akisi(n):
    r = uretec(TOHUM + 911)
    return [f"A{int(r() * 200) + 1:03d}" for _ in range(n)]


def maliyet(cagrilar, boyut, donem="2026-12"):
    return sum(grup_isle(cagrilar[i:i + boyut], donem)[1]
               for i in range(0, len(cagrilar), boyut))


AKIS = istek_akisi(600)
FARKLI = list(dict.fromkeys(AKIS))
print(f"\nakis {len(AKIS)} istek , farkli {len(FARKLI)} , onbellek isabeti"
      f" {(len(AKIS) - len(FARKLI)) / len(AKIS):.4f}")
taban = maliyet(AKIS, 1)
for adi, cag, b in (("ikisi de yok , boyut 1", AKIS, 1), ("yalniz toplu isteme", AKIS, 32),
                    ("yalniz onbellek", FARKLI, 1), ("ikisi birlikte", FARKLI, 32)):
    ok = maliyet(cag, b)
    print(f"{adi:<24} okunan {ok:>7}  istek basina {ok / len(AKIS):>7.2f}"
          f"  carpan {ok / taban:.4f}")
t1, t2 = maliyet(AKIS, 32) / taban, maliyet(FARKLI, 1) / taban
print(f"carpimlarin ongordugu {t1 * t2:.4f} , gerceklesen"
      f" {maliyet(FARKLI, 32) / taban:.4f}")
```

```
boyut  gerceklesen grup  genel amacli  hizlandirici  ucuz olan
    1               1.0         64.00        301.00   genel amacli
    2               2.0         34.00        151.00   genel amacli
    4               4.0         19.00         76.00   genel amacli
    8               8.0         11.50         38.50   genel amacli
   16              15.4          7.90         20.50   genel amacli
   32              28.6          6.10         11.50   genel amacli
   64              50.0          5.20          7.00   genel amacli
  128             100.0          4.60          4.00   hizlandirici
  200             200.0          4.30          2.50   hizlandirici
kurulum 150 -> donus noktasi 30.0 istek
kurulum 300 -> donus noktasi 80.0 istek
kurulum 600 -> donus noktasi 180.0 istek

akis 600 istek , farkli 193 , onbellek isabeti 0.6783
ikisi de yok , boyut 1   okunan  278916  istek basina  464.86  carpan 1.0000
yalniz toplu isteme      okunan   47872  istek basina   79.79  carpan 0.1716
yalniz onbellek          okunan   89221  istek basina  148.70  carpan 0.3199
ikisi birlikte           okunan   15829  istek basina   26.38  carpan 0.0568
carpimlarin ongordugu 0.0549 , gerceklesen 0.0568
```

Hızlandırıcı sınıfı boyut 128'e kadar pahalıdır. Kesişme noktası bir ölçüm değil bir orandır: kurulum
farkının birim farkına bölümü, yani `(300 - 60) / (4 - 1) = 80` istek. Tabloda geçişin 128'de
görünmesinin nedeni, ikinci sütundur. Boyut 64 istendiğinde her dönem 64, 64, 64 ve 8 isteklik
gruplara bölünür ve **gerçekleşen ortalama grup 50**'dir, yani 80'in altında; boyut 128'de gerçekleşen
ortalama 100'dür ve 80'in üstündedir. **Bir hızlandırıcının gerekçesi kendi hızında değil,
doldurulabilen grup boyutundadır**; doldurulamayan bir grupla hızlandırıcı yalnız pahalı bir genel
amaçlı birimdir. Kurulum bedeli süpürmesi bunu üç sayıyla gösterir: 150, 300 ve 600 kurulumun dönüş
noktaları 30, 80 ve 180 istektir.

Son dört satır önbelleği ekler. Altı yüz isteklik akışta yalnız **193** farklı istek vardır; önbellek
isabeti 0,6783 ve istek başına okunan satır 464,86'dan 148,70'e iner. Toplu isteme tek başına daha
güçlüdür: 79,79. İkisi birlikte **26,38** verir. Ama iki çarpan ayrı ölçülüp çarpılamaz: 0,1716 ile
0,3199'un çarpımı 0,0549'u öngörür, gerçekleşen 0,0568'dir. Fark küçüktür ve nedeni ölçülebilir —
önbellek grupları **seyreltir**. Geriye kalan 193 istek otuz ikilik gruplara bölündüğünde son grupta
tek bir istek kalır ve o tek istek bütün bölge geçmişini kendi başına okur. **Bir düzeneğin kazancı,
yanında hangi düzeneğin durduğuna bağlıdır.**

## Özet

- Toplu boyut bir ile iki yüz arasında süpürüldüğünde tahmin başına okunan satır **463,87'den
  22,00'ye** iner, en kötü bekleme **0'dan 199 varışa** ve ortalama bekleme 99,50'ye çıkar; iki sütun
  ters yönlere gider ve hangisinin ödendiği yazılmadan boyut seçilemez.
- Dokuz boyutta da yanıtlar birebir aynıdır ve isabet 0,8067'de kalır; taban sınıf oranı 0,7964,
  sınama kümesinin taban oranı 0,8067 ve bu kurulum onun 0,0000 üstünde: toplu boyut bir kalite
  ayarı değildir.
- Kazanç isteğin sayısından değil isteklerin **ortak okuduğu satırdan** gelir; ilk ikiye katlama
  463,87'yi yalnız 420,75'e indirir, çünkü iki isteğin bölgesi çoğunlukla farklıdır.
- Boyut 16, 32 ve 64'te her dönemin son grubu sekiz istekte kalır ve dolmayacak bir grubu bekler; bu
  bekleme "en kötü bekleme" sütununda hiç görünmez, çünkü o sütun grubun dolduğunu varsayar.
- Hızlandırıcı sınıfının kesişme noktası `(300 - 60) / (4 - 1) = 80` istektir, ama tabloda geçiş
  128'de görünür: ölçülen şey istenen boyut değil **gerçekleşen grup boyutudur** (64 istendiğinde 50,
  128 istendiğinde 100).
- Önbellek 600 isteklik akışta 0,6783 isabetle 464,86'yı 148,70'e indirir; toplu istemeyle birlikte
  26,38 verir, oysa iki çarpanın çarpımı 25,52 öngörür — önbellek grupları seyreltir.

## Sonraki Adım

Beş derste model paketlendi, bir kalıba yerleştirildi ve ölçeklendi. Beşinde de sessiz bir varsayım
vardı: model isteğin geldiği yerin **ağ üzerinden erişilebilir** bir ucundadır. Ağ koptuğunda bu
düzeneğin tahmin başına maliyeti tanımsızdır, çünkü tahmin yoktur. Sonraki ders modeli isteğin
kaynağına, aygıtın kendisine taşır; küçültmenin isabetten ne götürdüğünü ve hangi görevde önce
götürdüğünü ölçer, kenarda çalıştırmanın kazandırdığı bağımsızlığı yanıtlanan istek olarak sayar.
