Mulai dari referensi yang memenuhi kebutuhan
Pilih set singkat dengan input biasa, kasus batas, dan batas keputusan. Bekukan model, bobot, prapemrosesan, dan mode train atau eval. Perbandingan antara dua model atau dua batch tidak memungkinkan perbedaan keduanya dikaitkan dengan presisi.
Catat output yang berguna bagi aplikasi Anda, bukan hanya loss. Untuk klasifier, ini dapat mencakup skor dan keputusan; untuk regresi, error dan nilai ekstrem. Periksa terlebih dahulu keberadaan NaN atau inf pada referensi. Eksekusi FP32 yang salah tidak menjadi dasar yang andal hanya karena memiliki lebih banyak bit.
Tetapkan toleransi, kualitas minimum, dan tidak adanya nilai non-finit sebelum pengujian. PyTorch mengingatkan bahwa aritmetika floating-point tidak menjamin hasil yang identik antar perangkat atau jalur eksekusi.
Bedakan autocast, format numerik, dan GradScaler
autocast memilih tipe untuk operasi tertentu sesuai kebijakan komputasinya. Ia tidak mengubah seluruh program menjadi satu format tunggal. Dengan penggunaan ini, hindari mengonversi seluruh model secara manual dengan half(). Dokumentasi saat ini merekomendasikan torch.autocast atau torch.amp.autocast; antarmuka lama torch.cuda.amp sudah usang.
GradScaler bekerja pada skala loss dan gradien selama pelatihan. Ia tidak digunakan sebagai akselerator inferensi, yang tidak melakukan backward. FP16 memiliki rentang numerik yang lebih terbatas daripada BF16; model yang dirancang untuk BF16 dapat mengalami overflow pada FP16. Jadi, penurunan skala yang berulang tidak membuktikan bahwa masalahnya sudah teratasi.
Pilih format berdasarkan kendala model dan operasi yang benar-benar digunakan, lalu verifikasi dukungan pada target. Nama komersial sebuah kartu atau preferensi penyiapan PyTorch tidak membuktikan bahwa operator kustom Anda memiliki kernel yang diinginkan.
Geser tabel untuk membaca semua kolom.| Pilihan | Peran | Kontrol yang diperlukan |
|---|---|---|
| Referensi FP32 | Titik pembanding proyek | Output finite dan kualitas yang diharapkan |
| Autocast FP16 | Sejumlah operasi dalam presisi tereduksi | Rentang numerik dan gradien |
| Autocast BF16 | Kompromi rentang/presisi lainnya | Operator yang tersedia dan kualitas |
| GradScaler | Penanganan skala gradien | Pembaruan yang benar-benar dilakukan |
Menempatkan langkah-langkah pelatihan dalam urutan yang benar
Fragmen yang diusulkan mengasumsikan model dan optimizer sudah dibangun, input dan target berada pada GPU yang sama, serta loss berupa skalar. Fragmen ini belum dijalankan dan bukan merupakan validasi atas suatu penawaran. Konteks autocast melingkupi forward dan loss; backward berlangsung setelah konteks ditutup. Scaler dibuat sekali untuk sesi pelatihan, bukan untuk setiap batch.
Untuk memeriksa atau memotong gradien, pertama-tama hilangkan faktor skala dengan unscale_. Contoh AMP resmi menyarankan untuk melakukannya satu kali per optimizer dan setelah akumulasi gradien yang ditujukan untuk pembaruannya. Ambang pemotongan 1.0 di bawah ini adalah nilai ilustratif yang harus dipilih untuk proyek Anda, bukan rekomendasi universal.
Pemeriksaan di sini menghentikan diagnosis jika loss, gradien, atau norma total tidak finite. Pembacaan CPU ini bersifat intrusif: jangan mengukur waktu fragmen ini. Akumulasi, beberapa optimizer, dan penjadwal memerlukan definisi pembaruan tersendiri.
import torch
# Prasyarat: model, optimizer, loss_fn, inputs, dan targets tersedia.
# Model dan input berada pada perangkat CUDA/HIP yang sama.
dtype = torch.float16 # Pilihan yang harus divalidasi; BF16 adalah percobaan lain.
scaler = torch.amp.GradScaler("cuda", enabled=(dtype == torch.float16))
# Tempatkan di dalam loop Anda, dengan scaler dipertahankan antar batch.
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()Contoh terperinci: dua keputusan yang mirip bukanlah hal yang dapat dipertukarkan
Misalkan ada layanan yang memilih kelas dengan skor tertinggi. Pada sebuah input edukatif, referensi menghasilkan dua skor yang sangat berdekatan: 1,0000 dan 1,0003. Jalur numerik lain dapat mengubah urutannya atau menciptakan kesetaraan. Angka-angka ini menggambarkan sebuah batas keputusan; ini bukan output yang terukur dari FP16 atau BF16.
Verifikasi yang tepat mencakup dua tingkat. Bandingkan skor dengan toleransi yang eksplisit, lalu bandingkan keputusan dan aturan yang diterapkan pada kesetaraan. Perbedaan kecil dalam nilai absolut dapat mengubah tindakan yang dipilih. Sebaliknya, perbedaan numerik yang terlihat dapat tetap tanpa konsekuensi untuk tugas yang ambangnya berada jauh dari skor yang diamati.
Catat identitas, keluaran referensi, uji AMP, dan dampaknya terhadap keputusan. Tetapkan aturan penerimaan sebelum membaca hasil. Jangan perluas toleransi untuk menghilangkan kasus yang mengganggu; keluaran dengan skala berbeda mungkin memerlukan kriteria tersendiri.
Geser tabel untuk membaca semua kolom.| Kriteria | Referensi | Uji AMP | Keputusan |
|---|---|---|---|
| Keluaran final | Perlu diperiksa | Perlu diperiksa | Tolak hasil belum selesai yang tidak dijelaskan |
| Selisih numerik | Nilai yang dipertahankan | Selisih yang harus dihitung | Toleransi yang ditetapkan sebelum uji |
| Keputusan penerapan | Kelas atau tindakan | Kelas atau tindakan | Periksa perubahan |
| Kualitas pada kumpulan data tetap | Perlu diukur | Perlu diukur | Patuhi ambang batas proyek |
Menafsirkan NaN dan pembaruan yang dilewati
Ketika nilai non-finit muncul, cari langkah pertama yang menghasilkannya: masukan, keluaran antara, loss, atau gradien. Jalankan ulang kasus yang sama sebagai referensi, lalu nonaktifkan autocast secara lokal di sekitar operasi yang dicurigai sambil memeriksa juga tipe masukannya. Menjalankan kembali seluruh pelatihan dalam FP32 bisa menjadi pembanding, tetapi tidak otomatis melokalisasi masalahnya.
Scaler dapat mencegah pembaruan ketika gradien mengandung inf atau NaN. Jadi, loop yang terus berjalan belum tentu melakukan pembaruan sebanyak iterasinya. Catat perilaku ini selama diagnosis. Jangan memajukan kebijakan pembelajaran yang diasumsikan mengikuti pembaruan efektif secara membabi buta.
Loss yang finit tidak menjamin gradien yang finit. Sebaliknya, insiden sesaat tidak cukup untuk menyatakan pelatihan tidak dapat digunakan: periksa frekuensinya, progresnya, dan kualitasnya. Resep AMP menyediakan metode untuk mengisolasi autocast dan scaling secara terpisah ketika salah satunya dicurigai.
Menyiapkan rollback yang dapat direproduksi
Sebelum pengujian, simpan konfigurasi referensi, bobot, status optimizer, dan checkpoint yang konsisten. Jika pelatihan Anda menggunakan scaler, statusnya juga merupakan bagian dari pemulihan. Dokumentasikan dtype dan area yang mungkin dibiarkan dalam FP32. Melanjutkan dengan kebijakan berbeda adalah perubahan eksperimental yang harus diidentifikasi, bukan kelanjutan yang secara implisit setara.
Kembali ke konfigurasi sebelumnya jika keluaran menjadi non-finit, jika kualitas keluar dari kriteria yang ditetapkan, atau jika pembaruan berhenti bergerak secara usable. Simpan kasus yang memicu rollback ini. Setelah modifikasi, ulangi perbandingan pada kumpulan data yang sama sebelum memperpanjang durasinya.
Latihan checkpoint Kernodeck memverifikasi pemulihan CPU tanpa AMP. Gunakan kembali metode perbandingannya dengan menambahkan status yang benar-benar digunakan oleh loop Anda.
Mengukur keuntungan hanya setelah validasi numerik
Setelah validasi, ukur memori dan waktu tanpa diagnosis terperinci. Pertahankan bentuk, batch, model, dan kualitas. Pembacaan skalar, sinkronisasi, dan profiler dapat mengubah durasi; hapus pemeriksaan yang mengganggu dari pengukuran akhir.
Pada ROCm, nama perangkat PyTorch tetap cuda dan antarmuka yang sesuai digunakan kembali. Ini tidak menjamin kernel yang sama atau hasil yang identik dengan NVIDIA. Verifikasi backend dan operator proyek pada target. Tidak ada pengurangan memori tetap, penggandaan kecepatan, atau kompatibilitas penyiapan Kernodeck yang diumumkan oleh panduan ini.