İhtiyaca yanıt veren bir referansla başlayın
Sıradan girişler, sınır durumlar ve karar sınırları içeren kısa bir veri kümesi seçin. Modeli, ağırlıkları, ön işlemeyi ve train veya eval modunu sabitleyin. İki model veya iki batch arasındaki karşılaştırma, aralarındaki farkı kesinliğe atfetmenize olanak tanımaz.
Uygulamanız için faydalı olan çıktıyı kaydedin, yalnızca kaybı değil. Bir sınıflandırıcı için bu, skorları ve kararları içerebilir; bir regresyon için hata ve uç değerleri. Referansta NaN veya inf olup olmadığını şimdiden kontrol edin. Hatalı bir FP32 çalıştırması, daha fazla bite sahip olduğu için güvenilir bir temel hâline gelmez.
Denemeden önce toleransı, minimum kaliteyi ve sonlu olmayan değerlerin bulunmamasını belirleyin. PyTorch, kayan noktalı hesaplamanın cihazlar veya yürütme yolları arasında aynı sonuçları garanti etmediğini hatırlatır.
Autocast, sayısal format ve GradScaler'ı birbirinden ayırt edin
autocast, belirli işlemlerin türünü kendi hesaplama politikalarına göre seçer. Tüm programı tek bir biçime dönüştürmez. Bu kullanımla, tüm modeli elle half() ile dönüştürmekten kaçının. Güncel dokümantasyon torch.autocast veya torch.amp.autocast önerir; eski torch.cuda.amp arayüzleri kullanımdan kaldırılmıştır.
GradScaler, eğitim sırasında kayıp ve gradyanların ölçeği üzerinde etki eder. Geri yayılım yapmayan çıkarım için bir hızlandırıcı olarak kullanılmaz. FP16, BF16'dan daha dar bir sayısal aralığa sahiptir; BF16 için tasarlanmış bir model FP16'da taşabilir. Dolayısıyla ölçeğin tekrar tekrar düşmesi sorunun çözüldüğünü göstermez.
Biçimi, modelin kısıtlarına ve gerçekten kullanılan işlemlere göre seçin, ardından hedefin desteklediğini doğrulayın. Bir kartın ticari adı veya bir PyTorch hazırlık tercihi, özel operatörünüzün istenen çekirdeğe sahip olduğunu kanıtlamaz.
Tüm sütunları görmek için tabloyu kaydırın.| Seçim | Rol | Gerekli kontrol |
|---|---|---|
| FP32 referansı | Projenin karşılaştırma noktası | Sonlu çıktılar ve beklenen kalite |
| Autocast FP16 | Bazı işlemler indirgenmiş hassasiyette | Sayısal aralık ve gradyanlar |
| Autocast BF16 | Aralık/hassasiyet arasında farklı bir denge | Kullanılabilir operatörler ve kalite |
| GradScaler | Gradyan ölçeğinin yönetimi | Gerçekte yapılan güncellemeler |
Eğitim adımlarını doğru sıraya yerleştirin
Önerilen parça, model ve iyileştiricinin (optimizer) zaten oluşturulmuş olduğunu, girdi ile hedefin aynı GPU'da olduğunu ve kaybın skaler olduğunu varsayar. Çalıştırılmamıştır ve bir teklifin doğrulaması niteliğinde değildir. autocast bağlamı forward ve kaybı sarar; backward onun kapanmasından sonra gerçekleşir. scaler, eğitim oturumu için bir kez oluşturulur, her batch için değil.
Gradyanları incelemek veya kırpmak için önce ölçek faktörlerini unscale_ ile kaldırın. Resmi AMP örnekleri bunun her iyileştirici için yalnızca bir kez ve güncellemesine yönelik gradyanlar toplandıktan sonra yapılmasını belirtir. Aşağıdaki 1,0 kırpma eşiği, projeniz için seçilecek örnek bir değerdir, evrensel bir öneri değildir.
Buradaki koruma kontrolleri, kayıp, gradyanlar veya toplam norm sonlu değilse tanılamayı keser. Bu CPU okumaları müdahalecidir: bu parçayı zamanlamayın. Biriktirme, birden çok iyileştirici ve zamanlayıcı, güncellemenin kendi tanımını gerektirir.
import torch
# Ön koşullar: model, optimizer, loss_fn, inputs ve targets mevcut.
# Model ve girdiler aynı CUDA/HIP aygıtında.
dtype = torch.float16 # Doğrulanması gereken seçim; BF16 başka bir denemedir.
scaler = torch.amp.GradScaler("cuda", enabled=(dtype == torch.float16))
# Döngünüze yerleştirin, scaler batch'ler arasında korunur.
optimizer.zero_grad(set_to_none=True)
with torch.autocast(device_type="cuda", dtype=dtype):
prediction = model(inputs)
loss = loss_fn(prediction, targets)
if not bool(torch.isfinite(loss).item()):
raise FloatingPointError("Perte non finie : interrompre le diagnostic")
scaler.scale(loss).backward()
scaler.unscale_(optimizer)
if any(p.grad is not None and
not bool(torch.isfinite(p.grad).all().item())
for p in model.parameters()):
raise FloatingPointError("Gradient non fini : interrompre le diagnostic")
torch.nn.utils.clip_grad_norm_(
model.parameters(), max_norm=1.0, error_if_nonfinite=True,
)
scaler.step(optimizer)
scaler.update()İşlenmiş örnek: birbirine yakın iki karar birbirinin yerine geçmez
En yüksek skora göre sınıf seçen bir hizmet varsayalım. Eğitsel bir girdide referans, birbirine çok yakın iki skor üretir: 1,0000 ve 1,0003. Başka bir sayısal yol, bunların sırasını değiştirebilir veya bir eşitlik yaratabilir. Bu sayılar bir karar sınırını örnekler; FP16 veya BF16'nın ölçülmüş çıktıları değildir.
Doğru doğrulama iki düzey içerir. Skorları açık toleranslarla karşılaştırın, ardından kararı ve eşitliklere uygulanan kuralı karşılaştırın. Mutlak değerde küçük bir fark, seçilen eylemi değiştirebilir. Buna karşılık, gözlemlenen skorlardan uzakta bir eşiği olan bir görev için görünür bir sayısal fark sonuçsuz kalabilir.
Kimlikleri, referans çıktıları, AMP denemesini ve karara etkisini kaydedin. Kabul kuralını sonuçları okumadan önce belirleyin. Rahatsız edici bir durumu ortadan kaldırmak için toleransı genişletmeyin; farklı ölçeklerdeki çıktılar ayrı ölçütler gerektirebilir.
Tüm sütunları görmek için tabloyu kaydırın.| Ölçüt | Referans | AMP denemesi | Karar |
|---|---|---|---|
| Sonlu çıktılar | Kontrol edilecekler | Kontrol edilecekler | Açıklanamayan sonlu olmayan değerleri reddedin |
| Sayısal sapma | Korunan değerler | Hesaplanacak sapma | Denemeden önce tanımlanan tolerans |
| Uygulama kararı | Sınıf veya eylem | Sınıf veya eylem | Değişiklikleri inceleyin |
| Sabit küme üzerinde kalite | Ölçülecek | Ölçülecek | Projenin eşiğine uyun |
NaN değerlerini ve atlanan güncellemeleri yorumlayın
Sonlu olmayan değerler ortaya çıktığında, bunları üreten ilk adımı arayın: girdi, ara çıktı, kayıp veya gradyan. Aynı durumu referans olarak yeniden çalıştırın, ardından şüpheli işlemin çevresinde autocast'i yerel olarak devre dışı bırakın ve girdilerinin türünü de kontrol edin. Tüm bir eğitimi FP32'de yeniden çalıştırmak karşılaştırma için yararlı olabilir, ancak sorunu otomatik olarak yerelleştirmez.
Scaler, gradyanlar inf veya NaN içerdiğinde bir güncellemeyi atlayabilir. Dolayısıyla devam eden bir döngü, mutlaka iterasyon sayısı kadar güncelleme gerçekleştirmiş olmayabilir. Bu davranışı tanılama sırasında kaydedin. Gerçekleşen güncellemeleri takip ettiği varsayılan bir öğrenme politikasını körü körüne ilerletmeyin.
Sonlu bir kayıp, sonlu gradyanları garanti etmez. Tersine, tek seferlik bir olay bir eğitimi kullanılamaz ilan etmeye yetmez: sıklığını, ilerlemeyi ve kaliteyi inceleyin. AMP tarifi, ikisinden biri şüpheli olduğunda autocast ile scaling'i ayrı ayrı izole etmek için bir yöntem sunar.
Yeniden üretilebilir bir geri dönüş hazırlayın
Denemeden önce referans yapılandırmayı, ağırlıkları, optimize edici durumunu ve tutarlı bir checkpoint'i saklayın. Eğitiminiz bir scaler kullanıyorsa, onun durumu da devam etme sürecinin bir parçasıdır. dtype'ı ve varsa FP32'de bırakılan bölgeleri belgeleyin. Farklı bir politikayla devam etmek, örtük olarak eşdeğer bir sürdürme değil, tanımlanması gereken deneysel bir değişikliktir.
Çıktılar sonlu olmaktan çıkarsa, kalite belirlenen ölçütün dışına çıkarsa veya güncellemeler kullanılabilir biçimde ilerlemeyi durdurursa önceki yapılandırmaya dönün. Bu geri dönüşe neden olan durumu saklayın. Bir değişiklikten sonra, süreyi uzatmadan önce karşılaştırmayı aynı küme üzerinde yeniden başlatın.
Kernodeck'in checkpoint alıştırması, AMP olmadan bir CPU devam etme sürecini doğrular. Karşılaştırma yöntemini, döngünüzün gerçekte tükettiği durumları ekleyerek yeniden kullanın.
Kazançları yalnızca sayısal doğrulamadan sonra ölçün
Doğrulamadan sonra, ayrıntılı tanılama olmadan bellek ve süreyi ölçün. Şekilleri, batch'i, modeli ve kaliteyi koruyun. Skaler okumaları, senkronizasyonlar ve profiler süreleri değiştirebilir; son ölçümden müdahaleci kontrolleri kaldırın.
ROCm'de PyTorch cihaz adı cuda olarak kalır ve ilgili arayüzler yeniden kullanılır. Bu, NVIDIA ile aynı çekirdekleri veya aynı sonuçları garanti etmez. Projenin backend'ini ve operatörlerini hedef üzerinde doğrulayın. Bu kılavuz sabit bir bellek azaltımı, hız çarpanı veya Kernodeck kurulum uyumluluğu vaat etmez.