GPU untuk riset ML · Pembayaran kripto tanpa KYC
IteraGPU
Pelatihan · Memori dan optimisasi

Kurangi microbatch tanpa kehilangan hitungan pembaruan.

Akumulasi menjumlahkan kontribusi dari beberapa backward pass sebelum satu pembaruan parameter. Dengan microbatch yang sama besar, batch efektif menghitung microbatch per replika, jumlah pass yang diakumulasi, dan replika data yang berpartisipasi. Mengurangi microbatch dapat meringankan aktivasi yang disimpan, tetapi tidak menghilangkan bobot maupun status optimizer dan tidak menjamin pelatihan yang identik.

01 /

Pisahkan microbatch, backward pass, dan pembaruan

Microbatch adalah kelompok contoh yang diproses oleh satu forward pass pada satu replika. Backward pass menghitung kontribusinya terhadap gradien. Pembaruan optimizer menggunakan gradien yang tersedia untuk mengubah parameter. Dengan akumulasi, beberapa forward/backward pass mendahului pembaruan ini; parameter tetap tidak berubah selama kelompok tersebut.

Di PyTorch, gradien terakumulasi dalam tensor yang disediakan untuk itu. Menghapus gradien setelah setiap microbatch justru akan membatalkan akumulasi yang diinginkan. Sebaliknya, lupa mengosongkannya di antara dua kelompok akan membuat contoh dari pembaruan sebelumnya turut berkontribusi.

Tentukan unit pencatatan log Anda: nomor microbatch, pembaruan optimizer, contoh, atau token yang dilihat. Kata "step" saja ambigu. Kurva loss tidak dapat dibandingkan dengan benar jika sumbu merepresentasikan delapan kali lebih banyak contoh pada salah satu eksperimen.

Sumber teknis: PyTorch — akumulasi dan pengosongan gradien

02 /

Hitung batch efektif tanpa menghitung GPU dua kali

Misalkan m adalah jumlah contoh per microbatch per replika, A adalah jumlah microbatch yang diakumulasi, D adalah jumlah replika paralelisme data. Jika ukuran-ukuran ini konstan dan contoh terdistribusi dengan benar, jumlah contoh yang berkontribusi pada satu pembaruan global adalah m × A × D.

Faktor D tidak selalu merujuk pada semua kartu di mesin. GPU yang berbagi model yang sama melalui paralelisme tensor atau pipeline tidak menjadi sebanyak itu replika data. Catat kelompok yang benar-benar dikonfigurasi, bukan sekadar jumlah komersial dari batch.

Contoh aritmetika: dua contoh per microbatch, delapan akumulasi, dan dua replika menghasilkan 32 contoh per pembaruan global. Setiap replika memproses enam belas contoh dalam grup ini. Tabel membandingkan jumlah; tabel ini tidak mengurutkan memori atau kecepatannya.

Batch efektif dalam contoh = microbatch per replika m × akumulasi A × replika data D
Jumlah ilustratif, tanpa pengukuran performa; microbatch lengkap dan contoh terdistribusi.
mADContoh per pembaruan global
28232
116232
44232
28116

Sumber teknis: PyTorch — batch efektif dan akumulasi dalam presisi campuran · PyTorch — perilaku replika DistributedDataParallel

03 /

Menormalisasi loss sesuai elemen yang benar-benar dievaluasi

Untuk loss rata-rata pada microbatch yang berisi jumlah elemen relevan yang sama, membagi setiap kontribusi dengan A menghasilkan rata-rata grup. Aturan ini mengasumsikan framework tidak sudah melakukan normalisasi ini. Dengan alat yang menangani akumulasi, baca ulang kontraknya sebelum menambahkan pembagian manual.

Untuk loss rata-rata per token, panjang yang berbeda mengubah penyebutnya. Jumlah loss harus dibandingkan dengan token yang benar-benar diawasi dalam grup, di luar padding dan posisi yang diabaikan. Rata-rata dari rata-rata microbatch umumnya tidak menghasilkan target yang sama.

