
هذا هو رمز تجارب Tinystories من الورقة: تحليل ميكانيكيا آثار التزاوج الدقيق على المهام المحددة من الناحية الإجرائية. يعتمد الرمز على https://github.com/karpathy/llama2.c.
لتثبيت ، استنساخ repo ، وجعل env/anh anha ، 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 دقائق بسبب الرمز المميز. إذا لم يتم تمرير اسم مجموعة البيانات ، يتم إنشاء واحد من الميزات المقدمة ، ويتم تخزين مجموعة البيانات في 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 لمعرفة أي نموذج هو.
الرمز المميز لهذه النماذج في 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 . يمكنك رؤية مثال تكوينات Sweep للحذف والانتعاش في 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 لمزيد من عمليات الإطلاق الغريبة وتجاوزات الفائقة. فيما يلي دليل موجز لكيفية تعيين المعلمات. انظر إلى الجدول في نهاية ورقة Chinchilla للحصول على شعور بكيفية تنمو معلمات المحولات (dim ، n_layers ، n_heads) أو تتقلص معًا. استقراء/يزعج هذا النمط للحصول على محولات أكبر أو أصغر. قم بتعيين طول سياق الحد الأقصى الذي ترغب فيه ، اعتمادًا على المشكلة: يجب أن يكون هذا هو عدد الأقصى من الرموز المميزة للتنبؤ بالرمز التالي. على سبيل المثال ، يستخدم Llama 2 2048. بعد ذلك ، تريد حجم الدفعة الإجمالي لكل تحديث (مطبوع بواسطة البرنامج النصي على أنه "ستكون الرموز لكل التكرار:") لتكون في مكان ما حوالي 100 ألف رمز للتطبيقات متوسطة الحجم. بالنسبة للتطبيقات الصغيرة ، قد يكون الأمر أقل ، للتدريب الكبير (على سبيل المثال GPTS/LLAMA) ، عادة ما يكون 0.5 مترًا ، أو أكثر. يمكنك الوصول إلى هناك عن طريق Maxing First Batch_size إلى كل ما يسمح به نظامك (على سبيل المثال ، كان 16 في سباق حديث لأنه بعد ذلك ينفد وحدة معالجة الرسومات الخاصة بي من الذاكرة) ، ثم تريد زيادة Gradient_accumulation_Steps لتكون عالية حسب الضرورة للوصول إلى حجم الدفعة الإجمالي البالغ 100 ألف ~. أخيرًا ، تريد ضبط Learning_Rate (LR). تريد أن يكون هذا مرتفعًا كما يسمح التدريب الخاص بك. يمكن أن تفلت شبكات صغيرة جدًا مع LR كبيرة (على سبيل المثال 1E-3 أو أعلى). تحتاج الشبكات الكبيرة إلى LRS أقل. 3E-4 هو خيار آمن في معظم التطبيقات متوسطة الحجم ، ولكن يمكن أن يكون منخفضًا جدًا بالنسبة للشبكات الصغيرة ، لذا حاول زيادة ذلك! أخيرًا ، Max_iters هو طول التدريب. العب مع إعدادات مختلفة. أنا في الغالب فقط ضبط هذه المعلمات وأترك معظم الآخرين دون تغيير. فيما يلي مثال على كيفية تدريب طراز 110 متر ، والذي لا أعتقد أنه في أي مكان بالقرب من الأمثل ، ولكن بدا معقولًا بالنسبة لي: Dim 768 ، N_Layers 12 ، N_Heads 12 (لذلك حجم كل رأس هو 768 /12 = 64 قناة) ، كان هناك ما هو أكثر من 8. حجم الدُفعة ليكون 16 دفعة من حجم * 1024 الرموز في التسلسل * 8 grad_accum = 131،072 رمز لكل تحديث. جيد. معدل التعلم 4E-4 (ربما يكون منخفضًا جدًا). Max_iters 200k (ربما مرتفعًا جدًا). التسرب 0.1 ، لأن ذلك عادة ما يساعد قليلا بالحجم المتوسط. كان هذا هو. ركضت باستخدام البيانات الموزعة الموازية (DDP) على 4 وحدات معالجة الرسومات على جهاز السحابة الخاص بي ، واستغرق التدريب ~ يوم أو نحو ذلك.
معهد ماساتشوستس للتكنولوجيا
إذا كنت تستخدم هذا الرمز ، يرجى الاستشهاد بعملنا:
@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}
}