يحتوي هذا المستودع على رمز لتكرار أبحاثنا الموصوفة في "Cramming: تدريب نموذج لغة على وحدة معالجة الرسومات الواحدة في يوم واحد". نحن نجرب نموذج اللغة قبل أن يتدرب نموذجًا من نوع Bert مع حساب محدود ، نتساءل "ما مدى سوء الأمر"؟
يمكنك العثور على ورقتنا هنا: https://arxiv.org/abs/2212.14034 ، والملخص أدناه:
ركزت الاتجاهات الحديثة في نمذجة اللغة على زيادة الأداء من خلال التحجيم ، وقد أدت إلى بيئة تكون فيها نماذج لغة التدريب بعيدة عن متناول معظم الباحثين والممارسين. بينما يسأل معظمهم في المجتمع عن كيفية دفع حدود الحساب الشديد ، نطرح السؤال المعاكس:
إلى أي مدى يمكن أن نحصل على وحدة معالجة الرسومات الواحدة في يوم واحد فقط؟
نحن نبحث في الأداء المصب الذي يمكن تحقيقه من خلال نموذج لغة قائم على المحولات مدرب بالكامل من نقطة الصفر مع نمذجة اللغة المقنعة ليوم واحد على وحدة معالجة الرسومات المستهلك الواحد . بصرف النظر عن إعادة تحليل جميع مكونات خط الأنابيب المسبق لهذا السيناريو وتزويد خط أنابيب معدّل بأداء قريب من Bert ، فإننا نتحقق من أن التوسع صعب ، وأي التعديلات تحسن الأداء فعليًا في هذا السيناريو. نحن نقدم دليلًا على أنه حتى في هذا الإعداد المقيد ، يتبع الأداء عن كثب قوانين التحجيم التي لوحظت في إعدادات كبيرة الحوسبة. من خلال عدسة قوانين التحجيم ، نقوم بتصنيف مجموعة من التحسينات الحديثة على التدريب والهندسة المعمارية ونناقش جدارة وتطبيقها العملي (أو عدم وجودها) لإعدادات الحساب المحدودة.
تحتاج إلى Pytorch 2.0 لتشغيل الرمز الجديد. إذا كنت ترغب في البقاء على Pytorch 1.*، يمكنك الخروج من العلامة Last1.13release . النموذج الجديد ، الذي تم تدريبه مع قاعدة البيانات الجديدة أفضل 1-2 ٪ على الغراء مع نفس الميزانية. يمكن العثور على نقطة التفتيش على https://huggingface.co/jonasgeiping/crammed-bert. نقطة التفتيش القديمة هي الآن https://huggingface.co/jonasgeiping/crammed-bert-legacy.
أيضًا ، تحسنت المعالجة المسبقة للبيانات ، يمكنك الآن دفق البيانات مباشرة من Huggingface ، من التحميل على https://huggingface.co/Datasets/Jonasgeiping/the_pile_wordpiecex32768_2efdb9d060d1ae95faf952ec1a50f020.
جلسة:
تشغيل pip install . لتثبيت جميع التبعيات.
torch (على الأقل الإصدار 2.1)transformers ، tokenizers ، datasets ، evaluatehydra-corepsutil ، pynvml ، safetensorseinops pip install . لتثبيت جميع الحزم والبرامج النصية.curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ، ثم git clone https://github.com/google-research/deduplicate-text-datasets/tree/dev-v1 ثم قم cargo install --target-dir ../cramming/dedupللتحقق من الحد الأدنى من التثبيت ، يمكنك التشغيل
python pretrain.py name=test arch=hf-bert-base train=bert-base data=sanity-check-2 dryrun=True impl.microbatch_size=2
يقوم هذا الأمر بتجهيز مجموعة بيانات فحص صغيرة من التعقل ، ويدير خطوة تدريب واحدة.
استخدم البرنامج النصي pretrain.py إلى presrain مع حساب محدود. يستخدم هذا المستودع Hydra (https://hydra.cc/docs/intro/) ، لذلك يمكن تعديل جميع الحقول في cramming/config على سطر الأوامر. على سبيل المثال ، يمكن تعديل budget من خلال توفير budget=48 كوسيطة إضافية (لتشغيل لمدة 48 ساعة) ، أو يمكن تعديل معدل التعلم عبر train.optim.lr=1e-4 . تحقق من مجلد التكوين لرؤية جميع الوسائط.
يجب أن تكون خطوتك الأولى هي التحقق من الحزم المثبتة. للقيام بذلك ، يمكنك تشغيل python pretrain.py dryrun=True ، والتي ستقوم بتشغيل التحقق الافتراضي للتكرار الواحد. من هناك ، يمكنك تمكين وظائف إضافية. على سبيل المثال ، قم بتعديل العمارة ، على سبيل المثال arch=bert-original Setup train=bert-original . لتدريب نموذج اللغة حقًا ، تحتاج إلى التبديل من مجموعة بيانات التحقق من العقل إلى data=pile-readymade . بعد ذلك ، اختر إعداد تدريب محسّن ، مثل train=bert-o4 ، وتخطيط نموذج محسن ، على سبيل المثال arch=crammed-bert .
سيتم قراءة مصادر البيانات من data.sources وتطبيعها وتخليصها قبل بدء التدريب وتخزينها مؤقتًا في قاعدة بيانات. المكالمات اللاحقة مع نفس التكوين سوف تعيد استخدام قاعدة البيانات هذه من التسلسلات الرمزية. بشكل افتراضي ، سيتم أيضًا إنشاء وحفظ الرمز المميز الجديد خلال هذه العملية. خيارات البيانات المهمة هي data.max_entries_in_raw_dataset ، والتي تحدد مقدار البيانات الخام التي سيتم تحميلها. على سبيل المثال ، بالنسبة لمصدر بيانات كبير مثل C4 ، سيتم تنزيل مجموعة فرعية فقط من البيانات الأولية. بعد ذلك ، max_seq_in_tokenized_dataset يتكيف عدد التسلسلات المعالجة التي سيتم تخزينها في قاعدة البيانات. يجب أن يكون هذا الرقم أكبر من عدد التسلسلات المتوقع قراءتها في الميزانية.
ملاحظات إضافية:
data=pile-readymadepython pretrain.py data=... dryrun=True ، والتي تجف التدريب ، ولكنها تدير المعالجة المسبقة للبيانات الكاملة. يمكن للتشغيل لاحقًا إعادة استخدام البيانات المخزنة مؤقتًا.impl.threads . لا سيما رمز البيانات المستهلكة لا يتطلب مبالغ كبيرة من ذاكرة الوصول العشوائي.bookcorpus-wikipedia فقط ، والتي تعتبر المعالجة المسبقة بسرعة نسبيًا وبعد ذلك فقط تبحث في C4 الكامل المعالج والترشيح. للرجوع إليها ، وإذا كنت مهتمًا فقط بتغيير التدريب/الهندسة المعمارية ، يمكنك العثور على بعض مجموعات البيانات المعالجة مسبقًا هنا:
يمكن بث مصادر البيانات هذه. للقيام بذلك ، Simple SET data=pile-readymade .
البيانات المعالجة مسبقًا مريحة للعمل معها ، وأعتقد أن التعديلات على معالجة البيانات والتصفية لا تزال غير محسوسة مقارنة بالتدريب والهندسة المعمارية بسبب هذا. قد يكون هناك المزيد من المكاسب التي يتعين تحقيقها مع بيانات أفضل ، أكثر من التعديلات الأخرى ، لذلك قد ترغب في نهاية المطاف في التفكير في إعداد الكود والبيئة لخط أنابيب معالجة البيانات الكامل للعمل.
يمكنك الآن العثور على نقطة تفتيش للنسخة النهائية المدربة على the-pile على https://huggingface.co/jonasgeiping/crammed-bert.
لتقييم النماذج المسبقة على الغراء (أو بعض مهام الغراء) ، استخدم eval.py يبحث هذا البرنامج النصي عن النماذج المحفوظة في الدليل الأساسي. بالنظر إلى اسم التشغيل السابق ، سيقوم هذا البرنامج النصي ، بشكل افتراضي ، باسترداد أحدث نقطة تفتيش تم حفظها بهذا الاسم ، ثم تشغيل التقييمات.
يمكنك تسجيل التشغيل إلى حساب أوزانك وتحيزاتك. للقيام بذلك ، ما عليك سوى تعديل wandb.entity و wandb.project على سطر الأوامر أو في cramming/config/wandb/default.yaml .
لتكرار الوصفة النهائية التي تمت مناقشتها في الورقة ، قم بالتشغيل
python pretrain.py name=amp_b8192_cb_o4_final arch=crammed-bert train=bert-o4 data=pile-readymade
إلى ما قبل و
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
لتقييم النموذج. تتوافق الوصفة التي تسمى "Bert Bert" في الورقة مع الهندسة المعمارية التي تسمى crammed-bert في التكوين ، المدربين مع إعداد التدريب bert-o4 على the-pile .
للحصول على الأداء الأمثل ، يجب أن تكون على أحدث ليلات Pytorch ليلا وتعيين متغيرات المحث التالية (التي تعدل إعداد torch.compile باستخدام المحث):
max_autotune_gemm: Truemax_autotune_pointwise: Falsetriton.cudagraphs: Truetriton.cudagraph_trees: False PRETRAINE: GPU واحد ، إعدادات BERT الأصلية:
python pretrain.py name=bert data=bookcorpus-wikipedia arch=bert-original train=bert-original budget=10000000
Multi-GPU ، إعدادات BERT الأصلية:
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
تقييم نقطة تفتيش معانقة (في هذا المثال على 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
قم بتقييم نقطة تفتيش محلية (تعطيل التجميع ، والذي يتوقع أشكالًا ثابتة الآن):
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
تحقق من الرمز الموزع على وحدة المعالجة المركزية:
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
يمكن العثور على أمثلة إضافية للوصفات في مجلد /scripts .
الخيارات التالية هي حاليا معطلة/محدودة/العمل في التقدم. استخدم هذه وفقًا لتقديرك الخاص. بالطبع ، أي مساهمات هنا موضع تقدير كبير. يمكنك أيضًا إرسال رسالة إلى المزيد من الأسئلة حول أي من هذه النقاط ، إذا كنت تريد النظر إليها.
Last1.13release . إذا كنت مهتمًا بإحياء بعض هذه الخيارات. لا تتردد في فتح طلب سحب مع تحديثات إلى قاعدة الكود الجديدة.من فضلك ، لا تتردد في الاتصال بنا مع أي أسئلة ، أو فتح مشكلة على جيثب.