yoklateknik mülakat

ML Engineer Ti Training Determinism Numerics Mülakat Soruları

75 doğrulanmış ML Engineer Ti Training Determinism Numerics mülakat sorusu — cevaplarıyla çöz, açıklamalarıyla öğren, gerçek simülasyonda kendini test et.

Gerçek simülasyonu dene →

Örnek sorular

Ti Training Determinism NumericsZorluk 3
a = torch.tensor(1.0e16, dtype=torch.float32)
b = torch.tensor(1.0, dtype=torch.float32)
c = torch.tensor(-1.0e16, dtype=torch.float32)
print(((a + b) + c).item())
print((a + (b + c)).item())
print(((a + c) + b).item())

Bu kod 0.0, 0.0, sonra 1.0 yazdırır. Üç satır da aynı üç sayıyı topluyor. Üçüncü sonucun ilk ikisinden farklı çıkmasını ne açıklar?
  • aPrint ifadelerindeki bir hata hangi değişkenin gösterildiğini değiştirmiş
  • btorch.tensor ilk iki çağrıyı önbelleğe alıp bayat bir değer döndürmüş
  • cGruplama sırası değişti ve float32 toplaması birleşmeli değil
  • dNegatif bir işlenen olduğunda float32 toplaması tanımsızdır
Açıklama:(a + c) iki devasa büyüklükteki değeri önce tam olarak 0.0'a iptal ediyor, kalan + b de tam olarak 1.0 bırakıyor. İlk iki gruplamada 1.0, iptal gerçekleşmeden önce 1e16 ile birleşiyor — ve float32'de 1e16, 1.0'lık bir artışı temsil edemediği için bu değer yuvarlanıp kayboluyor (c). Bir print hatası yok (a), torch.tensor'da önbellekleme yok (b), ve negatif işlenenler IEEE 754'te gayet iyi tanımlıdır (d).
Ti Training Determinism NumericsZorluk 1
Bir stajyer, aynı tek-GPU eğitim adımını aynı seed ile iki kez çalıştırıyor, ama bir batch içindeki örnek başına loss'ların nasıl toplandığını değiştiriyor (soldan sağa döngü ile ağaç-şekilli ikili toplama). İki toplam son birkaç ondalık basamakta farklı çıkıyor. Bunu en doğru şekilde nasıl tanımlarız?
  • aKayan nokta toplaması birleşmeli olmadığı için beklenen bir etki
  • bBir koşuda seed'in gerçekte uygulanmadığının bir belirtisi
  • cYalnızca toplama yöntemlerinden birinde bir indeks hatası varsa mümkün
  • dİki koşu farklı donanım kullanmadıkça beklenmez
Açıklama:Kayan nokta toplaması birleşmeli değildir: (x+y)+z ile x+(y+z) matematiksel olarak aynı toplam olsa da farklı yuvarlanabilir. Toplama stratejisini değiştirmek gruplamayı değiştirir, bu yüzden son basamakta küçük bir fark beklenir, bir hata değildir (a). Seed rastgeleliği yönetir, deterministik toplama sırasını değil (b). Bir indeks hatası gerekmez (c), ve bunun iki koşu arasındaki donanım farkıyla ilgisi yoktur (d).
Ti Training Determinism NumericsZorluk 3
Bir ekip aynı eğitim script'ini — özdeş kod, veri ve sabit bir seed ile — yalnızca hangi PyTorch minor sürümünün kurulu olduğu bakımından farklı iki makinede yeniden çalıştırıyor (birinde rutin bir bağımlılık güncellemesi gerçekleşmiş). Nihai loss, 1. adımdan itibaren ufak bir miktar farklılaşıyor. Bu, seed'in doğru sabitlenmediğinin bir işareti midir?
  • aHayır — sabit bir seed yalnızca rastgeleliği sabitler, kütüphane sürümünün çekirdeğini değil
  • bEvet — sabit bir seed, hangi kütüphane sürümü kurulu olursa olsun bit-özdeş sonuçları garanti eder
  • cHayır — bunun için PyTorch'un bir sürüm uyuşmazlığı algıladığında seed'lemeyi sessizce devre dışı bırakması gerekirdi, ki öyle bir şey olmuyor
  • dEvet — bunun tek geçerli olduğu durum, iki makinenin de ayrıca farklı işletim sistemleri çalıştırmasıdır
