yoklateknik mülakat

ML Engineer Ti Distributed Strategies Sync Mülakat Soruları

75 doğrulanmış ML Engineer Ti Distributed Strategies Sync 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 Distributed Strategies SyncZorluk 3
8 rank arasında gradyanları toplamak için ring all-reduce çalıştırıyorsunuz. Her rank'ın yerel gradyan tensörü 800 MB. Protokol yükünü göz ardı edersek, HER rank ring all-reduce sırasında ağ üzerinden toplam yaklaşık ne kadar veri gönderir?
  • a800 MB, çünkü tensör rank başına yalnızca bir kez iletilir.
  • b6400 MB, diğer 7 rank'tan alınan tam birer kopya.
  • cYaklaşık 1400 MB, çünkü 2(N-1)/N faktörü burada geçerlidir.
  • d100 MB: hiçbir parça tekrar gönderilmez.
Açıklama:Ring all-reduce, tensörü halka boyunca parça-parça iki fazda taşır; sonuçta her rank tensörün yaklaşık (N-1)/N'ini iki kez gönderir/alır, yani birkaç tam kopya değil, rank başına toplam trafik yaklaşık 2(N-1)/N boyut olur. N=8 ve 800 MB için bu 27/8*800 ≈ 1400 MB eder — 7 tam kopya göndermekten çok daha az.
Ti Distributed Strategies SyncZorluk 1
N rank ile çalışan ring all-reduce'ta, tensör boyutundan bağımsız olarak algoritma toplam kaç iletişim adımı (reduce-scatter + all-gather) çalıştırır?
  • aN adım, rank başına bir.
  • b2(N-1) adım: reduce-scatter, ardından all-gather.
  • cTree indirgemedeki gibi log2(N) adım.
  • d1 adım, tek bir kolektif çağrı.
Açıklama:Ring all-reduce, halka etrafında her biri N-1 ikili değişim gerektiren iki fazdan oluşur: her rank'ı tek bir indirgenmiş parçayla bırakan reduce-scatter fazı, ardından her parçayı her rank'a dağıtan all-gather fazı. Bu toplamda 2(N-1) adım eder, log2(N) değil — log2(N) adım sayısı bunun yerine tree/halving-doubling tarzı indirgemelere aittir.
Ti Distributed Strategies SyncZorluk 2
İki rank, gloo backend'iyle (PyTorch 2.8) şu DDP eğitim adımını çalıştırıyor:
torch.manual_seed(0)
m = nn.Linear(2, 1, bias=False)
ddp = DDP(m)
ddp(torch.full((1, 2), float(rank + 1))).sum().backward()

Rank 0'ın yerel (senkronize edilmemiş) gradyanı [1, 1], rank 1'inki [2, 2] olurdu. backward() döndükten sonra m.weight.grad her iki rank'ta da gerçekte neyi tutar?
  • aHer iki rank'ta da [1.5, 1.5], ortalanmış değer.
  • bHer iki rank'ta da [3.0, 3.0], toplanmış değer.
  • cRank 0'da [1.0, 1.0], rank 1'de [2.0, 2.0], senkronize edilmemiş.
  • dYalnızca rank 0'da [1.5, 1.5]; rank 1 [2.0, 2.0] değerini korur.
Açıklama:Bu doğrudan ölçüldü: aynı değerler üzerinde dist.all_reduce(t, op=SUM) 3.0 verir, ama DDP'nin gömülü backward kancası toplanan gradyanı .grad'a yazmadan önce world_size'a böler, dolayısıyla her iki rank da toplam değil ortalama olan [1.5, 1.5]'i alır ve backward() sonrası iki rank da aynı değeri görür.
Ti Distributed Strategies SyncZorluk 3
Bir ekip tek-GPU eğitiminden 4-rank DDP'ye geçiyor. Kodu 'basit' tutmak için DDP'nin iletişim kancasını, dist.all_reduce(bucket.buffer(), op=SUM)'ı doğrudan çağıran ve world size'a bölmeyen özel bir kancayla değiştiriyorlar (bu test edildi: böyle yapmak .grad'ı ortalama değil ham çapraz-rank TOPLAM'da bırakıyor). Tek-GPU koşusuyla aynı öğrenme oranını koruyunca en muhtemel acil belirti nedir?
  • aDeğişiklik olmaz; PyTorch öğrenme oranını otomatik yeniden ölçekler.
  • bEğitim koşular arası bit-deterministik hale gelir.
  • cKayıp eğrisi tek-GPU eğitimiyle tamamen aynıdır.
  • dEtkin adım boyutu, öğrenme oranına göre yaklaşık 4 kat fazla büyüktür.
