İçeriğe geç
academia.sh

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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat