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ışı — bölümleme, kira kuyruğu, doğrulanmış kabul, özellik testinden geçirilmiş birleştirici — motorun yapmak üzere kurulduğu ve doğrulandığı davranıştır. 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 doğrulanmadan hiçbir şey kabul edilmez. Ö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 için sözünüze güvenmez. Beyan edilmiş bir birleştiricinin birleşme ve değişme özellikleri, bir havuz onu kullanmadan önce özellik testinden geçirilir — 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.

Üç 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ıdır — yerel ağda üçü doğrudan konuşur — ama ü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 — ekran uyanıklık kilidi izne bağlıdır; iki makinede verilmiş, üçüncüsünde unutulmuştur 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ştir; bir çekiliş fazlası değil.

Yalnızca doğrulanan katlanır#

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. Kendi cihazlarınız arasında bu denetim hileden çok teklemeye karşıdır; ama her güven rejiminin geçtiği kabul yolu aynıdır: Bir avuç Shard sessizce nokta denetimi olarak yeniden çalıştırılır ve beyan edilmiş tolerans içinde karşılaştırılır. Tolerans, 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 demektir; üç makine tam olarak bu anlamda uyuşabilir. 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 — kira kuyruğu doğrusala yakın ölçeklenir, hem de üç eşin çok ötesine. 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; o yol dürüstçe onlarca kararlı eşte durur, binlerde değil — 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'dur. Her Shard doğrulanmış, her çekiliş yeniden oynatılabilir, bütün öğleden sonra bir URL ile atıf verilebilir.

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

← Tüm yazılar