İçeriğe geç
academia.sh

Ders 11 / 11

Maliyet ve Küme Boyutlandırma

Bir kümenin kaç işçiyle kurulacağı kararının süre ile toplam iş arasında verildiğinin ve iki sayının ters yönlere gittiğinin sayılması: aynı 2200 satırlık iş bir, iki, dört, sekiz ve on altı işçide süre 2250, 3691, 3179, 2610 ve 1398, toplam iş 2200, 5830, 7414, 8074 ve 8635 verir; süre inerken toplam iş çıkar ve hangisinin ödendiği yazılmadan boyutlandırma kararı verilemez. İkinci işçinin süreyi 2250'den 3691'e çıkarması karıştırmanın doğmasından gelir ve çarpıklığı 1,00 olan iyi bir anahtarda bile 2250'den 2800'e çıkış görülür. İşçi ile sürenin çarpımı 2250'den 22368'e tek yönlü tırmanır, sabit bedel işçi başına sayıldığında on altı işçinin kazancı 852'den 102'ye iner ve ağ bedeli 12'ye çıktığında en kısa süreyi veren kurulum tek işçiye döner. Ders kursun kapanışıdır ve on bir dersin sayılarını tek tabloda toplar.

İçindekiler

Bir önceki ders bedelin beşinci adını yazdı: yeniden hesaplanan satır. Ondan önce taşınan satır, kopya, çarpıklık ve tutulan satır gelmişti. Beş adın altında hep aynı iki sayı duruyordu — bir işin ne kadar sürdüğü ve toplamda ne kadar iş yaptığı. Geriye kursun en sık sorulan sorusu kalıyor: bu küme kaç işçiyle kurulmalı.

Soru masum görünür ve yanıtı yoktur, çünkü eksiktir. Bir kümeyi büyütmek iki sayıyı aynı anda değiştirir ve bunlar ters yönlere gider. Bu ders işçi sayısını birden on altıya süpürür, her adımda ikisini de yazar ve kararın hangi ölçüte, hangi seçime ve hangi bölüşüm anahtarına asılı olduğunu sayar.

  • DB53. Kaynak, hat ve dağıtık kurulum kurgudur ve ders içinde üretilir. Hiçbir dağıtık işleme çatısı, küme yöneticisi ya da bulut servisi çağrılmaz. Tohum 20260218.
  • DB54. Maliyet muhasebesi yordamı Bulut Bilişim müfredatındaki Bulut Yönetişimi, Güvenlik ve Maliyet kursunda ve Yapay Zekâ Mühendisliği müfredatındaki Model API’leri ile Uygulama Geliştirme kursunda ölçüldü; tekrarlanmaz. Burada maliyet yalnız süre ve toplam iş olarak yazılır; hiçbir para birimi ya da fiyat kullanılmaz.
  • DB55. Süre en yüklü işçinin işidir ve bu modelin kendi birimidir, ham milisaniye değildir. Toplam iş bütün işçilerin yaptığı işin toplamıdır.
  • DB56. AG_BEDELI = 3 ve GOREV_SABIT = 50 birer seçimdir; bu dersin sonucu ikisine de duyarlıdır ve aşağıda ikisi de değerleriyle birlikte ele alınır.
  • DB57. maliyet sabit bedeli iş başına bir kez sayar; Kaynak Yöneticileri dersi aynı bedeli işçi başına sayar. İki sayım burada yan yana iki sütun olarak yazılır.
  • DB58. Taban çizgisi tek işçidir: karıştırma yok, çarpıklık 1,00, süre 2250, toplam iş 2200.

İşçi Süpürmesi

İlk blok kaynağı, hattın tüketime kadarki üç aşamasını ve bölüşüm ile maliyet ölçülerini kurar. Ölçülen iş kursun boyunca kullanılan iştir: satırlar bolge anahtarıyla bölüşülmüş, sonra abone anahtarına karıştırılıyor.

