
Ini adalah kode untuk eksperimen TinyStories dari makalah: secara mekanis menganalisis efek fine-tuning pada tugas yang ditentukan secara prosedural. Kode ini didasarkan pada https://github.com/karpathy/llama2.c yang luar biasa.
Untuk menginstal, mengkloning repo, membuat env virtual/apa pun, dan pip install -r requirements.txt .
Untuk mengunduh dataset, jalankan python tinystories.py download --data_cache_dir <path_to_data_dir> , dengan <path_to_data_dir> jalur di mana Anda dapat menyimpan dataset yang diunduh dan versi tokenized.
Kode ini menghasilkan dataset dan tokenizes sebelum pelatihan, menggunakan python tinystories pretokenize <args> . Untuk menentukan berbagai dataset pretraining dan fine-tuning dan protokol pelatihan (misalnya penghapusan dan pemulihan), kami menggunakan argumen penyaringan yang berbeda dengan perintah pretokenize .
Ada juga perintah untuk melatih tokenizer, menggunakan python tinystories train_vocab . Ini terdiri dari dua file, tok8192.model dan tok8192.vocab . Saya sudah melakukan ini, dan tokenizer ada di data/tok8192.{model/vocab} . Anda perlu memindahkan file -file ini ke <path_to_data_dir> yang akan Anda gunakan untuk percobaan Anda.
Pastikan untuk masuk ke wandb sehingga eksperimen Anda dicatat di sana.
Seperti disebutkan di atas, setiap protokol penyempurnaan dikendalikan oleh dataset, yang kami hasilkan sebelum pelatihan dimulai. Untuk pelatihan apa pun, pertama -tama kita perlu menghasilkan dataset yang sesuai menggunakan python tinystories pretokenize ... :
usage: tinystories.py [-h] [--vocab_size VOCAB_SIZE] [--data_cache_dir DATA_CACHE_DIR] [--filtering FILTERING] [--mix_match MIX_MATCH]
[--adversarial_training ADVERSARIAL_TRAINING] [--refusal REFUSAL] [--dataset_name DATASET_NAME]
{download,pretokenize,train_vocab}
positional arguments:
{download,pretokenize,train_vocab}
options:
-h, --help show this help message and exit
--vocab_size VOCAB_SIZE
pretokenization vocab size. 0 = use Llama 2 tokenizer.
--data_cache_dir DATA_CACHE_DIR
Adjust data cache dir
--filtering FILTERING
How to filter data
--mix_match MIX_MATCH
How to mix_match sample
--adversarial_training ADVERSARIAL_TRAINING
How to adversarially sample
--refusal REFUSAL Which features to refusal-train on
--dataset_name DATASET_NAME
dataset name Argumen filtering , mix_match , adversarial_training dan refusal mengambil format tertentu:
filtering : --filtering=<FEATURE>=<VALUE>,<FEATURE>!=<VALUE>,...mix_match : --mix_match=<FEATURE>:<VALUE1>=<VALUE2>,... menggantikan <VALUE1> dengan <VALUE2> untuk <FEATURE> .adversarial_training : --adversarial_training=<FEATURE>=<VALUE>:<PROBABILITY>,... menambahkan <VALUE> ke <FEATURE> dengan probabilitas <PROBABILITY> .refusal : --refusal=<FEATURE>=<VALUE>:<PROBABILITY>,... Mengatur cerita ke penolakan dan menambahkan <VALUE> ke <FEATURE> dengan <PROBABILITY> probabilitas. Menghasilkan dataset membutuhkan ~ 10 menit karena tokenisasi. Jika nama dataset tidak dilewati, satu dihasilkan dari fitur yang disediakan, dan dataset disimpan dalam DATA_CACHE_DIR/<dataset_name> .
Untuk menghasilkan semua dataset yang diperlukan untuk eksperimen penghapusan dan pemulihan untuk fitur yang diberikan, gunakan dataset_gen/tw_fs.sh , tetapi ubah DATA_CACHE_DIR ke direktori yang benar dan sesuaikan FEATURE_DELETE dan FEATURE_IRRELEVANT sesuai kebutuhan.
Anda dapat mengunduh model fine-tuning pangkalan, post-deletion, dan pasca-re-re-re-re-recovery di sini: https://drive.google.com/file/d/19duv1xv2uw789he4zc5bb5bmknrrug7q/view?usp=sharing
Anda harus mengekstrak model dari file itu, dan kemudian melihat model_names.md untuk melihat model mana yang mana.
Tokenizer untuk model -model ini ada di tokenizers/ . Anda perlu menyalin file -file ini ke DATA_CACHE_DIR yang Anda gunakan untuk pos pemeriksaan model.
Untuk menjalankan pelatihan, gunakan python train.py <args> . Anda dapat membuat konfigurasi pelatihan tertentu dengan menyalin file dalam configs dan menyesuaikan argumen dengan kebutuhan Anda, dan argumen juga dapat diganti pada baris perintah, seperti itu:
python train.py configs/base30M.py --batch_size=32 --lr=1e-4 Argumen harus menggunakan = dan bukan spasi.
Pengaturan ini memungkinkan Anda untuk membuat file konfigurasi untuk satu set percobaan atau sapuan, dan kemudian hanya lulus argumen yang bervariasi dengan percobaan (yaitu model dasar, laju pembelajaran, dataset, dll.) Pada baris perintah.
Semua perintah ini akan secara otomatis mencatat statistik dan generasi ke wandb , jadi pastikan Anda masuk untuk itu.
python train.py configs/base91M.py --batch_size=256 --dropout=0.1 --gradient_accumulation_steps=2 --learning_rate=0.0001 --max_iters=100000 --max_seq_len=512Penghapusan:
python train.py configs/base91M_tw_delete_no_lrs.py --dataset_name=filter-adv-Twist --learning_rate=1e-05Pemulihan:
python train.py configs/base91M_tw_recovery_no_lrs.py --model_dir=/cache/tinystories/base91M-train-2023_10_06_15_15_49_074/out Saya telah menjalankan eksperimen saat wandb menyapu. Anda dapat melihat contoh konfigurasi sapuan untuk penghapusan dan pemulihan dalam sweeps/*.yaml . Buat sapuan dengan wandb sweep -p tinystories-uft -e ucl-dar sweeps/<sweep.yaml> , dan kemudian dalam skrip pengiriman apa yang pernah Anda gunakan, jalankan wandb agent <sweep_id> --count 1 (Anda perlu --count 1 jika Anda menggunakan slurm/dll., Sebagaimana setiap pekerjaan yang dikirimkan menjalankan satu percobaan tunggal dan kemudian selesai).
Lihat skrip Train.py untuk peluncuran eksotis dan hyperparameter yang lebih banyak ditimpa. Berikut ini adalah panduan singkat untuk cara mengatur parameter. Lihatlah meja di ujung kertas chinchilla untuk mengetahui bagaimana parameter transformator (redup, n_layers, n_heads) tumbuh atau menyusut bersama. Mengekstrapolasi/interpolasi pola ini untuk mendapatkan transformator yang lebih besar atau lebih kecil. Tetapkan panjang konteks maksimal sesuka Anda, tergantung pada masalahnya: ini harus menjadi jumlah token maksimum yang penting untuk memprediksi token berikutnya. EG LLAMA 2 menggunakan 2048. Selanjutnya, Anda ingin total ukuran batch per pembaruan (dicetak oleh skrip sebagai "Token per iterasi akan menjadi:") berada di suatu tempat sekitar 100 ribu token untuk aplikasi berukuran sedang. Untuk aplikasi kecil itu bisa lebih rendah, untuk pelatihan besar (misalnya GPTS/LLAMA) biasanya ~ 0,5m, atau bahkan lebih. Anda sampai di sana dengan terlebih dahulu memaksimalkan Batch_Size ke apa pun yang diizinkan oleh sistem Anda (misalnya tambang adalah 16 dalam menjalankan baru -baru ini karena setelah itu GPU saya kehabisan memori), dan kemudian Anda ingin meningkatkan gradient_accumulation_steps menjadi setinggi yang diperlukan untuk mencapai total ukuran batch ~ 100k. Akhirnya, Anda ingin menyetel learning_rate Anda (LR). Anda ingin ini setinggi pelatihan Anda. Jaringan yang sangat kecil dapat lolos dengan LR besar (mis. 1E-3 atau bahkan lebih tinggi). Jaringan besar membutuhkan LR yang lebih rendah. 3E-4 adalah pilihan yang aman di sebagian besar aplikasi berukuran sedang, tetapi bisa terlalu rendah untuk jaringan kecil, jadi cobalah untuk meningkatkannya! Akhirnya, max_iters adalah lamanya pelatihan. Mainkan dengan pengaturan yang berbeda. Saya kebanyakan hanya menyetel parameter ini dan meninggalkan sebagian besar yang lain tidak berubah. Berikut adalah contoh bagaimana saya melatih model 110m, yang saya pikir tidak ada di mana pun mendekati optimal, tetapi tampak masuk akal bagi saya: redup 768, n_layers 12, n_heads 12 (ukuran masing -masing kepala adalah 768 /12 = 64 saluran 2 40gbepe genggun, seq. Ukuran Batch Token Menjadi 16 Ukuran Batch * 1024 Token Secara Urutan * 8 Grad_accum = 131.072 Token per Pembaruan. Bagus. Tingkat Pembelajaran 4E-4 (mungkin sedikit terlalu rendah). Max_iters 200k (mungkin agak terlalu tinggi). Dropout 0,1, seperti biasanya sedikit membantu pada ukuran sedang. Itu saja. Saya berlari menggunakan Data Parallel (DDP) terdistribusi pada 4 GPU di mesin cloud saya, pelatihan mengambil ~ hari atau lebih.
Mit
Jika Anda menggunakan kode ini, silakan mengutip pekerjaan kami:
@misc{jain2023mechanistically,
title={Mechanistically analyzing the effects of fine-tuning on procedurally defined tasks},
author={Samyak Jain and Robert Kirk and Ekdeep Singh Lubana and Robert P. Dick and Hidenori Tanaka and Edward Grefenstette and Tim Rocktäschel and David Scott Krueger},
year={2023},
eprint={2311.12786},
archivePrefix={arXiv},
primaryClass={cs.LG}
}
Anda juga harus mengutip kertas TinyStories:
@misc{eldan2023tinystories,
title={TinyStories: How Small Can Language Models Be and Still Speak Coherent English?},
author={Ronen Eldan and Yuanzhi Li},
year={2023},
eprint={2305.07759},
archivePrefix={arXiv},
primaryClass={cs.CL}
}