Repositori ini berisi kode untuk mereplikasi penelitian kami yang dijelaskan dalam "Craming: Melatih model bahasa pada satu GPU dalam satu hari". Kami bereksperimen dengan model bahasa pretraining model tipe Bert dengan komputasi terbatas, bertanya-tanya "seberapa buruk bisa sebenarnya"?
Anda dapat menemukan makalah kami di sini: https://arxiv.org/abs/2212.14034, dan abstrak di bawah ini:
Tren baru -baru ini dalam pemodelan bahasa telah berfokus pada peningkatan kinerja melalui penskalaan, dan telah menghasilkan lingkungan di mana model bahasa pelatihan di luar jangkauan bagi sebagian besar peneliti dan praktisi. Sementara sebagian besar di komunitas bertanya bagaimana mendorong batas perhitungan ekstrem, kami mengajukan pertanyaan yang berlawanan:
Seberapa jauh kita bisa mendapatkan satu GPU hanya dalam satu hari?
Kami menyelidiki kinerja hilir yang dapat dicapai dengan model bahasa berbasis transformator yang dilatih sepenuhnya dari awal dengan pemodelan bahasa bertopeng selama satu hari pada GPU konsumen tunggal . Selain menganalisis ulang hampir semua komponen pipa pretraining untuk skenario ini dan memberikan pipa yang dimodifikasi dengan kinerja yang dekat dengan Bert, kami menyelidiki mengapa penskalaan turun itu sulit, dan modifikasi mana yang benar-benar meningkatkan kinerja dalam skenario ini. Kami memberikan bukti bahwa bahkan dalam pengaturan terbatas ini, kinerja mengikuti hukum penskalaan yang diamati dalam pengaturan komputasi besar. Melalui lensa undang -undang penskalaan, kami mengkategorikan berbagai perbaikan terbaru untuk pelatihan dan arsitektur dan mendiskusikan kelebihan dan penerapan praktis (atau ketiadaannya) untuk pengaturan komputasi yang terbatas.
Anda memerlukan Pytorch 2.0 untuk menjalankan kode baru. Jika Anda ingin tetap di Pytorch 1.*, Anda dapat memeriksa tag Last1.13release . Model baru, yang dilatih dengan basis kode baru 1-2% lebih baik pada lem dengan anggaran yang sama. Pos pemeriksaan dapat ditemukan di https://huggingface.co/jonasgeiping/crammed-bert. Pos Pemeriksaan Lama sekarang https://huggingface.co/jonasgeiping/crammed-bert-legacy.
Juga, preprocessing data telah meningkat, Anda sekarang dapat melakukan streaming data langsung dari HuggingFace, dari unggahan di https://huggingface.co/datasets/jonasgeiping/the_pile_wordpiecex32768_2efdb9d060d1ae95faf952ec1a50fdb9d060d1ae95faf952ec1a50fdb9d060d1ae95faf952ec1a50fdb9d0d1ae95faf952ec1a50f.2efdb9d1aAe95faf952ec1a50f020.
Pengaturan:
Jalankan pip install . untuk menginstal semua dependensi.
torch (setidaknya versi 2.1)transformers , tokenizers , datasets , evaluatehydra-corepsutil , pynvml , safetensorseinops pip install . Untuk menginstal semua paket dan skrip.curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh , lalu git clone https://github.com/google-research/deduplicate-text-datasets/tree/dev-v1 dan kemudian jalankan cargo install --target-dir ../cramming/dedupUntuk memverifikasi instalasi minimal, Anda dapat menjalankan
python pretrain.py name=test arch=hf-bert-base train=bert-base data=sanity-check-2 dryrun=True impl.microbatch_size=2
Perintah ini pra-proses pra-pemrosesan dataset cek kewarasan kecil, dan menjalankan satu langkah pelatihan.
Gunakan skrip pretrain.py untuk pretrain dengan komputasi terbatas. Repositori ini menggunakan Hydra (https://hydra.cc/docs/intro/), jadi semua bidang dalam cramming/config dapat dimodifikasi pada baris perintah. Misalnya, budget dapat dimodifikasi dengan memberikan budget=48 sebagai argumen tambahan (untuk berjalan selama 48 jam), atau tingkat pembelajaran dapat dimodifikasi melalui train.optim.lr=1e-4 . Lihatlah folder konfigurasi untuk melihat semua argumen.
Langkah pertama Anda adalah memverifikasi paket yang diinstal. Untuk melakukannya, Anda dapat menjalankan python pretrain.py dryrun=True , yang akan menjalankan cek kewarasan default untuk satu iterasi. Dari sana, Anda dapat mengaktifkan fungsionalitas tambahan. Misalnya, memodifikasi arsitektur, misalnya arch=bert-original dan Pelatihan Pengaturan train=bert-original . Untuk benar-benar melatih model bahasa, Anda perlu beralih dari Sanity Check Dataset ke setidaknya data=pile-readymade . Kemudian, pilih pengaturan pelatihan yang lebih baik, misalnya train=bert-o4 , dan tata letak model yang lebih baik, misalnya arch=crammed-bert .
Sumber data dari data.sources akan dibaca, dinormalisasi, dan pretokenisasi sebelum pelatihan dimulai dan di -cache ke dalam database. Panggilan selanjutnya dengan konfigurasi yang sama akan menggunakan kembali database urutan tokenized ini. Secara default, tokenizer baru juga akan dibangun dan disimpan selama proses ini. Opsi data penting adalah data.max_entries_in_raw_dataset , yang menentukan berapa banyak data mentah yang akan dimuat. Misalnya, untuk sumber data besar seperti C4, hanya sebagian dari data mentah yang akan diunduh. Kemudian, max_seq_in_tokenized_dataset bottlenecks berapa banyak urutan yang diproses akan disimpan dalam database. Jumlah ini harus lebih besar dari jumlah urutan yang diharapkan dibaca dalam anggaran.
Catatan Tambahan:
data=pile-readymadepython pretrain.py data=... dryrun=True , yang menjalankan pelatihan, tetapi menjalankan preprocessing data lengkap. Berjalan kemudian kemudian dapat menggunakan kembali data yang di-cache.impl.threads . Terutama kode deduplikasi memang membutuhkan sejumlah besar RAM.bookcorpus-wikipedia saja, yang preprocesses secara relatif cepat dan baru kemudian melihat ke C4 yang diproses dan difilter penuh. Untuk referensi dan jika Anda hanya tertarik untuk mengubah pelatihan/arsitektur, Anda dapat menemukan beberapa set data preproses di sini:
Sumber data ini dapat dialirkan. Untuk melakukannya, data=pile-readymade .
Data yang diproses lebih mudah untuk dikerjakan, dan saya pikir modifikasi untuk pemrosesan data dan penyaringan terus dieksplorasi dibandingkan dengan pelatihan dan arsitektur karena ini. Mungkin ada lebih banyak keuntungan yang bisa didapat dengan data yang lebih baik, daripada dengan tweak lainnya, jadi pada akhirnya Anda mungkin ingin mempertimbangkan untuk menyiapkan kode dan lingkungan untuk pipa pemrosesan data lengkap agar berfungsi.
Anda sekarang dapat menemukan pos pemeriksaan untuk versi final yang dilatih di the-pile di https://huggingface.co/jonasgeiping/crammed-bert.
Untuk mengevaluasi model pretrained pada lem (atau beberapa tugas lem), gunakan eval.py Script ini mencari model yang disimpan di direktori dasar. Mengingat nama menjalankan sebelumnya, skrip ini akan, secara default, mengambil pos pemeriksaan terbaru yang disimpan dengan nama ini, dan kemudian menjalankan evaluasi.
Anda dapat mencatat lari ke akun bobot & bias Anda. Untuk melakukannya, cukup ubah wandb.entity dan wandb.project pada baris perintah atau saat cramming/config/wandb/default.yaml .
Untuk mereplikasi resep akhir yang dibahas di koran, jalankan
python pretrain.py name=amp_b8192_cb_o4_final arch=crammed-bert train=bert-o4 data=pile-readymade
untuk pretrain dan
python eval.py eval=GLUE_sane name=amp_b8192_cb_o4_final eval.checkpoint=latest impl.microbatch_size=16 impl.shuffle_in_dataloader=True impl.compile_torch=False
untuk mengevaluasi model. Resep yang disebut "Bert Bertak" di koran sesuai dengan arsitektur yang disebut crammed-bert di konfigurasi, dilatih dengan pengaturan pelatihan bert-o4 pada data the-pile .
Untuk kinerja yang optimal, Anda harus berada di pytorch terbaru malam dan mengatur variabel induktor berikut (yang memodifikasi penyiapan torch.compile Menggunakan induktor):
max_autotune_gemm: Truemax_autotune_pointwise: Falsetriton.cudagraphs: Truetriton.cudagraph_trees: False Pretraining: GPU tunggal, pengaturan Bert asli:
python pretrain.py name=bert data=bookcorpus-wikipedia arch=bert-original train=bert-original budget=10000000
Multi-GPU, Pengaturan Bert Asli:
torchrun --nproc_per_node=4 --standalone pretrain.py name=bert4gpu data=bookcorpus-wikipedia arch=bert-original train=bert-original budget=10000000 impl.fullgraph=false impl._inductor_vars.triton.cudagraphs=False
Evaluasi pos pemeriksaan huggingface (dalam contoh ini di RTE):
python eval.py eval=GLUE_sane eval/tasks=rte name=bert-finetuning eval.checkpoint=hf://bert-base-uncased impl.shuffle_in_dataloader=True impl.compile_torch=False impl.microbatch_size=16
Evaluasi pos pemeriksaan lokal (nonaktifkan kompilasi, yang mengharapkan bentuk tetap sekarang):
python eval.py eval=GLUE_sane eval/tasks=rte name=NAME_OF_PRETRAINING_RUN eval.checkpoint=latest impl.shuffle_in_dataloader=True impl.compile_torch=False
Pemeriksaan kewarasan untuk kode terdistribusi di CPU:
CUDA_VISIBLE_DEVICES= torchrun --nproc_per_node=2 --standalone pretrain.py name=cpu_multi_check dryrun=True data=sanity-check-2 impl.dist_backend=gloo impl.fullgraph=false impl._inductor_vars.triton.cudagraphs=False
Contoh tambahan untuk resep dapat ditemukan di folder /scripts .
Opsi-opsi berikut ini saat ini rusak/terbatas/bekerja dalam proses. Gunakan ini atas kebijaksanaan Anda sendiri. Tentu saja, setiap kontribusi di sini sangat dihargai. Anda juga dapat mengirimi saya pesan lebih banyak tentang poin -poin ini, jika Anda ingin memeriksanya.
Last1.13release . Jika Anda tertarik untuk menghidupkan kembali beberapa opsi ini. Jangan ragu untuk membuka permintaan tarik dengan pembaruan ke basis kode baru.Silakan, jangan ragu untuk menghubungi kami dengan pertanyaan apa pun, atau buka masalah di GitHub.