Açıklama:Bir güncelleme w -= lr * grad şeklindedir. grad artık 4 rank'ın ortalaması yerine toplamıysa, benzer rank-başı gradyanlar için doğru ölçeklenmiş bir gradyanın kabaca 4 katı büyüklüğündedir, dolayısıyla etkin adım boyutu yaklaşık world_size kadar büyür — öğrenme oranı world_size'a bölünerek telafi edilmedikçe genelde kararsızlık veya ıraksama olarak gözlenir.
Ti Distributed Strategies SyncZorluk 2
Aynı DDP adımında rank 0 yerel olarak 1 örneklik, rank 1 ise 3 örneklik bir batch işliyor (dengesiz bölünme). Bu ölçüldü: DDP'nin senkronize gradyanı, tüm 4 örneği birleştiren örnek-sayısı-ağırlıklı bir ortalama değil, her rank'ın yerel örnek-başı-ortalama gradyanının DÜZ (1/world_size) ortalamasına eşit. Bu ne anlama gelir?
  • aPratikte hiçbir şey; DDP önce yerel batch boyutuna göre yeniden ağırlıklandırır.
  • bBatch boyutları farklı olduğunda senkronize gradyan tanımsızdır (NaN).
  • cRank 0'ın örneği ortalamadan sessizce düşürülür.
  • dRank 1'in 3 örneği, gerçek havuzlanmış ortalamaya göre az ağırlıklandırılmıştır.
Açıklama:1+3=4 örnek üzerindeki gerçek havuzlanmış ortalama, rank 1'in katkısını rank 0'ınkinden 3 kat fazla ağırlıklandırırdı. Ama DDP'nin düz 1/world_size ortalaması, rank 0'ın yerel ortalamasına (1 örnek üzerinden) rank 1'in yerel ortalamasıyla (3 örnek üzerinden) aynı ağırlığı verir, dolayısıyla rank 1'in örnekleri örnek-sayısı-ağırlıklı bir ortalamaya göre az temsil edilmiş olur.
Ti Distributed Strategies SyncZorluk 2
DDP'de gradyan 'bucketing'i (kovalama), tek bir tampon üzerinde tek bir all-reduce çalıştırmadan önce birden fazla parametrenin gradyanını o tamponda gruplar. DDP'nin, parametre başına bir all-reduce çalıştırmak yerine bunu yapmasının ana nedeni nedir?
  • aRank başına GPU ve host bellek ayak izini azaltır; kovalanmış gradyanlar, ayrı ayrı parametre başına iletişim tamponlarını canlı tutma ihtiyacının yerini alır.
  • bMatematiksel olarak zorunludur; naif parametre-başına ortalama, önce tensörler gruplanmadan sayısal olarak geçerli değildir.
  • cÇağrı başı yükü azaltır ve backward ile örtüşür.
  • dBackend'ler arasında sonuçları bit-özdeş kılmayı amaçlar.
Açıklama:Parametre başına ayrı bir kolektif çalıştırmak yüzlerce küçük, yüksek-yük çağrısı demek olurdu. Bucketing, gradyanları daha az sayıda ve daha büyük all-reduce çağrısında toplar; ve backward katman katman gradyan hesapladığından, tamamen hazır hale gelen bir kova, backward diğer katmanlar için gradyan hesaplamaya devam ederken iletişime başlayabilir — iletişimi hesaplamayla örtüştürür.

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

Mülakata başla