Contoh teoretis: sebuah microbatch memiliki 512 token yang diawasi dengan loss rata-rata 2; microbatch lain memiliki 1.536 dengan rata-rata 4. Rata-rata tertimbang bernilai (512 × 2 + 1.536 × 4) ÷ 2.048 = 3,5. Rata-rata tak tertimbang bernilai 3 dan memberi bobot berlebih pada grup kecil. Nilai-nilai ini hanya mengilustrasikan perhitungan.

Sumber teknis: Hugging Face Accelerate — akumulasi dengan contoh berukuran bervariasi

04 /

Menyusun satu grup akumulasi yang lengkap

Siapkan terlebih dahulu batas grup dan penyebutnya. Untuk setiap microbatch, hitung keluaran, loss yang dinormalisasi, dan backward tanpa pembaruan antara. Bebaskan keluaran yang tidak lagi Anda perlukan; menyimpan loss yang terikat pada grafnya dalam sebuah list dapat memperpanjang masa hidup alokasi.

Setelah kontribusi terakhir, terapkan operasi yang direncanakan pada gradien lengkap, lalu lakukan pembaruan. Selanjutnya reset gradien untuk grup berikutnya. Jika perjalanan berakhir dengan kurang dari A microbatch, pilih secara eksplisit untuk memproses grup parsial ini dengan penyebut sebenarnya atau mengabaikannya; catat contoh yang bersangkutan.

Dengan presisi campuran yang menggunakan GradScaler, faktor skala tetap konstan selama akumulasi. Penskalaan ulang yang sebenarnya dan clipping yang mungkin dilakukan terjadi setelah kontribusi; pembaruan scaler mengikuti upaya langkah. Pemeriksaan nilai tak hingga dapat mencegah perubahan parameter.

Scheduler harus mengikuti unit yang diumumkan oleh loop Anda. Jika didefinisikan per pembaruan optimizer, memanggilnya pada setiap microbatch akan mengubah jadwalnya. Catat secara terpisah upaya dan pembaruan yang benar-benar diterapkan ketika sistem Anda dapat melewatkan sebagian.

Sumber teknis: PyTorch — graf autograd dan tensor yang disimpan untuk backward · PyTorch — akumulasi, unscale, clipping, dan GradScaler

05 /

Pada multi-GPU, verifikasi reduksi dan distribusi contoh

DistributedDataParallel menyinkronkan gradien antar replika. Dalam perilaku biasanya, reduksi ini merata-ratakannya; loss yang dijumlahkan dan loss yang dirata-ratakan secara lokal karena itu tidak memiliki skala yang sama. Dengan jumlah token yang berbeda antar replika, penyebut global dan reduksi ini harus dipertimbangkan bersama.

Verifikasi ID yang benar-benar diproses: menduplikasi contoh yang sama secara tidak sengaja di semua kartu tidak menambah informasi grup sebanyak itu. Untuk menunda komunikasi antara, no_sync dapat digunakan pada microbatch yang mendahului sinkronisasi akhir; konteksnya juga harus mencakup forward pass.

Jangan terapkan aturan ini ke semua sistem terdistribusi. Sharding status, pipeline, hook komunikasi, dan framework dapat mengubah operasi yang sebenarnya. Mulailah dengan konfigurasi yang didukung oleh alat Anda, lalu periksa satu grup lengkap pada setiap replika.

Sumber teknis: PyTorch — reduksi gradien dan cakupan no_sync dalam DDP

06 /

Mengapa batch efektif yang sama tidak menjamin pengalaman yang sama

Kesetaraan m × A × D adalah sebuah penghitungan. Untuk mendapatkan kembali gradien dari batch besar, diperlukan kontribusi yang tertimbang dengan benar, keadaan parameter yang sama selama grup, dan operasi yang kompatibel dengan dekomposisi ini. Kedekatan numerik diverifikasi dengan toleransi yang sesuai; hal itu tidak dapat disimpulkan hanya dari hasil perkaliannya.