# KURGUDUR. Olcum aginin sayac okumalari , hattin ilk uc asamasi ve dagitik
# kurulum ders icinde uretilir; hicbir dagitik isleme catisi , kume yoneticisi
# ya da bulut servisi 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 a1_ayikla(kayit):
    ZOR = ("abone", "donem", "bolge", "endeks", "birim")
    tut = [k for k in kayit if all(a in k for a in ZOR)]
    return tut, len(kayit) - len(tut)


def a2_tekille(kayit):
    gor, tut = set(), []
    for k in kayit:
        ad = (k["abone"], k["donem"])
        if ad in gor:
            continue
        gor.add(ad)
        tut.append(k)
    return tut, len(kayit) - len(tut)


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


ISCI, AG_BEDELI, GOREV_SABIT = 4, 3, 50


def satirlar():
    v, _ = a1_ayikla(kaynak_uret())
    v, _ = a2_tekille(v)
    v, _ = a3_tuketim(v)
    return v


def izno(m):
    h = 2166136261
    for c in str(m):
        h = ((h ^ ord(c)) * 16777619) & 0xFFFFFFFF
    return h


def dagit(kayitlar, anahtar, isci=ISCI):
    kova = {i: [] for i in range(isci)}
    for k in kayitlar:
        kova[izno(k[anahtar]) % isci].append(k)
    return kova


def yuk(kova):
    n = [len(v) for v in kova.values()]
    return {"toplam": sum(n), "en_yuklu": max(n), "en_az": min(n),
            "carpiklik": round(max(n) / (sum(n) / len(n)), 4)}


def karistir(kova, yeni_anahtar, isci=ISCI):
    yeni = {i: [] for i in range(isci)}
    tasinan = 0
    for eski, kayitlar in kova.items():
        for k in kayitlar:
            hedef = izno(k[yeni_anahtar]) % isci
            if hedef != eski:
                tasinan += 1
            yeni[hedef].append(k)
    return yeni, tasinan


def maliyet(kova, tasinan=0, isci=ISCI, ag=AG_BEDELI, sabit=GOREV_SABIT):
    """Sure = en yuklu iscinin isi (paralel). Toplam is ayrica sayilir."""
    n = [len(v) for v in kova.values()]
    return {"sure": max(n) + tasinan * ag // isci + sabit,
            "toplam_is": sum(n) + tasinan * ag, "tasinan": tasinan}


TUM = satirlar()
SAYI = (1, 2, 4, 8, 16)
print(f"is {len(TUM)} satir , bolusum anahtari bolge , karistirma aboneye")
print("isci  carpiklik  tasinan  sure  toplam is  isci x sure  sure (sabit isci basina)")
for i in SAYI:
    kv = dagit(TUM, "bolge", i)
    _, t = karistir(kv, "abone", i)
    m = maliyet(kv, t, i)
    mb = maliyet(kv, t, i, sabit=i * GOREV_SABIT)
    print(f"{i:>4}  {yuk(kv)['carpiklik']:>9}  {t:>7}  {m['sure']:>4}  {m['toplam_is']:>9}"
          f"  {i * m['sure']:>11}  {mb['sure']:>23}")
is 2200 satir , bolusum anahtari bolge , karistirma aboneye
isci  carpiklik  tasinan  sure  toplam is  isci x sure  sure (sabit isci basina)
   1        1.0        0  2250       2200         2250                     2250
   2       1.66     1210  3691       5830         7382                     3741
   4       3.32     1738  3179       7414        12716                     3329
   8       6.64     1958  2610       8074        20880                     2960
  16       6.88     2145  1398       8635        22368                     2148

Süre sütunu düz inmez: 2250’den 3691’e çıkar, sonra 3179, 2610 ve 1398’e iner. Tek işçinin altına ancak dörtten sonra düşer. Toplam iş sütunu ise hiç geri dönmez: 2200’den 5830’a, 7414’e, 8074’e ve 8635’e tek yönlü tırmanır. Aynı satır kümesi, aynı sonuç, dört kat toplam iş.

İkinci satır kursun ikinci iddiasının en net örneğidir. Tek işçide karıştırma yoktur; ikinci işçi eklendiği anda 1210 satır ağdan geçmek zorunda kalır, toplam iş 2200’den 5830’a sıçrar ve en yüklü işçinin payı hâlâ büyük olduğu için süre de yükselir. Paralellik bedava değildir ve ilk adımı negatiftir.

Son iki sütun kararın nasıl döndüğünü gösterir. İşçi ile sürenin çarpımı — kümeyi iş boyunca kiralamanın karşılığı — 2250’den 22368‘e hiç inmeden tırmanır; bu ölçüte göre en iyi kurulum tek işçidir. Sabit bedel işçi başına sayıldığında on altı işçinin süresi 1398’den 2148’e çıkar ve tek işçiye olan üstünlüğü 852 birimden 102 birime iner. GOREV_SABIT = 50 gibi küçük bir seçim, on altı katlık bir kurulumun kazancını neredeyse siler.

Karar Neye Asılı

Üç ölçüt üç ayrı yanıt verdi. Sıradaki soru bu yanıtların modeldeki iki seçime ve bölüşüm anahtarına ne kadar bağlı olduğudur. İkinci blok ağ bedelini süpürür, sonra aynı süpürmeyi çarpıklığı olmayan bir anahtarla tekrarlar.

# Bu blok ilk bloktaki TUM , SAYI , dagit , yuk , karistir ve maliyet tanimlarini surdurur.
print("ag bedeli  " + "  ".join(f"{i:>5}" for i in SAYI) + "   en kisa sure")
for ag in (1, 3, 6, 12):
    s = []
    for i in SAYI:
        kv = dagit(TUM, "bolge", i)
        _, t = karistir(kv, "abone", i)
        s.append(maliyet(kv, t, i, ag=ag)["sure"])
    print(f"{ag:>9}  " + "  ".join(f"{v:>5}" for v in s) + f"   {SAYI[s.index(min(s))]:>13}")

print("\nbolusum anahtari abone , karistirma doneme")
print("isci  carpiklik  tasinan  sure  toplam is")
for i in SAYI:
    kv = dagit(TUM, "abone", i)
    _, t = karistir(kv, "donem", i)
    m = maliyet(kv, t, i)
    print(f"{i:>4}  {yuk(kv)['carpiklik']:>9}  {t:>7}  {m['sure']:>4}  {m['toplam_is']:>9}")
ag bedeli      1      2      4      8     16   en kisa sure
        1   2250   2481   2310   2120   1130              16
        3   2250   3691   3179   2610   1398              16
        6   2250   5506   4483   3344   1800              16
       12   2250   9136   7090   4813   2604               1

bolusum anahtari abone , karistirma doneme
isci  carpiklik  tasinan  sure  toplam is
   1        1.0        0  2250       2200
   2        1.0     1100  2800       5500
   4       1.02     1651  1849       7153
   8       1.04     1927  1058       7981
  16        1.2     2066   602       8398

İlk tablo AG_BEDELI‘nin bir seçim olmasının ne demek olduğunu gösterir. Bedel 1, 3 ve 6’da en kısa süreyi on altı işçi verir; bedel 12’de kazanan tek işçiye döner, çünkü 2604 sayısı 2250’nin üstündedir. Ağın yerel işleme oranı bir kez değişince, on altı katlık bir kümenin gerekçesi ortadan kalkar. Boyutlandırma kararı ölçülen işin değil, ağ ile hesap arasındaki oranın kararıdır ve o oran yazılmadan sonuç taşınamaz.

İkinci tablo çarpıklığın payını ayırır. abone anahtarında çarpıklık on altı işçiye kadar 1,20’yi geçmez ve süre 602’ye iner — bolge anahtarındaki 1398’in çok altına. Buna karşılık ikinci işçinin süreyi yükseltmesi burada da olur: 2250’den 2800’e. Karıştırma iyi bir anahtarla bile doğar ve ilk adımda kazancından büyüktür. Kursun ikinci iddiası çarpıklığın sonucu değildir; çarpıklık onu yalnız derinleştirir.

Özet

  • Aynı 2200 satırlık iş bir, iki, dört, sekiz ve on altı işçide süre 2250, 3691, 3179, 2610, 1398 ve toplam iş 2200, 5830, 7414, 8074, 8635 verir; süre inerken toplam iş çıkar.
  • İkinci işçi süreyi 2250’den 3691’e çıkarır: karıştırma doğar, 1210 satır ağdan geçer ve toplam iş 5830’a sıçrar. Süre tek işçinin altına ancak dört işçiden sonra iner.
  • Üç ölçüt üç ayrı kurulum seçer: süre on altı işçiyi, toplam iş tek işçiyi, işçi ile sürenin çarpımı (2250’den 22368’e) yine tek işçiyi. Hangi ölçütün ödendiği yazılmadan karar verilemez.
  • GOREV_SABIT = 50 işçi başına sayıldığında on altı işçinin süresi 2148 olur ve kazanç 852’den 102‘ye iner; AG_BEDELI 12’ye çıktığında en kısa süreyi veren kurulum tek işçiye döner.
  • Çarpıklığı olmayan abone anahtarında süre 602’ye kadar iner, ama ikinci işçinin süreyi 2250’den 2800’e çıkarması orada da olur; karıştırmanın ilk adımdaki bedeli çarpıklıktan bağımsızdır.

Kurs Kapanışı

Satırlar ortak birim taşımaz; her satırın hangi ölçütle okunduğu ders adının yanındadır. Parantezdeki fark dağıtık kurulum eksi tek işçilik tabandır; işaretin yönü ölçüt adından okunur.

Ders Tek işçilik taban Dağıtık kurulum Bedel
dagitik-hesaplama/01 — süre ve toplam iş tek işçi süre 2250, toplam iş 2200 dört işçi abone süre 611 (−1639), toplam iş 2200 (0) toplam iş dört kurulumda da 2200’dür ve onları birbirinden ayırmaz
dagitik-hesaplama/02 — yerel okunan blok ve süre tek kopya 5/22 yerel, süre 1850 çoğaltma 3 ile 22/22 (+17), süre 650 (−1200) saklanan blok 22’den 66’ya çıkar, dördüncü kopya yerelliğe hiçbir şey katmaz
dagitik-hesaplama/03 — taşınan satır ve toplam iş eşleme taşınan 0, toplam iş 2200 doğrudan indirgeme taşınan 1738 (+1738), toplam iş 7414 (+5214) ön-indirgeme aynı sonucu 20 ara satır ve 2245 toplam işle verir
dagitik-hesaplama/04 — okunan satır ve açılan bölüm istekli plan 6556 satır, 44 bölüm tembel plan 200 satır (−6356), 1 bölüm (−43) plandaki tür hatası ancak ilk eylemde ve 200 satır okunduktan sonra görünür
dagitik-hesaplama/05 — süre ve ödenen sabit bedel tek yuva süre 3000, sabit bedel 800 on altı yuva süre 215 (−2785), sabit bedel 800 (0) her göreve bir yuva verilince sekizden on altıya kazanç 121’de kalıp eklenen 400’e yenilir
dagitik-basarim/01 — taşınan satır ve süre abone düzeninde taşınan 0, süre 611 bolge’ye karıştırınca taşınan 1738 (+1738), süre 1914 (+1303) toplam iş 2200’den 7414’e çıkar; 5214 birimi hiçbir hesap yapmayan saf harekettir
dagitik-basarim/02 — birleştirme süresi, 4000 satırlık boyut yayınlı 5876 bölümlü 5429 (−447) kesişme noktası 2980‘dir ve ağ bedeli 6 ile 12’de bölümlü hiçbir boyutta öne geçemez
dagitik-basarim/03 — çarpıklık ve süre tek işçi çarpıklık 1,00, süre 2250 bolge ile iki işçi çarpıklık 1,66 (+0,66), süre 3691 (+1441) on altı işçide çarpıklık 6,88, boş işçi 13; süre 589’un altına hiçbir sayıda inemez
dagitik-basarim/04 — iki sorgunun toplamı önbelleksiz 5500 önbellekli 3300 (−2200) önbellek tutulmazsa toplam yine 5500’dür ve tek sorguda kazanç 0’dır
dagitik-basarim/05 — yeniden hesaplanan satır denetim noktası yok 1600 aralık 3 ile 400 (−1200) kesin bedel 0’dan 800’e çıkar, oysa aralık 6 da aynı 400’ü verir
dagitik-basarim/06 — süre ve toplam iş tek işçi süre 2250, toplam iş 2200 on altı işçi süre 1398 (−852), toplam iş 8635 (+6435) ikinci işçi süreyi 3691’e çıkarır; sabit bedel işçi başına sayılınca kazanç 102’ye iner

Tablo tek bir kuralın on bir kez yazılmasıdır. Dağıtık bir işin sayısı tek bir sayı değildir: süre ile toplam iş ayrı ölçülür ve hangisinin ölçüldüğü yazılmayan bir hızlanma iddiası eksiktir. İki sütunun aynı satırda ters yöne gittiği yerler kuralın kendisidir: dagitik-hesaplama/03‘te süre düşerken toplam iş 2200’den 7414’e çıkar, bu derste süre 852 birim inerken toplam iş 6435 birim tırmanır. dagitik-hesaplama/01 bunun aynasını gösterir: dört kurulumun süresi 611 ile 2250 arasında değişirken toplam iş dördünde de 2200’dür, yani yalnız toplam işi yazan bir rapor bu kurulumların hiçbirini ayırt edemez.

İkinci iddia aynı tablodan okunur: işçi eklemek işi kötüleştirir. dagitik-basarim/03‘te ikinci işçi süreyi 2250’den 3691’e çıkarır ve toplam işi 5830’a taşır; bu derste aynı adım çarpıklığı 1,00 olan abone anahtarında bile süreyi 2800’e çıkarır. dagitik-hesaplama/05’te sekizden on altı göreve geçişte kazanılan 121 birim, eklenen 400 birimlik sabit bedele yenilir. dagitik-hesaplama/02‘de dördüncü kopya saklanan bloğu 88’e çıkarıp yerelliğe hiçbir şey katmaz. dagitik-basarim/04‘te tek sorgulu bir işte önbellek 2200 satır tutar ve 0 kazandırır, dagitik-basarim/05‘te aralığı altıdan üçe indirmek kesin bedeli 400’den 800’e çıkarıp kurtarmayı hiç değiştirmez. Altı derste eklenen kaynak ödenmiş, karşılığı alınmamıştır.

Üçüncü iddia daha sessizdir: sonuç her kurulumda aynıdır. dagitik-hesaplama/03‘te üç kurulumun sunduğu beş bölge toplamı birebir aynıdır, oysa biri 7414 öbürü 2245 toplam iş harcar. dagitik-basarim/01‘de süre 611’den 1914’e çıkarken çıktı değişmez, dagitik-basarim/02’de iki birleştirme stratejisi her boyutta aynı satırları eşleştirir, dagitik-basarim/03’te üç bölüşüm de bölge toplamlarının aynısını üretir, dagitik-basarim/04’te tutulmayan önbellek sonucu değil yalnız bedeli değiştirir, dagitik-basarim/05’te tam bir kez sağlandığı sürece dört aralık da aynı sonucu verir. Doğruluğu sınayan hiçbir denetim yanlış bölüşümü göstermez; yanlış bölüşüm ancak sayıldığında görünür ve sayılmadığı sürece fatura sessizce büyür.

On bir derste veri bölündü, taşındı, dengelendi, saklandı ve kurtarıldı; yirmi yedi derste ise alındı, dönüştürüldü, depolandı ve sıraya kondu. Bu verinin gittiği yer hiç sorulmadı. Onu besleyen modelin kendisi, aynı veriyle aynı modelin yeniden üretilip üretilemeyeceği ve eğitilen bir modelin üretime nasıl çıkacağı hiçbir derste ölçülmedi. Sonraki kurs hattın çıktısını girdi kabul eder ve bir eğitim koşumunun tekrarlanabilirliğini, sürümlenebilirliğini ve dağıtımını 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