
นี่คือรหัสสำหรับการทดลอง TinyStories จากกระดาษ: การวิเคราะห์กลไกการวิเคราะห์ผลกระทบของการปรับแต่งอย่างละเอียดต่องานที่กำหนดไว้ตามขั้นตอน รหัสขึ้นอยู่กับ https://github.com/karpathy/llama2.c ที่ยอดเยี่ยม
ในการติดตั้งให้โคลน repo ทำ env เสมือน/อะไรก็ได้และ pip install -r requirements.txt
ในการดาวน์โหลดชุดข้อมูลให้เรียกใช้ python tinystories.py download --data_cache_dir <path_to_data_dir> ด้วย <path_to_data_dir> เส้นทางที่คุณสามารถจัดเก็บชุดข้อมูลที่ดาวน์โหลดและรุ่นที่ถูกดาวน์โหลดได้
รหัสสร้างชุดข้อมูลและทำให้พวกเขามีความเชื่อมั่นก่อนการฝึกอบรมโดยใช้ python tinystories pretokenize <args> ในการระบุชุดข้อมูลการปรับแต่งและการปรับแต่งที่แตกต่างกันและโปรโตคอลการฝึกอบรม (เช่นการลบและการกู้คืน) เราใช้อาร์กิวเมนต์การกรองที่แตกต่างกันกับคำสั่ง pretokenize
นอกจากนี้ยังมีคำสั่งให้ฝึก tokenizer โดยใช้ python tinystories train_vocab ประกอบด้วยสองไฟล์ tok8192.model และ tok8192.vocab ฉันได้ทำสิ่งนี้ไปแล้วและ Tokenizer อยู่ที่ data/tok8192.{model/vocab} คุณต้องย้ายไฟล์เหล่านี้ไปยัง <path_to_data_dir> ที่คุณจะใช้สำหรับการทดลองของคุณ
ตรวจสอบให้แน่ใจว่าได้ลงชื่อเข้าใช้ wandb เพื่อให้การทดลองของคุณถูกบันทึกไว้ที่นั่น
ดังที่ได้กล่าวไว้ข้างต้นโปรโตคอลการปรับแต่งแต่ละรายการจะถูกควบคุมโดยชุดข้อมูลซึ่งเราสร้างก่อนการฝึกอบรมจะเริ่มขึ้น สำหรับการฝึกอบรมใด ๆ เราต้องสร้างชุดข้อมูลที่เกี่ยวข้องโดยใช้ 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 filtering , mix_match , adversarial_training และอาร์กิวเมนต์การ refusal ใช้รูปแบบเฉพาะ:
filtering : --filtering=<FEATURE>=<VALUE>,<FEATURE>!=<VALUE>,...mix_match : --mix_match=<FEATURE>:<VALUE1>=<VALUE2>,... แทนที่ <VALUE1> ด้วย <VALUE2> สำหรับ <FEATURE>adversarial_training : --adversarial_training=<FEATURE>=<VALUE>:<PROBABILITY>,... เพิ่ม <VALUE> ถึง <FEATURE> ด้วย <PROBABILITY> ความน่าจะเป็นrefusal : --refusal=<FEATURE>=<VALUE>:<PROBABILITY>,... ตั้งค่าเรื่องราวเป็นการปฏิเสธและเพิ่ม <VALUE> ไปยัง <FEATURE> ด้วยความน่าจะ <PROBABILITY> การสร้างชุดข้อมูลใช้เวลา ~ 10 นาทีเนื่องจาก tokenization หากไม่ผ่านชื่อชุดข้อมูลหนึ่งจะถูกสร้างขึ้นจากคุณสมบัติที่มีให้และชุดข้อมูลจะถูกเก็บไว้ใน DATA_CACHE_DIR/<dataset_name>
ในการสร้างชุดข้อมูลทั้งหมดที่จำเป็นสำหรับการทดลองการลบและการกู้คืนสำหรับคุณสมบัติที่กำหนดให้ใช้ dataset_gen/tw_fs.sh แต่เปลี่ยน DATA_CACHE_DIR เป็นไดเรกทอรีที่ถูกต้องและปรับ FEATURE_DELETE และ FEATURE_IRRELEVANT
คุณสามารถดาวน์โหลดโมเดลพื้นฐานโพสต์-ลบและโพสต์-การกู้คืนแบบปรับแต่งได้ที่นี่: https://drive.google.com/file/d/19duv1xv2uw789he4zc5bb5bmknrrug7q/view?usp=sharing
คุณควรแยกโมเดลออกจากไฟล์นั้นจากนั้นดูที่ model_names.md เพื่อดูว่าโมเดลใดเป็นแบบใด
tokenizer สำหรับรุ่นเหล่านี้อยู่ใน tokenizers/ คุณจะต้องคัดลอกไฟล์เหล่านี้ไปยัง DATA_CACHE_DIR ที่คุณใช้สำหรับจุดตรวจสอบรุ่น
ในการฝึกอบรมให้ใช้ python train.py <args> คุณสามารถสร้างการกำหนดค่าการฝึกอบรมที่เฉพาะเจาะจงโดยการคัดลอกไฟล์ใน configs และปรับอาร์กิวเมนต์ตามความต้องการของคุณและข้อโต้แย้งยังสามารถแทนที่ในบรรทัดคำสั่งเช่น:
python train.py configs/base30M.py --batch_size=32 --lr=1e-4 อาร์กิวเมนต์ต้องใช้ = และไม่ใช่ช่องว่าง
การตั้งค่านี้ช่วยให้คุณสร้างไฟล์กำหนดค่าสำหรับชุดการทดลองหรือการกวาดและจากนั้นผ่านอาร์กิวเมนต์ที่แตกต่างกันไปตามการทดลอง (เช่นโมเดลพื้นฐานอัตราการเรียนรู้ชุดข้อมูล ฯลฯ ) บนบรรทัดคำสั่ง
คำสั่งทั้งหมดเหล่านี้จะบันทึกสถิติและรุ่นมาสู่ wandb โดยอัตโนมัติดังนั้นตรวจสอบให้แน่ใจว่าคุณลงชื่อเข้าใช้สิ่งนั้น
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=512การลบ:
python train.py configs/base91M_tw_delete_no_lrs.py --dataset_name=filter-adv-Twist --learning_rate=1e-05การกู้คืน:
python train.py configs/base91M_tw_recovery_no_lrs.py --model_dir=/cache/tinystories/base91M-train-2023_10_06_15_15_49_074/out ฉันได้ทำการทดลองเป็น wandb กวาด คุณสามารถดูตัวอย่างการกำหนดค่าการกวาดสำหรับการลบและการกู้คืนใน sweeps/*.yaml สร้างการกวาดด้วย wandb sweep -p tinystories-uft -e ucl-dar sweeps/<sweep.yaml> จากนั้นในสิ่งที่คุณใช้ในการส่งสคริปต์ที่คุณใช้ใช้ wandb agent <sweep_id> --count 1 (คุณต้องการ --count 1 ถ้าคุณใช้ slurm/etc
ดูสคริปต์ Train.py สำหรับการเปิดตัวที่แปลกใหม่มากขึ้นและการแทนที่ไฮเปอร์พารามิเตอร์ นี่คือคำแนะนำสั้น ๆ เกี่ยวกับวิธีการตั้งค่าพารามิเตอร์ ดูที่โต๊ะที่ปลายกระดาษชินชิลล่าเพื่อให้รู้สึกว่าพารามิเตอร์หม้อแปลง (สลัว, n_layers, n_heads) เติบโตหรือหดตัวด้วยกัน การคาดการณ์/การประสานรูปแบบนี้เพื่อให้ได้หม้อแปลงที่ใหญ่กว่าหรือเล็กกว่า ตั้งค่าความยาวบริบทสูงสุดตามที่คุณต้องการขึ้นอยู่กับปัญหา: นี่ควรเป็นจำนวนโทเค็นสูงสุดที่มีความสำคัญในการทำนายโทเค็นถัดไป เช่น Llama 2 ใช้ 2048 ถัดไปคุณต้องการขนาดแบทช์ ทั้งหมด ต่อการอัปเดต (พิมพ์โดยสคริปต์ว่า "โทเค็นต่อการทำซ้ำจะเป็น:") มีโทเค็นประมาณ 100k สำหรับแอปพลิเคชันขนาดกลาง สำหรับแอปพลิเคชันขนาดเล็กอาจต่ำกว่าสำหรับการฝึกอบรมขนาดใหญ่ (เช่น GPTS/LLAMAS) โดยปกติจะเป็น ~ 0.5M หรือมากกว่านั้น คุณไปถึงที่นั่นด้วยการเพิ่ม batch_size เป็นครั้งแรกที่ระบบของคุณอนุญาต (เช่นของฉันคือ 16 ในการวิ่งเมื่อเร็ว ๆ นี้เพราะหลังจากนั้น GPU ของฉันหมดหน่วยความจำ) และจากนั้นคุณต้องการเพิ่มการไล่ระดับสี _cumulation_steps ให้สูงที่สุดเท่าที่จำเป็น ในที่สุดคุณต้องการปรับการเรียนรู้ของคุณ (LR) คุณต้องการให้สิ่งนี้สูงที่สุดเท่าที่การฝึกอบรมของคุณอนุญาต เครือข่ายขนาดเล็กมากสามารถหนีไปได้ด้วย LR ขนาดใหญ่ (เช่น 1E-3 หรือสูงกว่า) เครือข่ายขนาดใหญ่ต้องการ LR ที่ต่ำกว่า 3E-4 เป็นตัวเลือกที่ปลอดภัยในแอปพลิเคชันขนาดกลางส่วนใหญ่ แต่อาจต่ำเกินไปสำหรับเครือข่ายขนาดเล็กดังนั้นลองเพิ่มมัน! ในที่สุด max_iters คือความยาวของการฝึกอบรม เล่นกับการตั้งค่าที่แตกต่างกัน ฉันส่วนใหญ่จะปรับพารามิเตอร์เหล่านี้และปล่อยให้คนอื่น ๆ ส่วนใหญ่ไม่เปลี่ยนแปลง นี่คือตัวอย่างของวิธีที่ฉันฝึกฝนโมเดล 110m ซึ่งฉันไม่คิดว่าจะอยู่ใกล้ที่สุด แต่ดูสมเหตุสมผลสำหรับฉัน: สลัว 768, n_layers 12, n_heads 12 (ขนาดของแต่ละหัวคือ 768/12 = 64 ช่อง), การเพิ่มขึ้นของ 1 1024 ขนาดแบทช์โทเค็นเป็น 16 ชุดขนาด * 1024 โทเค็นตามลำดับ * 8 grad_accum = 131,072 โทเค็นต่อการอัปเดต ดี. อัตราการเรียนรู้ 4E-4 (อาจต่ำเกินไป) max_iters 200k (อาจสูงเกินไป) DROPOUT 0.1 ซึ่งมักจะช่วยเล็กน้อยในขนาดกลาง นั่นคือ ฉันวิ่งโดยใช้ข้อมูลแบบกระจายแบบขนาน (DDP) ใน 4 GPU บนเครื่องคลาวด์ของฉันการฝึกอบรมใช้เวลา ~ วันหรือมากกว่านั้น
มิกซ์
หากคุณใช้รหัสนี้โปรดอ้างอิงงานของเรา:
@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}
}
คุณควรอ้างถึงกระดาษ 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}
}