GPU untuk proyek Anda · pembayaran kripto tanpa KYC Cara menyewa
Bahasa Indonesia
Buka konsol
Panduan praktis / KERNODECK

Beralih ke presisi campuran tanpa kehilangan kendali numerik

Tetapkan referensi pada presisi biasa, aktifkan autocast pada perhitungan forward dan loss, lalu bandingkan output, gradien, dan kualitas pada input yang sama. Pada pelatihan FP16, GradScaler membantu menangani gradien beramplitudo kecil; ini tidak membuat semua model kompatibel. BF16 memiliki perilaku numerik yang berbeda. Pertahankan kriteria rollback yang eksplisit sebelum mencari penghematan memori atau kecepatan.

6 menit baca · Panduan untuk developer

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.
Keputusan presisi yang harus divalidasi pada proyek
PilihanPeranKontrol yang diperlukan
Referensi FP32Titik pembanding proyekOutput finite dan kualitas yang diharapkan
Autocast FP16Sejumlah operasi dalam presisi tereduksiRentang numerik dan gradien
Autocast BF16Kompromi rentang/presisi lainnyaOperator yang tersedia dan kualitas
GradScalerPenanganan skala gradienPembaruan 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.

Urutan AMP edukatif pada GPU, tidak dijalankan
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.
Lembar edukatif perbandingan, untuk dilengkapi dengan pengukuran
KriteriaReferensiUji AMPKeputusan
Keluaran finalPerlu diperiksaPerlu diperiksaTolak hasil belum selesai yang tidak dijelaskan
Selisih numerikNilai yang dipertahankanSelisih yang harus dihitungToleransi yang ditetapkan sebelum uji
Keputusan penerapanKelas atau tindakanKelas atau tindakanPeriksa perubahan
Kualitas pada kumpulan data tetapPerlu diukurPerlu diukurPatuhi 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.

Pertanyaan Anda

Apakah AMP berarti semua tensor beralih ke FP16?

Tidak. autocast menerapkan kebijakan per operasi. Beberapa operasi tetap dalam presisi berbeda. Mengonversi seluruh model secara manual ke half() tidak setara dengan menggunakan autocast dan dapat mengubah kondisi stabilitas.

Apakah BF16 selalu lebih menguntungkan menggantikan FP16?

Tidak. Kedua format memiliki kompromi yang berbeda, dan dukungannya bergantung pada operasi dan lingkungan. Bandingkan kualitas dan biaya pada beban kerja Anda; rentang BF16 yang lebih luas tidak dengan sendirinya menjamin presisi yang dibutuhkan.

Apakah GradScaler diperlukan untuk inferensi?

Scaler berperan dalam pelatihan dengan gradien, bukan dalam inferensi tanpa backward. Untuk inferensi, periksa keluaran dan kualitas di bawah autocast, dengan mempertahankan mode evaluasi yang diharapkan.

Apakah loss yang finit cukup untuk menerima AMP?

Tidak. Periksa juga gradien, pembaruan, kualitas, dan keputusan aplikasi. Perbedaan numerik yang kecil bisa menentukan di dekat ambang batas; pelatihan yang terus berjalan juga bisa melewati beberapa pembaruan.