Ders 21 / 26
Kendi Barındırdığın Modeller
Modeli kendi donanımında çalıştırmanın biriminin belirteç değil bellek olması: üç kurgu ölçeğin ağırlık belleği 70,5 milyon, 367,5 milyon ve 2,14 milyar sayı, 960 belirteçlik bağlamda istek başına ara durum 11,8 milyon, 47,2 milyon ve 157,3 milyon sayı, üç milyar sayılık bütçenin yettiği eşzamanlı istek 248, 55 ve 5, aynı 120 kurgu talepte etiket isabeti 0,6333, 0,8167 ve 0,8667. Eşzamanlı istek ile isabetin çarpımı 157,1'den 4,3'e düşüyor, yani en büyük ölçek doğru yanıt kapasitesinin otuz altıda birini veriyor. Dağılım sıcaklığı sıfırken iki koşum aynı 0,8667'yi veriyor, 0,02'de 120 talebin 28'i koşumdan koşuma değişiyor.
İçindekiler
Önceki yirmi derste model hep uzakta duran bir uç noktaydı. Ölçülen her şey o uç noktanın yüzeyinden okundu: kaç çağrı gitti, kaç belirteç harcandı, kaç istek reddedildi, kaç yanıt yarıda kesildi. Bütün bu sayıların ortak bir varsayımı vardı: modelin kendisi başkasının makinesinde duruyor ve orada kaç isteğin aynı anda işlendiği senin sorunun değil.
Model kendi donanımına taşındığında bu varsayım düşer ve birim değişir. Artık harcanan şey belirteç değil bellektir, ve bellek uzayan bir fatura değil sabit bir tavandır. Bu ders o tavanı sayar: bir ölçeğin ağırlıkları bellekte kaç sayı tutuyor, bir isteğin ara durumu kaç sayı ekliyor, ve verilmiş bir bütçe kaç eşzamanlı isteğe yetiyor. Eğitim tarafındaki bellek hesabı M27 Makine Öğrenmesi kursunun eğitim pratiği konusunda ölçüldü; o yordam burada tekrarlanmaz, yalnız çıkarım tarafındaki karşılığı kurulur.
- YM1. Kod bir benzeticidir; gerçek bir model, çalışma zamanı ya da donanım çağrılmaz. Talepler ve ölçekler kurgudur, tohum 20260218.
- YM2. Bellek sayı adedi olarak sayılır. Bir sayının kaç basamakla tutulduğu sonraki dersin konusudur ve burada sabit kabul edilir.
- YM3. Bir ölçek üç yapısal büyüklükle verilir: katman sayısı, gizli genişlik ve sözlük boyu. Parametre sayısı bunlardan hesaplanır.
- YM4. Benzeticinin kendi ağırlık tablosu küçüktür ve yalnız isabet üretmek içindir. Bellek hesabı ölçeklerin yapısal tarifinden yapılır, benzeticinin tablosundan değil.
- YM5. Ağırlık belleği isteklerden bağımsızdır ve tek kopyadır. Ara durum her istek için ayrıdır ve bağlam uzunluğuyla doğru orantılıdır.
- YM6. Ara durum her katmanda, bağlamdaki her belirteç için genişlik boyunda iki dizi tutar; yani istek başına iki çarpı katman çarpı genişlik çarpı bağlam sayı.
- YM7. Ölçek büyüdükçe benzeticinin ayırt edici satır sayısı artar (12, 26, 121). Bu, yeteneğin ölçekle arttığını modellemek içindir ve başka bir iddia taşımaz.
- YM8. Dağılım sıcaklığı sıfırken en olası seçim yapılır ve çıktı koşumdan koşuma aynıdır; sıfırın üstünde tohuma bağlı örnekleme yapılır.
- YM9. Bütçe üç milyar sayıdır; ağırlık ve ara durum aynı bütçeden karşılanır.
- YM10. Ölçülen birimler sayı adedi ve eşzamanlı istek sayısıdır; ham süre yazılmaz.
Üç Ölçek, Üç Yetenek
Benzetici bir metni beş damgalık parçalara böler ve her parça için bir ağırlık satırı tutar. Satırın beş konu için de ortak bir tabanı vardır; ayırt edici olan, tabanın üstüne konu başına eklenen küçük farktır. Model bir talebi okurken her konu için gördüğü en yüksek değeri alır ve en yüksek puanlı konuyu seçer. Ölçek burada tek bir şeyi değiştirir: kaç parçanın ayırt edici bir satırı olduğunu.
# YEREL BENZETICI -- KURGUDUR. Gercek bir model, calisma zamani ya da donanim # yoktur; bellek sayi adedi olarak sayilir. import math 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 def ayrik(u, w): t = 0.0 for i, x in enumerate(w): t += x if u < t: return i return len(w) - 1 def belirtecle(m): # KURGU belirtecleyici, parca en cok bes damga b = [] for s in m.lower().split(): while len(s) > 5: b.append(s[:5]) s = s[5:] b.append(s) return b def izno(m): h = 2166136261 for c in m: h = ((h ^ ord(c)) * 16777619) & M32 return h KONU = ["fatura", "ariza", "sayac", "tarife", "kesinti"] KALIP = {"fatura": ["bu ayki tutar gecen aya gore cok yuksek", "odedim ama sistemde borc gorunuyor", "ayrintili dokumu nereden gorebilirim"], "ariza": ["evde su akmiyor bir sorun var", "baglanti bozuk oldu ve hic calismiyor", "ariza kaydi actim ama ekip gelmedi"], "sayac": ["okuma yanlis girilmis endeks tutmuyor", "cihaz degisimi icin randevu istiyorum", "endeksi ile fatura ayni degil"], "tarife": ["hangi basamaktayim ogrenmek istiyorum", "tarife degisikligi icin ne yapmaliyim", "birim ucret abone tipine gore degisir mi"], "kesinti": ["mahallede elektrik yok ne zaman gelecek", "planli duyuru nereden takip edilir", "aksamdan beri kesinti yasiyoruz"]} EK = ["ayrica gecen hafta da aradim", "kayit numarasi verildi", "ekip bilgi verecekti", "degisiklik talebim de var"] TALEP = [] # 120 KURGU destek talebi for i in range(120): r = uretec(TOHUM + i) k = KONU[ayrik(r(), [0.24, 0.22, 0.18, 0.20, 0.16])] m = KALIP[k][int(r() * 3)] if r() < 0.34: m += " " + EK[int(r() * 4)] TALEP.append({"no": 4001 + i, "konu": k, "metin": m}) GECIS = {} # parca hangi konunun kalibinda geciyor for k, liste in KALIP.items(): for m in liste: for t in set(belirtecle(m)): GECIS.setdefault(t, {})[k] = 1 for e in EK: for t in set(belirtecle(e)): GECIS.setdefault(t, {}) TABAN = 0.50 # parcanin konudan bagimsiz ortak agirligi AGIRLIK = {} for i, t in enumerate(sorted(GECIS)): r = uretec(TOHUM + 7919 * (i + 1)) satir = {k: TABAN for k in KONU} if GECIS[t]: for k in GECIS[t]: satir[k] = TABAN + 0.05 + 0.40 * r() # ayirt edici kucuk fark else: satir[KONU[int(r() * 5)]] = TABAN + 0.02 + 0.10 * r() # yaniltici bag AGIRLIK[t] = satir SIRA = sorted(AGIRLIK, key=lambda t: (TABAN - max(AGIRLIK[t].values()), t)) OLCEK = {"kucuk": (12, 512, 12), "orta": (24, 1024, 26), "buyuk": (40, 2048, len(AGIRLIK))} # katman, genislik, ayirt edici satir def puan(metin, satir): ogrenilmis = set(SIRA[:satir]) p = {k: TABAN for k in KONU} for t in belirtecle(metin): if t in ogrenilmis: for k in KONU: p[k] = max(p[k], AGIRLIK[t][k]) return p def yanitla(metin, olcek, sicaklik=0.0, tohum=TOHUM): p = puan(metin, OLCEK[olcek][2]) if sicaklik <= 0.0: return max(sorted(p), key=lambda a: p[a]) # en olasi secim u = [math.exp((p[k] - max(p.values())) / sicaklik) for k in KONU] return KONU[ayrik(uretec(tohum ^ izno(metin))(), [x / sum(u) for x in u])] print("sozluk", len(AGIRLIK), "parca ; ornek talep:", TALEP[0]["metin"]) print("olcek isabet") for ad in OLCEK: d = sum(yanitla(x["metin"], ad) == x["konu"] for x in TALEP) print(f"{ad:<7} {d / 120:.4f}") print("\nsicaklik tohum 20260218 tohum 20260219") for s in (0.0, 0.02): a, b = (sum(yanitla(x["metin"], "buyuk", s, t) == x["konu"] for x in TALEP) / 120 for t in (TOHUM, TOHUM + 1)) print(f"{s:>8.2f} {a:>14.4f} {b:>14.4f}")
sozluk 121 parca ; ornek talep: planli duyuru nereden takip edilir
olcek isabet
kucuk 0.6333
orta 0.8167
buyuk 0.8667
sicaklik tohum 20260218 tohum 20260219
0.00 0.8667 0.8667
0.02 0.8167 0.8583
İlk tablo ölçeğin ne satın aldığını söylüyor. Küçük ölçek yüz yirmi talebin 0,6333’ünü doğru konuya atıyor, orta 0,8167, büyük 0,8667. Aradaki fark yeteneğin kendisi değil, kaç ayrımın öğrenilmiş olduğudur: küçük ölçek yalnız on iki parçanın hangi konuya işaret ettiğini biliyor, kalan yüz dokuz parça onun için birbirinin aynı.
İkinci tablo, kendi barındırmanın uzak uç noktada bulunmayan bir yanını gösteriyor. Dağılım sıcaklığı sıfırken iki ayrı tohum aynı 0,8667‘yi veriyor; hiçbir talebin yanıtı değişmiyor. Sıcaklık 0,02’ye çıktığında aynı iki koşum 0,8167 ve 0,8583 veriyor. Örnekleme ayarı sağlayıcının elinde değil senin elindedir; belirlenimcilik bir talep değil bir yapılandırma olur. Bu, sonraki bölümlerdeki sayıların koşumdan koşuma sabit kalmasının da gerekçesidir.
Bellek Bütçesi ve Eşzamanlı İstek
Bellek iki ayrı kalemden oluşur ve ikisi çok farklı davranır. Ağırlık belleği modelin parametrelerini tutar; kaç istek gelirse gelsin tek kopyadır ve değişmez. Ara durum her isteğin kendi bağlamı için tutulur; istek sayısıyla ve bağlam uzunluğuyla birlikte büyür. Bütçe ikisini de karşılamak zorundadır, yani eşzamanlı istek sayısı bütçeden ağırlık düşüldükten sonra kalanla belirlenir.
BUTCE, SOZLUK = 3_000_000_000, 32000 # bellek butcesi ve KURGU yapisal sozluk BAGLAM = (240, 960, 3840) def parametre(L, H): return 12 * L * H * H + 2 * SOZLUK * H def ara_durum(L, H, baglam): return 2 * L * H * baglam print("olcek agirlik(sayi) ara durum/istek esz.istek isabet kapasite") for ad, (L, H, satir) in OLCEK.items(): a, d = parametre(L, H), ara_durum(L, H, 960) i = sum(yanitla(x["metin"], ad) == x["konu"] for x in TALEP) / 120 e = max(0, (BUTCE - a) // d) print(f"{ad:<7} {a:>13} {d:>16} {e:>10} {i:>7.4f} {e * i:>9.1f}") print("\nolcek " + " ".join(f"baglam {b:>4}" for b in BAGLAM)) for ad, (L, H, satir) in OLCEK.items(): a = parametre(L, H) e = [max(0, (BUTCE - a) // ara_durum(L, H, b)) for b in BAGLAM] print(f"{ad:<7} " + " ".join(f"{x:>11}" for x in e)) print("\n120 istegin tur sayisi (baglam 960):") for ad, (L, H, satir) in OLCEK.items(): e = max(0, (BUTCE - parametre(L, H)) // ara_durum(L, H, 960)) print(f" {ad:<7} esz.istek {e:>4} tur {-(-120 // e):>3}") print("butce 2000000000 sayiya inerse buyuk olcek yuklenemez:", parametre(40, 2048) > 2_000_000_000)
olcek agirlik(sayi) ara durum/istek esz.istek isabet kapasite kucuk 70516736 11796480 248 0.6333 157.1 orta 367525888 47185920 55 0.8167 44.9 buyuk 2144337920 157286400 5 0.8667 4.3 olcek baglam 240 baglam 960 baglam 3840 kucuk 993 248 62 orta 223 55 13 buyuk 21 5 1 120 istegin tur sayisi (baglam 960): kucuk esz.istek 248 tur 1 orta esz.istek 55 tur 3 buyuk esz.istek 5 tur 24 butce 2000000000 sayiya inerse buyuk olcek yuklenemez: True
İlk sütun ölçekler arasındaki mesafeyi veriyor: ağırlık belleği 70,5 milyon, 367,5 milyon ve 2,14 milyar sayı. Genişlik iki katına çıktığında katman parametreleri dörde katlanıyor, çünkü her katmanın parametre sayısı genişliğin karesiyle büyüyor. Katman sayısının etkisi ise doğrusaldır. Bu iki büyüme hızının farkı, ölçek seçiminin niçin kademeli değil sıçramalı olduğunu açıklıyor.
İkinci sütun daha az sezgiseldir. Ara durum genişliğin karesiyle değil kendisiyle büyür, ama bağlam uzunluğuyla doğru orantılıdır. Büyük ölçekte 960 belirteçlik bir bağlam istek başına 157,3 milyon sayı ister; bu, aynı ölçeğin ağırlıklarının on üçte biri kadardır. On üç eşzamanlı istek, ikinci bir model yüklemekle aynı belleği tüketir.
Bütçenin Dayattığı Seçim
Eşzamanlı istek sütunu tabloyu bir tercihe dönüştürüyor. Üç milyar sayılık bütçe, 960 belirteçlik bağlamda küçük ölçekte 248, orta ölçekte 55, büyük ölçekte 5 isteği aynı anda taşıyabiliyor. Büyük ölçeğe geçmek isabeti 0,8167’den 0,8667’ye çıkarıyor; kazanç 0,0500. Aynı adımın bedeli eşzamanlı istekte onda bire düşmektir.
Son sütun bu iki sayıyı tek ölçüte indiriyor. Eşzamanlı istek ile isabetin çarpımı, bütçenin aynı anda üretebildiği doğru yanıt kapasitesidir: küçük ölçekte 157,1, ortada 44,9, büyükte 4,3. En büyük ölçek en yüksek isabeti veriyor ve doğru yanıt kapasitesinin otuz altıda birini üretiyor. Hangi sütunun kazandığı iş yüküne bağlıdır: gelen talep sayısı bütçenin taşıyabileceğinin altındaysa isabet sütunu, üstündeyse kapasite sütunu belirleyicidir. Bu, uzak bir uç noktada hiç sorulmayan bir sorudur, çünkü orada eşzamanlılık sağlayıcının bütçesinden karşılanır ve fatura yalnız belirteç olarak görünür.
İkinci tablo aynı takası bağlam ekseninde gösteriyor. Bağlam 240’tan 3840’a çıktığında eşzamanlı istek her ölçekte on altıda birine iniyor; büyük ölçekte 1’e, yani sıraya girmeye. Bağlam uzunluğu bir kalite ayarı gibi görünür ama yerel bir kurulumda doğrudan bir kapasite ayarıdır.
Son satır tavanın sert yanını yazıyor. Bütçe iki milyar sayıya inerse büyük ölçek yüklenemez; eşzamanlı istek sayısı düşmez, sıfır olur. Uzak bir uç noktada aşırı yük bir hız sınırı yanıtı üretir ve yeniden denemeyle karşılanır; yerel bir kurulumda karşılık hiç başlamamaktır. İki başarısızlığın biçimi aynı değildir ve ikincisinin yeniden denemesi yoktur.
Eşzamanlılık Bir Gecikme Sınıfıdır
Eşzamanlı istek sayısı tek başına bir kapasite ölçüsüdür; bir iş yüküne uygulandığında bir gecikme sınıfına dönüşür. Yüz yirmi kurgu talebin tamamı sıraya konduğunda küçük ölçek hepsini tek turda karşılıyor, orta ölçek üç, büyük ölçek yirmi dört tur istiyor. Tur sayısı ham süre değildir ve donanıma göre değişmez; bütçe ile ara durumun oranından çıkan, koşumdan koşuma sabit bir sayıdır. Son sıradaki talebin ne kadar beklediğini ölçmek için ihtiyaç duyulan şey de budur: yirmi dört turluk bir kuyruk, tek turluk bir kuyrukla aynı gecikme sınıfında değildir.
Çalışma zamanı seçimi bu tabloda hangi sütuna dokunur, hangisine dokunamaz sorusu da buradan yanıtlanır. Ağırlık sütunu ölçeğin yapısal tarifinden gelir ve hangi çalışma zamanının seçildiğine bağlı değildir. Çalışma zamanının değiştirebildiği tek kalem ara durumun nasıl tutulduğudur: istekler arasında ortak olan bağlam parçasının paylaşılıp paylaşılmadığı, biten bir isteğin yerinin hemen boşaltılıp boşaltılmadığı, bir turda kaç isteğin birlikte işlendiği. Bunların hepsi ikinci sütunu, dolayısıyla eşzamanlı istek ve tur sayısını oynatır. Bir çalışma zamanını bir başkasıyla karşılaştırmanın ölçülebilir biçimi de bu iki sayıyı aynı bütçe ve aynı bağlam uzunluğunda yan yana koymaktır; ad değil, sütun karşılaştırılır.
Özet
- Kendi barındırmada birim belirteç değil sayı adedidir; bellek uzayan bir fatura değil sabit bir tavandır.
- Ağırlık belleği tek kopyadır ve isteklerden bağımsızdır; ara durum her istek için ayrıdır ve bağlam uzunluğuyla doğru orantılı büyür.
- Üç kurgu ölçeğin ağırlığı 70,5 milyon, 367,5 milyon ve 2,14 milyar sayı; genişlik iki katına çıktığında katman parametreleri dörde katlanır.
- Üç milyar sayılık bütçe 960 belirteçlik bağlamda 248, 55 ve 5 eşzamanlı isteğe yetiyor; isabet 0,6333, 0,8167 ve 0,8667.
- Eşzamanlı istek ile isabetin çarpımı 157,1’den 4,3’e düşüyor: en yüksek isabetli ölçek doğru yanıt kapasitesinin otuz altıda birini veriyor.
- Dağılım sıcaklığı sıfırken iki koşum aynı 0,8667’yi veriyor; belirlenimcilik yerel kurulumda bir yapılandırma kararıdır.
Sonraki Adım
Bu dersin bütün hesabı tek bir kabule dayanıyordu: bellek sayı adedi olarak sayıldı ve bir sayının bellekte ne kadar yer tuttuğu sabit varsayıldı. Bu kabul kaldırılabilir. Bir sayı daha az basamakla tutulursa aynı parametre sayısı daha az yer kaplar, aynı bütçeye daha büyük bir ölçek ya da daha çok eşzamanlı istek sığar. Karşılığında modelin dayandığı küçük farklar kabalaşır, ve bu dersin ağırlık satırlarında ayırt edici olan şey tam olarak o küçük farklardı. Sonraki ders basamak sayısını üç düzeyde düşürür ve iki sayıyı yan yana basar: bellek ne kadar düşüyor, isabet hangi noktada ve hangi görevde önce düşüyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.