PEFT documentation

Pelatihan yang Efisien Memori

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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:

  1. parameter model dasar: konsumsi memori sangat bergantung pada dtype yang 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 sekitar 1e9 × 2 byte = 1.863 GiB memori.
  2. semua parameter model dasar yang dapat dilatih ×3 untuk gradien (1×) dan status optimizer Adam (2×), sehingga 5,59 GB memori
  3. 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.

NLL vs. Chunked NLL comparison

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