PEFT documentation
Pelatihan yang Efisien Memori
Pelatihan yang Efisien Memori
🤗 PEFT membuat fine-tuning hemat parameter, tetapi tidak otomatis hemat memori. Ringkasan ini mengumpulkan tips untuk memangkas memori pelatihan dan tautan ke panduan terperinci.
Selalu pertimbangkan hal-hal dasar seperti memilih model dasar yang lebih kecil, ukuran batch yang lebih kecil, atau panjang sekuens yang lebih pendek untuk menurunkan penggunaan memori Anda.
Ringkasan memori pelatihan
Mari kita bedah distribusi memori pelatihan agar kita dapat mempertimbangkan langkah-langkah penangkal potensial. Kita akan menggunakan model bahasa besar yang dilatih dengan optimizer Adam sebagai contoh. Saat melakukan fine-tuning penuh, posisi-posisi berikut akan memakan memori:
- parameter model dasar: konsumsi memori sangat bergantung pada
dtypeyang dipilih. Semakin sedikit bit per parameter (16 untuk float16), semakin sedikit memori yang dibutuhkan. Model 1B dalam float16 (16 bit/2 byte per parameter) akan membutuhkan sekitar1e9 × 2 byte = 1.863 GiBmemori. - semua parameter model dasar yang dapat dilatih ×3 untuk gradien (1×) dan status optimizer Adam (2×), sehingga 5,59 GB memori
- memori untuk aktivasi antara antar lapisan, yang sulit diprediksi tetapi sebagian besar bergantung pada dtype komputasi yang digunakan dan panjang sekuens / ukuran batch.
Model dasar yang lebih kecil atau penggunaan dtype komputasi yang lebih kecil akan mengurangi semua titik, sementara penggunaan urutan yang lebih pendek atau batch yang lebih kecil terutama memengaruhi memori gradien dan aktivasi. Penerapan metode PEFT akan mengurangi jumlah parameter yang dapat dilatih dan dengan demikian secara signifikan mengurangi baik gradien maupun status optimizer, menghemat banyak memori.
Memilih metode yang tepat
Tidak semua metode PEFT dibangun dengan cara yang sama, dan beberapa formulasi lebih mudah dibangun dengan cara yang hemat memori. Jika Anda memiliki anggaran memori yang terbatas, masuk akal untuk melihat PEFT method comparison suite dan memfilter berdasarkan penggunaan memori akselerator maximum. Rata-rata penggunaan memori akselerator bisa cukup setara di antara berbagai metode, tetapi tidak semua metode berskala sama dengan aktivasi dan panjang urutan; beberapa metode lebih rentan terhadap lonjakan memori daripada yang lain.
Pertimbangkan menggunakan token yang dapat dilatih saat menargetkan lapisan besar seperti kepala pemodelan bahasa atau lapisan embedding untuk menyesuaikan token tertentu.
Kuantisasi
Quantization adalah salah satu cara terbaik untuk mengurangi konsumsi memori model dasar dan, tergantung pada metode kuantisasi yang digunakan, juga akan mengurangi memori aktivasi. Karena metode PEFT hanya akan mengambil porsi kecil dari total jumlah parameter, PEFT secara default menggunakan presisi yang lebih tinggi daripada model dasar. Hal ini juga dapat berdampak pada kemampuan adapter untuk memitigasi sebagian dari penurunan kualitas yang disebabkan oleh metode kuantisasi. Baca panduan kuantisasi PEFT.
Kompilasi
Model yang kita latih terdiri dari operasi seperti perkalian matriks, penjumlahan, dan penugasan, di mana setiap operasi menghasilkan hasil baru dan, selanjutnya, membutuhkan memori. Jika hasil antara tersebut tidak diperlukan, kita dapat menggabungkan operasi ini dan menghemat memori. Ini hanyalah salah satu dari banyak optimasi yang dapat dilakukan torch.compile untuk Anda, jadi lihatlah panduan torch.compile PEFT.
Gradient Checkpointing
Anda dapat menukar memori dengan komputasi dengan hanya menyimpan setiap gradien ke-n di antara lapisan dan menghitung sisanya secara langsung. Lihat dokumentasi gradient checkpointing dari Transformers untuk mempelajari lebih lanjut.
Ketika tidak menggunakan Diffusers atau Transformers, Anda mungkin perlu mengimplementasikan logika gradient checkpointing Anda sendiri, tergantung pada framework pelatihan yang Anda gunakan.
Chunked NLL loss
Menggunakan NLLLoss sangat umum saat melatih model bahasa (atau tugas klasifikasi). Anda mengalokasikan matriks berukuran batch × sequence × vocabulary. Dengan urutan atau kosakata yang sangat panjang, ini bisa menjadi mahal dengan cepat.
Saat menggunakan TRL, Anda dapat memilih untuk menggunakan integrasi kernel Liger atau menggunakan Chunked NLLLoss. Opsi yang terakhir akan membagi urutan menjadi potongan-potongan berukuran 256 untuk menjaga konsumsi memori maksimum tetap konstan.

Jika ukuran chunk default tidak optimal untuk pengaturan Anda, lihat PR TRL asli untuk informasi lebih lanjut tentang cara menyesuaikan ukuran chunk.
Update on GitHub