Açıklama:Sabit bir seed üretilen 'rastgele' sayılar dizisini kontrol eder, ama belirli bir kütüphane sürümünün hangi çekirdek uygulamasını ya da varsayılan algoritmayı kullandığı hakkında hiçbir şey söylemez — rutin bir sürüm yükseltmesi, varsayılan bir çekirdeğin iç gruplamasını ya da algoritma seçimini değiştirebilir, bu da özdeş kod, veri ve seed ile bile ufak ama gerçek bir yuvarlama farkı üretir (a). Seed, kütüphane sürümleri arasında herhangi bir garanti genişletmez (b). Bir sürüm farkının seed'lemeyi devre dışı bırakmasıyla ilgili bir şey yok (c), ve bu özellikle bir işletim sistemi sorunu değildir (d).
Ti Training Determinism NumericsZorluk 1
4 rank'lı bir veri-paraleli işte, her rank kendi augmentation hattını kurmadan hemen önce torch.manual_seed(42) çağırıyor. Her rank yine de farklı bir görüntü diliminde çalışıyor. Gözlemlenebilir sonuç nedir?
  • aYine de rank'lar arasında augmentation farklılaşır, çünkü DataLoader bu seed'i yok sayar
  • bHer rank'ın augmentation akışı aynı kararlar dizisini üretir
  • cSeed değeri birden fazla rank'ta özdeş olduğu için iş çöker
  • dÖzdeş bir seed ikinci kez tespit edildiğinde augmentation devre dışı kalır
Açıklama:Her rank'ı aynı değerle seed'lemek, her rank'ın RNG generator'ını özdeş bir iç duruma sokar, bu yüzden o generator'dan k. çekiliş her rank'ta aynı sayıdır; o sayının karşılık geldiği augmentation kararı da bu yüzden her rank'ın hattında aynı konuma düşer, yalnızca o rank'ın kendi görüntülerine uygulanır (b). Burada augmentation'ı devre dışı bırakan ya da işi çökerten bir şey yok (c, d), ve DataLoader bu şekilde ayarlanan bir seed'e gerçekten uyar (a).
Ti Training Determinism NumericsZorluk 2
t = torch.tensor([1.0, 3.0, 3.0, 2.0, 3.0])
print(t.argmax().item())

Maksimum değer 3.0, 1, 2 ve 4. indekslerde görünüyor. Bu ne yazdırır?
  • a4, maksimum değeri taşıyan son indeks
  • bHer koşuda rastgele seçilen farklı bir indeks
  • cMaksimum tekil olmadığı için bir RuntimeError
  • d1, maksimum değeri taşıyan ilk indeks
Açıklama:torch.argmax() deterministik olarak maksimumun oluştuğu ilk indeksi döndürür — burada indeks 1 (d), sonuncusu değil (a) ve rastgele bir seçim de değil (b). Beraberliklerde hatasız çalışır (c).
Ti Training Determinism NumericsZorluk 2
Aynı GPU adımının aynı girdiler ve seed ile iki koşusu, birçok thread'in katkısını atomic add talimatlarıyla biriktiren bir gradyan-scatter çekirdeği kullanıyor. Sonuçtaki gradyanlar son birkaç mantissa bitinde farklılaşıyor. En doğrudan neden nedir?
  • aGPU'nun bellek önbelleği iki koşu arasında sessizce bayat gradyan değerlerini elde tutuyor
  • bRastgelelik CPU host kodundan geliyor, GPU çekirdeğinden değil
  • cAtomic-add biriktirmesi varış sırasını sabitlemez
  • dBu yalnızca desteklenmeyen bir PyTorch kurulumunda olabilir
Açıklama:Atomic-add çekirdekleri, thread'lerin işi bitirdikçe paylaşılan bir biriktiriciye eklemesine izin verir ve thread tamamlanma sırası koşular arasında sabit değildir — bu yüzden toplama sırası, dolayısıyla tam yuvarlanmış float sonucu, özdeş girdilerle bile koşudan koşuya değişebilir (c). Bayat değer önbelleklemesi söz konusu değil (a); kaynak host kodu değil GPU çekirdeğinin çalışma sırasıdır (b); ve bu belgelenmiş bir özelliktir, bozukluk değildir (d).

2400 soruluk ML Engineer bankasında kendini sına.

Mülakata başla