İçeriğe geç
academia.sh

Ders 11 / 12

Çı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.

İçindekiler

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.

# 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.

# 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.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat