Hesaplama

Üç dizüstü, tek Monte-Carlo

Gerçekten önemsediğiniz sayı, haftalardır üzerine titrediğiniz bir hattın ucundan çıkıyor: her biri dürüst bir belirsizlik taşıyan yedi ölçülmüş girdi, doğrusal olmayan bir dönüşüm zincirinden geçip tek bir boyutsuz orana dönüşüyor. Nokta tahmini kolay. Hata payı değil. Birinci dereceden hata yayılımı — her şeyi doğrusallaştır, varyansları topla — hattın, girdilerin saçılımı boyunca aşağı yukarı düz olduğunu varsayar. Bu hat görünür biçimde düz değil: Üçüncü dönüşüm, girdilerden birini doyuma giden bir eğriden geçiriyor ve doyum, doğrusallaştırmanın öldüğü yerdir. Cebir güveni hak etmemeye başlayınca yapılması gerekeni yaparsınız: girdileri dağılımlarından örnekleyin, hattı her çekilişte çalıştırın, çıktı dağılımı kendi adına konuşsun. Monte-Carlo. Monte-Carlo'nun tek sorunu, ezelden beri olan sorunudur — N.

Ayrıca üç dizüstünüz var. Görünen o ki bütün hikâye bu.

Adım adım örnek

Kurgulanmış bir vaka; laboratuvar raporu değil: stüdyo henüz açılmadı (bugün neredeyiz). Aşağıdaki her hesap birebir doğrudur ve kâğıt üzerinde doğrulanabilir — σ/√N, örnek bütçesi, eşit olmayan üç makinenin ulaşabileceği tavan. Platformun davranışı tasarımın kendisidir ve bugün yalnızca bir kısmı çalışıyor: Bölümleme ve koordinatörün kira kuyruğu uygulanmış ve test edilmiş durumda; ama henüz hiçbir tarayıcı havuzlanmış bir Shard'ı uçtan uca çalıştırmadı, kabul adımı ile birleştirici denetimi ise hâlâ inşa ediliyor — aşağıdaki bölümler hangisinin nerede olduğunu söylüyor. Buradaki hiçbir süre bir ölçüm değildir ve öyleymiş gibi de sunulmaz.

İnsanı makine aramaya gönderen aritmetik#

Kestirici egzotik bir şey değil — bir örneklem ortalaması. x₁ … x_N çekin, g hattını her çekilişte değerlendirin, ortalayın. Varyansı Var(ĝ_N) = σ²/N; burada σ², tek bir değerlendirmenin varyansıdır. Standart hata da σ/√N gibi düşer. O karekök iki yönde de acımasızdır: Örneklemi dörde katlayın, hata yalnızca yarıya iner; bir kararlı ondalık basamak daha isteyin, fatura yüz kat gelir.

Diyelim ki 65.536 çekilişlik bir pilot Shard σ'yı yaklaşık 0,31 olarak kestiriyor ve siz aralığın dördüncü ondalığa kadar oturmasını istiyorsunuz — 5·10⁻⁵ dolayında bir standart hata. Aritmetik bunu N ≥ (0,31 / 5·10⁻⁵)² ≈ 38 milyon değerlendirmeye çevirir. 640 Shard × 65.536 örneğe yuvarlayın: 41.943.040 çekiliş. Pilot hızı ileriye uzattığınızda bu, en hızlı makinenizin bölünmemiş dikkatinden uzunca bir dilim demek — fan sesi dahil.

Ama matematiğin neyi istemediğine bakın. Çekilişler kurgu gereği bağımsızdır; rastgele akışlar hiç örtüşmediği ve sondaki katlama doğru yapıldığı sürece ortalama, hangi örneği hangi makinenin değerlendirdiğini umursamaz. Monte-Carlo yalnızca paralelleştirilebilir değildir; utanç verecek kadar paraleldir — ders kitabındaki iyi durum, dağıtık hesaplama broşürlerinin sessizce genelleme yaptığı durum. Elinizdeki, iyi durum. Ve evde iki dizüstü daha var.

Tek iş, 640 parça, sıfır bağımlılık#

Scellis'te havuzlanmış iş tek bir mekanizmadır: İçerik adresli bir iş, Shard'lara bölünür, cihazlardan oluşan bir havuzda çalıştırılır, beyan edilmiş bir indirgemeyle katlanır ve herhangi bir makbuz basılmadan önce bağımsız yeniden çalıştırmayla nokta denetiminden geçirilir. Örnekleyiciniz zaten sıradan bir iş akışı; onu havuzlanabilir kılmak, nasıl bölümleneceğini beyan etmek demek. by_seed ile bölümleyin: Her Shard kök tohumu paylaşır ve sayaç tabanlı RNG'nin ayrık bir sayaç aralığına sahip olur. Böylece 317 numaralı Shard tam olarak kendi 65.536 örneğini çeker — her makinede, her gün aynılarını — ve iki Shard asla aynı noktayı çekemez. Shard başına yeniden üretilebilirlik bölümlemenin kendisinden çıkar; örnekler arasında eşgüdümlenecek hiçbir şey yoktur.

Shard'lar örnek değil, akümülatör döndürür. Her biri değerlendirmelerini sabit boyutlu bir duruma katlar — adet, ortalama, ikinci merkezi moment ve aralığı pilottan dondurulmuş 256 histogram kutusu: megabaytlık bir örnek dökümü yerine birkaç yüz bayt. Beyan edilen indirgeme, iki durumu şöyle birleştirir:

js
// iki Shard akümülatörünü birleştir — birleşmeli, değişmeli
function merge(a, b) {
  const n = a.n + b.n;
  const d = b.mean - a.mean;
  return {
    n,
    mean: a.mean + d * (b.n / n),
    m2: a.m2 + b.m2 + (d * d * a.n * b.n) / n,
    bins: a.bins.map((c, i) => c + b.bins[i]),
  };
}

Bütün tasarımın en sevdiğim ayrıntısı: Platform, bu cebir konusunda sözünüze güvenmeyecek şekilde tasarlandı. Beyan edilmiş bir birleştiricinin birleşme ve değişme özellikleri, bir havuz onu kullanmadan önce özellik testinden geçirilecek — rastgele durumlar, ters sıralar, farklı ağaç biçimleri. Çünkü sessizce birleşmeli olmayan bir birleştirici, ağaç indirgemesiyle kendinden emin ama yanlış sayılar üretir ve dikiş yerini kimse göremez. Bu denetim hâlâ inşa ediliyor; o gelene dek her indirgeme, cebirini beyan etmek zorunda olan yerleşik bir öğedir ve kullanıcının yazdığı bir birleştirici henüz kabul edilmiyor.

Üç dizüstü, tek kuyruk#

Buradaki havuz, Scellis'in bildiği en sakin tür: kendi cihazlarınız. Gündelik dizüstünüz, pencere kenarında yaşayan eskisi ve masadaki ağır makine — üçü de aynı hesapla oturum açmış durumda; çünkü kendi cihazlar rejimi dürüstçe bunu ister. Kurulum dakikalar sürer: Her makine kendi hesaplama iznini bir kez sorar; altında bir bütçe denetleyicisi ve bir pil alt sınırı durur. Pencere kenarındaki dizüstü, fişe takıldığı anda katılır — bir pil alt sınırından beklenecek davranış tam olarak budur.

Dağıtım bir çekmedir, asla bir atama değil. Bir cihaz kuyruktan bir Shard kiralar, hesaplar, akümülatörü teslim eder, sıradakini kiralar. Kimin ne kadar iş hak ettiğini kimse modellemez: Hızlı makine yalnızca daha erken döner ve daha çoğunu alır; yavaş olan da kendi dürüst payını kemirir. Ve bu, üçü de size ait dizüstüler arasında bile şu değildir: sunucusuz. Veri düzlemi eşler arası olacak şekilde tasarlanmıştır — yerel ağda üçünün doğrudan konuşması amaçlanır, ama bu yol hâlâ devreye alınıyor — yine de üyelik ve kiralar için bir koordinatör oturumu, çalıştırma boyunca devrede kalır. Tek başına bir çalıştırmanın hiçbir sunucuya ihtiyacı yoktur; havuzlanmış olanın kontrol düzlemi için vardır ve Scellis bu cümleyi geveleyerek değil, yüksek sesle söyler.

Pencere kenarındaki dizüstü uykuya dalıyor#

Şimdi bilerek bozalım. Pencere kenarındaki dizüstü çalıştırmanın ortasında uykuya dalsın — kapağını orada kimse açık bırakmamıştır ve bu tartışmayı işletim sistemi her zaman kazanır. Platform aksini iddia etmez; yaptığı şey bunu atlatmaktır. Shard panosu, bayatlamaya başlayan küçük bir kira kümesi gösterir. Süresi dolan kira kuyruğa geri düşer ve öteki iki makine, kimse istemeden sahipsiz işi çalar. İş çalma, geciken eşleri toparlama ve çökme kurtarması burada aynı mekanizmadır — düşmüş bir kira düşmüş bir kiradır; sebebi yavaş bir Shard da olsa, kapanan bir sekme de, açık bırakılması gereken bir kapak da.

Makineyi uyandırdığınızda hiçbir şey olmamış gibi yeniden katılır ve kiralamaya başlar — kuyruğun gözünde gerçekten de bir şey olmamıştır. Şekerlemenin maliyeti, o makinenin uyurken yapmadığı iş ile o sırada elinde tuttuğu Shard'lardır — bunlar kendi tohumlarından başka bir makinede yeniden hesaplanır — ve tek bir çekiliş fazlası değil.

Yalnızca doğrulanan katlanır#

Tasarımda kabul edilen sonuçlar, var olan tek sonuçlardır: Bir Shard toplama ancak doğrulamadan sonra katılır — ve hat, sizin donanımınıza ayrıcalık tanımaz. Her güven rejiminin geçtiği kabul yolu aynıdır: Shard'ların belirlenimci bir dilimi nokta denetimi olarak yeniden çalıştırılır. Kendi cihazlarınız arasında bu denetimin hileden çok teklemeye karşı koruması amaçlanıyor; ama bugün orada hiçbir şeye kefil olamıyor: Makbuz ancak bağımsız bir hesabın yeniden çalıştırması aynı sonucu verirse basılır ve tek hesaptaki üç dizüstü tek bir kimlik sayılır. Bir uyuşmazlık yakalanır ve işaretlenir, ama henüz düzeltilmez — tartışmalı değer, doğrulanmamış olarak işaretli biçimde çıktıda kalır — ve koordinatör sonuçları hâlâ içerik hash'iyle karşılaştırır; bu yalnızca kesin sonuçlara uyar. Tasarım toleranstır, eşitlik değil — üç farklı GPU bit düzeyinde özdeş float üretmez ve Scellis ürettiklerini asla iddia etmez. GPU yolunda “uyuşmak”, beyan edilmiş tolerans sınıfının içinde kalmak demek olacak; motorun tolerans doğrulayıcıları mevcut, ama koordinatör onları henüz kullanmıyor. Kabulün tam hikâyesi — kiralar, doğrulama, rejimler — rehberde.

Katlama kapandığında ortaya çıkan şey, ucuz hata payının sakladığı şeydir: biçimi görünen bir dağılım. Örneklenenin altında kalan doğrusallaştırılmış bir standart sapma; ağır sağ kuyruğu ıskalayan simetrik bir aralık; yerine-koyma değerinin üzerinde oturan bir ortalama. Mesele zaten doğrusal olmayıştı — artık onu varsayımla geçiştirmek yerine görüyorsunuz. Çalıştırmayı commit edin; program, bölümleme, kök tohum ve motor sürümü tek bir URL'ye sabitlenir ve herhangi bir Shard, tohumu ve sayaç aralığıyla tek başına yeniden oynatılabilir. Çoğu hesaplama hayatının, bu cümleye gerçek para ödeyeceği eski bölümleri vardır.

Dürüst ölçekleme notu#

Şimdi gerisini inandırıcı kılan çekince. Bu ölçeklenir; çünkü iş bağımsız parçalara ayrılır: çekilişler arasında sıfır bağımlılık, birleşmeli bir katlama, Shard başına birkaç yüz baytlık trafik. Bu biçimdeki işler için — parametre taramaları, model toplulukları, k-katlı doğrulama, toplu analiz, Monte-Carlo — aritmetik, bir kira kuyruğunun doğrusala yakın ölçeklenmesine izin verir, hem de üç eşin çok ötesine; gerçi bugünkü koordinatör tek bir işi hâlâ yaklaşık bin doğrulanmış Shard ile sınırlıyor. Ama üç dizüstünün ne satın aldığı konusunda kesin konuşalım: Tavan, üçünün birlikte verebileceğinin toplamıdır — en hızlı makinenize kıyasla bu, 3× değil 2× dolayında bir şeydir; çünkü makineler eşit değildir. Doğrusallık, kapak sayısında değil, teslim edilen kapasitededir.

Senkron eğitimse böyle değildir. Gradyan adımları her eşi her adımda birbirine bağlar, gecikenler bariyeri tutar; tarayıcılar arasında henüz bağlanmamış olan o yol, binlerle değil onlarca kararlı eşle sınırlıdır — ve ileriye dilekle değil, senkroniyi gevşeterek taşınır. Federatif öğrenme duvar saatini değil, katılımcı sayısını ve istatistiksel gücü ölçekler. Scellis bu sınırları kutunun üzerine basar; iyi durumun etiketine güvenmeye değmesinin sebebi de tam budur: Kestirici bağımsız çekilişlerin ortalamasıysa yasa σ/√N'dir, bu yasa kusursuz paralelleşir — ve üç dizüstü gerçekten tek bir Monte-Carlo olabilir. Tasarım gereği her çekiliş yeniden oynatılabilir ve bütün öğleden sonra bir URL ile atıf verilebilir; “her Shard doğrulanmış” ise hâlâ inşa edilen kısım.

  • distributed
  • monte-carlo
  • own-devices
  • statistics

← Tüm yazılar