Sebuah batch pelatihan dapat melampaui kapasitas memori accelerator meskipun parameter model dan state optimizer masih muat dengan nyaman. Aktivasi dari forward pass sering mengambil porsi besar dari sisa penggunaan memori, dan biayanya bertambah seiring jumlah contoh yang diproses bersama.
Gradient accumulation membagi batch logis yang lebih besar menjadi beberapa microbatch. Setiap microbatch menjalankan forward dan backward pass sendiri, tetapi optimizer menunggu sampai beberapa backward pass berkontribusi ke gradien parameter. Pola ini mengurangi memori aktivasi yang diperlukan untuk satu pass tanpa memaksa pembaruan optimizer setelah setiap microbatch.
Mekanismenya tampak setara dengan memakai satu batch yang lebih besar, tetapi kesetaraan itu bergantung pada scaling loss, state model, randomness, dan waktu pembaruan optimizer.
Akumulasi mengubah frekuensi pembaruan, bukan ukuran parameter
Misalkan satu batch logis berisi 64 contoh, tetapi memori hanya cukup untuk 16 contoh sekaligus. Empat microbatch dapat menyumbangkan gradien sebelum satu pembaruan optimizer:
nolkan gradien
microbatch 1 -> forward -> backward -> akumulasi
microbatch 2 -> forward -> backward -> akumulasi
microbatch 3 -> forward -> backward -> akumulasi
microbatch 4 -> forward -> backward -> akumulasi
pembaruan optimizer
nolkan gradienPada satu waktu, hanya aktivasi forward-pass biasa dari satu microbatch yang perlu tersedia untuk backpropagation. Tensor parameter, gradien parameter, dan state optimizer tetap dialokasikan. Karena itu, gradient accumulation menargetkan bagian memori pelatihan yang bergantung pada ukuran batch; teknik ini tidak mengecilkan setiap komponen penggunaan memori.
Jika model bahkan tidak muat untuk satu microbatch karena parameter, state optimizer, atau aktivasi per contoh terlalu besar, akumulasi saja tidak menyelesaikan batas tersebut.
Reduksi loss menentukan skala gradien
Untuk batch logis yang dibagi menjadi N microbatch berukuran sama, anggap loss setiap microbatch adalah mean dari seluruh contohnya. Memanggil backward pada setiap mean loss tanpa rescaling akan menjumlahkan N mean gradient. Gradien akhirnya menjadi N kali mean gradient dari batch logis penuh.
Formulasi yang umum membagi mean loss setiap microbatch dengan jumlah langkah akumulasi:
scaled_loss = microbatch_mean_loss / NSetelah seluruh N backward pass selesai, gradien terakumulasi cocok dengan gradien dari mean loss seluruh contoh gabungan, dengan tetap tunduk pada kondisi kesetaraan lain yang dibahas di bawah.
Aritmetika berubah jika ukuran microbatch tidak sama. Memberi bobot yang sama pada mean setiap microbatch membuat microbatch terakhir yang kecil memiliki bobot setara dengan microbatch penuh. Jika objektif yang dimaksud adalah mean dari seluruh contoh, kontribusi setiap microbatch perlu dibobotkan menurut jumlah contohnya relatif terhadap ukuran total batch logis.
Objektif pada level token menghadapi masalah serupa ketika sequence memiliki jumlah token valid yang berbeda. Mengambil rata-rata loss token per microbatch lalu merata-ratakan hasil tersebut tidak selalu identik dengan satu mean atas seluruh token valid dalam jendela akumulasi.
State optimizer maju sekali per pembaruan logis
Akumulasi menunda pembaruan optimizer sampai akhir jendela. Untuk optimizer dengan momentum atau adaptive state, perbedaan ini penting karena state internal berubah saat step dijalankan, bukan ketika gradien hanya ditambahkan ke buffer parameter.
Empat microbatch yang diikuti satu pembaruan optimizer berbeda dari empat pembaruan optimizer independen dengan batch lebih kecil. Pola kedua memajukan estimasi momentum, adaptive moments, nilai parameter, dan counter langkah optimizer sebanyak empat kali.
Schedule yang terikat ke pembaruan optimizer mengikuti batas yang sama. Jika scheduler maju setelah setiap optimizer step, menaikkan faktor akumulasi mengurangi jumlah kemajuan schedule per contoh yang diproses kecuali schedule disesuaikan untuk mempertahankan hubungan yang diinginkan.
Gradient clipping juga memiliki pilihan posisi. Clipping sekali setelah akumulasi membatasi gradien gabungan. Clipping gradien setiap microbatch sebelum penjumlahan membatasi setiap kontribusi secara terpisah dan dapat menghasilkan arah serta magnitudo berbeda. Operasi ini tidak dapat dipertukarkan begitu saja.
Layer dengan state dapat mematahkan kesetaraan batch besar
Aritmetika gradien hanya satu bagian dari training step. Beberapa komponen model memperbarui state atau menghitung statistik selama setiap forward pass.
Batch normalization adalah contoh langsung. Normalisasi saat training menggunakan statistik dari mini-batch saat itu. Memproses empat microbatch berisi 16 contoh tidak membuat setiap forward pass memakai statistik dari satu batch berisi 64 contoh. Running statistics juga dapat diperbarui sekali per microbatch sesuai implementasi layer.
Gradien parameter yang terakumulasi tetap dapat digabungkan di seluruh pass tersebut, tetapi komputasi forward yang menghasilkannya memakai statistik batch berbeda. Klaim bahwa akumulasi selalu mereproduksi batch fisik yang lebih besar karena itu tidak valid untuk model semacam ini tanpa kondisi tambahan.
Layer yang perilaku forward-nya independen antarcontoh menghindari masalah spesifik ini, tetapi sumber state lain dapat menimbulkan perbedaan serupa.
Operasi acak hanya mempertahankan objektif secara distribusional
Dropout dan stochastic augmentation dapat menghasilkan random draw berbeda saat contoh dibagi ke beberapa microbatch. Bahkan dengan seed awal yang sama, perubahan bentuk tensor atau urutan pemanggilan dapat mengubah cara framework mengonsumsi bilangan acak.
Hal ini tidak membuat akumulasi menjadi tidak valid. Artinya, kesamaan bit-for-bit dengan eksekusi satu batch besar tidak boleh diasumsikan hanya karena ukuran batch logis sama.
Aritmetika floating-point menambah sumber perbedaan kecil lain. Penjumlahan tidak asosiatif pada presisi terbatas, sehingga perubahan urutan penambahan kontribusi gradien dapat mengubah bit orde rendah. Mixed-precision training dapat menambahkan perilaku spesifik implementasi melalui scaling dan deteksi overflow.
Mixed precision menambahkan batas pembaruan pada loss scaling
Sistem automatic mixed precision sering melakukan scaling pada loss sebelum backpropagation agar nilai gradien kecil tidak mudah underflow pada presisi yang lebih rendah. Dengan akumulasi, gradient unscaling dan penanganan overflow perlu mengikuti pembaruan logis yang dimaksud.
Desain yang umum mempertahankan gradien pada skala yang konsisten selama microbatch terakumulasi, lalu melakukan unscale sebelum operasi yang memerlukan magnitudo gradien sebenarnya, seperti clipping atau pembaruan optimizer. API persisnya berbeda antar-framework, sehingga semantik scaler yang didokumentasikan framework menentukan urutan pemanggilan yang benar.
Mengubah scale di tengah satu jendela akumulasi dapat membuat buffer gradien berisi kontribusi dengan skala berbeda kecuali implementasi secara eksplisit mengompensasi perubahan tersebut. Invarian yang aman adalah semua kontribusi yang digabungkan dalam satu buffer harus memiliki scaling yang kompatibel sebelum dikonsumsi optimizer.
Pelatihan terdistribusi mengubah waktu komunikasi
Dalam data-parallel training, backward pass biasanya memicu sinkronisasi gradien antar-worker. Sinkronisasi setelah setiap microbatch dapat mempertahankan akumulasi yang benar, tetapi membayar overhead komunikasi untuk setiap pass.
Banyak sistem terdistribusi menyediakan mekanisme untuk menunda sinkronisasi pada microbatch antara dan berkomunikasi ketika jendela akumulasi ditutup. Ini mengubah frekuensi komunikasi tanpa mengubah titik saat optimizer mengonsumsi gradien gabungan.
Ukuran batch logis kemudian bergantung pada beberapa dimensi. Dengan M contoh per microbatch, A langkah akumulasi, dan W worker data-parallel, setup sederhana dengan ukuran seragam memproses:
logical batch size = M * A * WRumus itu menjelaskan jumlah contoh, bukan kesetaraan matematis otomatis. Normalisasi loss dan semantik distributed reduction tetap menentukan skala gradien yang sebenarnya.
Faktor akumulasi adalah bagian dari konfigurasi optimisasi
Menaikkan faktor akumulasi memungkinkan batch logis lebih besar di bawah anggaran aktivasi per pass yang tetap, tetapi juga mengubah jumlah forward dan backward pass di antara pembaruan parameter. Dampaknya mencakup cadence pembaruan, pencatatan scheduler, interval logging berbasis step, frekuensi checkpoint berbasis step, dan peluang sinkronisasi terdistribusi.
Untuk konfigurasi yang dapat direproduksi, mencatat ukuran batch nominal saja tidak lengkap. Ukuran microbatch, faktor akumulasi, jumlah worker, reduksi loss, dan cadence optimizer step secara bersama menjelaskan cara contoh diubah menjadi pembaruan parameter.
Gradient accumulation paling tepat diperlakukan sebagai perubahan pada struktur eksekusi, bukan sakelar memori generik. Teknik ini dapat mereproduksi gradien dari batch lebih besar dalam kondisi terkendali, sementara operasi forward dengan state, reduksi yang tidak seragam, eksekusi stokastik, dan penempatan operasi optimizer yang keliru dapat membuat kedua prosedur pelatihan berbeda secara material.