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-12ve 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) = 80istektir, 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.