BatchNorm menghitung statistik dari input pada lintasannya: beberapa microbatch kecil tidak menyajikan grup yang sama seperti satu batch besar. Operasi acak, urutan perhitungan, dan pembulatan juga dapat bervariasi. Jangan menjanjikan bobot akhir yang identik bit per bit.

Perubahan batch global juga dapat mengubah jumlah pembaruan untuk jumlah contoh yang sama yang dilihat. Tetapkan sebelumnya sumbu perbandingan dan aturan kualitas Anda. Jangan mengubah secara bersamaan laju pembelajaran, scheduler, dan durasi tanpa mendokumentasikan asumsi baru tersebut.

Sumber teknis: PyTorch — statistik BatchNorm1d · PyTorch — batas reprodusibilitas

07 /

Mengendalikan memori dan memutuskan langkah selanjutnya

Instrumentasikan sebuah grup yang mencakup lintasan mundur dan pembaruan pertama, lalu grup-grup berikutnya. Keberhasilan pada forward tidak memvalidasi gradien atau keadaan yang dibuat oleh optimizer. Penghitung harus mempertahankan cakupannya per device. Dossier memori menyediakan metode pembacaan baseline dan puncak.

Jika sebuah grup gagal, kurangi microbatch dan hitung ulang A untuk mempertahankan batch efektif yang ditargetkan selama pilihan ini tetap relevan. Perubahan ini tidak menjamin pembagian puncak yang proporsional maupun durasi yang lebih baik. Jika bobot atau keadaan mendominasi, akumulasi saja mungkin tidak cukup.

Sebelum sebuah kampanye, periksa satu pembaruan pada kumpulan kecil yang terkendali: contoh yang sama, loss tertimbang, gradien terbatas, batas grup, dan jumlah langkah. Lalu evaluasi kualitas dengan protokol yang dipilih. MLP inferensi kecil dari dossier yang dapat diunduh tidak menjalankan resep pelatihan ini; ia tidak menggantikan pemeriksaan tersebut.

Lembar akhir Anda menyatukan m, A, D, token yang disupervisi, presisi, normalisasi, penanganan grup terakhir, dan puncak yang diamati. Kemudian kembali ke pemilihan konfigurasi dan anggaran eksperimen, dengan memisahkan persiapan, uji coba, dan hasil yang benar-benar diterima.

  • Loss yang luar biasa kecil: cari pembagian ganda oleh akumulasi.
  • Hasil yang bervariasi dengan pemotongan: periksa token yang diabaikan dan rata-rata dari rata-rata.
  • Akumulasi tanpa efek: periksa zero_grad dan optimizer.step.
  • Memori yang meningkat: cari referensi yang dipertahankan antar microbatch.
  • Jadwal yang bergeser: bedakan lintasan mundur dan pembaruan.

Sumber teknis: Hugging Face — posisi memori sebuah pelatihan

Pertanyaan praktis

Apakah mengakumulasi enam belas microbatch mengalikan memori dengan enam belas?

Tidak selalu: kontribusi diproses secara berurutan. Gradien tetap ada, sementara aktivasi yang tidak diperlukan dapat dibebaskan. Namun puncaknya bergantung pada model, referensi yang dipertahankan, dan keadaan optimizer; ukur grup lengkapnya.

Apakah dua GPU selalu menggandakan batch efektif?

Hanya jika GPU tersebut berpartisipasi sebagai dua replika data dengan microbatch yang dinyatakan. Kartu yang berbagi satu model yang sama tidak secara otomatis merupakan dua replika. Periksa grup terdistribusi dan contoh yang diproses.

Bisakah saya membagi semua loss dengan jumlah akumulasi?

Aturan sederhana ini sesuai untuk microbatch dengan bobot yang sama, tanpa normalisasi yang sudah ditangani oleh framework. Dengan jumlah token yang disupervisi yang bervariasi atau grup terakhir yang tidak lengkap, gunakan penyebut sebenarnya dari tujuan.