nnScaler هو محرك موازي يجمع نموذج الشبكة العصبية العميقة (DNN) المصمم لتنفيذ وحدة معالجة رسومات واحدة في برنامج قادر على العمل بالتوازي عبر وحدات معالجة رسوميات متعددة.
سهولة الاستخدام: يلزم تغيير بضعة أسطر فقط من التعليمات البرمجية لتمكين الموازاة الآلية.
Pythonic: مخرجات الموازاة موجودة في كود PyTorch، مما يسهل على المستخدمين الفهم ومريح لمزيد من التطوير أو التخصيص.
القابلية للتوسعة: يعرض nnScaler واجهة برمجة التطبيقات (API) لدعم المشغلين الجدد للنماذج الناشئة.
الموثوقية: تم التحقق من أن nnScaler هو نظام يمكن الاعتماد عليه من خلال العديد من الدورات التدريبية الشاملة.
الأداء: من خلال استكشاف مساحة موازية كبيرة، يمكن لـ nnScaler تحسين أداء التدريب الموازي بشكل كبير.
بالنسبة لعلماء DNN ، يمكنهم التركيز على تصميم النموذج باستخدام PyTorch على وحدة معالجة رسومات واحدة، مع ترك تعقيدات التوازي لـ nnScaler. فهو يقدم تقنيات التوازي المبتكرة التي تتفوق على الأساليب الحالية في الأداء. بالإضافة إلى ذلك، يدعم nnScaler توسيع وحدات DNN بهياكل أو أنماط تنفيذ جديدة، مما يمكّن المستخدمين من موازنة نماذج DNN المخصصة الخاصة بهم.
بالنسبة لخبراء نظام DNN ، يمكنهم الاستفادة من nnScaler لاستكشاف آليات وسياسات موازية DNN الجديدة للنماذج الناشئة. من خلال توفير وظائف محددة من قبل المستخدم للمشغلين الجدد الذين لم يتعرف عليهم nnScaler، فإنه يضمن التوازي السلس لنماذج DNN الجديدة. على سبيل المثال، لتسهيل دعم التسلسل الطويل في LLMs.
قم بتثبيت الحزم التالية قبل تثبيت nnScaler:
Python >= 3.8, < 3.11 (3.10 is recommanded) PyTorch >= 2.0, < 2.4 (2.2.0 is recommanded)
قم بتنفيذ الأوامر أدناه في دليل nnScaler:
pip install -r requirements.txt pip install -e .
بالإضافة إلى ذلك، لتجنب خطأ cppimport ، يجب أيضًا تضمين دليل nnScaler في متغير البيئة PYTHONPATH :
export NNSCALER_HOME=$(pwd) export PYTHONPATH=${NNSCALER_HOME}:$PYTHONPATH
تثبيت الحزم المطلوبة لتشغيل Llama-3. علاوة على ذلك، هناك حاجة إلى إصدار معين من مكتبة CUDA أثناء تثبيت برنامج flash-attn. على سبيل المثال، يلزم وجود CUDA V11.8 في حالة استخدام PyTorch 2.20.
python -m pip install transformers==4.40.0 flash-attn==2.5.5 tensorboard
احصل على الوصول إلى نموذج Llama-3 من HuggingFace، حيث ستتلقى رمز وصول والذي يجب تعيينه كمتغير بيئة:
export HF_TOKEN=<HUGGINGFACE_ACCESS_TOKEN>
يمكنك العثور على كافة أكواد المثال على examples/llama3_8B_128K
. كما هو موضح أدناه، يحتاج المستخدم إلى:
لف النموذج: تضمين حساب الخسارة والمكونات الضرورية الأخرى.
تكوين المكونات: قم بإعداد النموذج والمحسن ومحمل البيانات.
التهيئة والبدء: في الوظيفة الرئيسية، قم بإنشاء مدرب nnScaler بالتكوينات المذكورة أعلاه وابدأ عملية التدريب.
# استيراد nnScaler المدمج في المدرب القادر على الموازاة من nnscaler.cli.trainer استيراد نموذج التفاف المدرب # ليشمل حوسبة الخسارة، وما إلى ذلك.class WrapperModel(torch.nn.Module):def __init__(self, model_id):super(). __init__()self.model = AutoModelForCausalLM.from_pretrained(model_id, attn_implementation='flash_attention_2')defward(self, Samples):outputs = self.model.model(input_ids=samples['net_input']['src_tokens'],use_cache=False,return_dict=False, )loss = torch.sum(chunk_linear_cross_entropy(outputs[0], self.model.lm_head.weight, Samples['target'], ...))خسارة الإرجاع، العينات['ntkens']، العينات['nsentences'] def main(args):# data configdataloader_config = ... # model configmodel_config = ModelConfig(type=WrapperModel,args={'model_id': args.model_id, }, )# المعلمات الفائقة للمُحسِّن Optimer_config = OptimizerConfig(type=MixedPrecisionAdamW,args={'lr': 2e-5, 'betas': (0.9, 0.95), 'weight_decay': 0.0, 'fused': True},#... )#...# مدرب الإعداد مع تكوينات أداة تحميل البيانات/النموذج/المُحسِّن، وما إلى ذلك. Trainer = Trainer(train_args=TrainerArgs(#...model=model_config,optimizer=optimizer_config,dataloader=dataloader_config,#...))trainer.run()
ثم يمكننا أن نبدأ المثال، وسيتم الانتهاء من جميع مهام التوازي بواسطة nnScaler تلقائيًا.
أمثلة على القرص المضغوط/llama3_8B_128K# إعداد بيانات التدريب:python bookcorpus.py --data_path_or_name bookcorpus/bookcorpus --tokenizer_path_or_name meta-llama/Meta-Llama-3-8B-Instruct --save_path ./bookcorpus_llama3_4K --sequence_length 4096# بناء النموذج المصغرpython create_mini_model.py --model_id meta-llama/Meta-Llama-3-8B-Instruct --output_id ./llama3_mini# ترجمة وتشغيل باستخدام توازي البيانات + Zero1torchrun --nproc_per_node=2 Train.py --plan_ngpus 1 --runtime_ngpus 2 --name llama3_debug --model_id ./llama3_mini --dataset_path ./bookcorpus_llama3_4K
نقدم أيضًا مثالاً لتوضيح كيفية موازاة النموذج من خلال واجهة متوافقة مع PyTorch Lightning في nnScaler.
ابحث عن مثال nanoGPT في nnScaler repo:
أمثلة القرص المضغوط/nanogpt
تثبيت تبعيات nanoGPT:
تثبيت النقطة -r متطلبات.txt
إعداد مجموعة البيانات:
بايثون nanoGPT/data/shakespeare_char/prepare.py
اختبار مع GPU واحد
يمكنك الآن تشغيل train_nnscaler.py
باستخدام torchrun <https://pytorch.org/docs/stable/elastic/run.html>
:
torchrun --nproc_per_node=1 train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
سيؤدي هذا إلى تدريب نموذج GPT صغير على وحدة معالجة رسومات واحدة. سيستغرق الأمر عدة دقائق وستكون أفضل خسارة للتحقق حوالي 1.47.
اختبار مع وحدة معالجة الرسومات المتعددة
افتراضيًا، يقوم nnScaler بموازاة النموذج عبر وحدات معالجة الرسومات مع توازي البيانات . إذا كان لديك 4 وحدات معالجة رسومات على عقدة واحدة:
torchrun --nproc_per_node=4 train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
أو إذا كان لديك عقد متعددة، على سبيل المثال عقدتان تحتوي كل منهما على 4 وحدات معالجة رسوميات:
# on each node torchrun --nnodes=2 --nproc_per_node=4 --rdzv-id=NNSCALER_NANOGPT --rdzv-backend=c10d --rdzv-endpoint=<IP> train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
ملاحظة: يتم تثبيت حجم الدُفعة المحلية بشكل افتراضي، لذا فإن استخدام المزيد من العمال سيؤدي إلى حجم دُفعة عام أكبر.
؟ بالنسبة للاستخدامات المتقدمة، يرجى متابعة إصدارنا المستقبلي.
تم اعتماد nnScaler في العديد من المشاريع، بما في ذلك استكشافات المنتجات والأبحاث:
(YOCO) يتم تخزينها مؤقتًا مرة واحدة فقط: بنيات وحدة فك التشفير لنماذج اللغة
LongRoPE: توسيع نافذة سياق LLM إلى ما يتجاوز 2 مليون رمز مميز
ما بعد التدريب على إصدار السياق الطويل لسلسلة Phi-3
يمكنك العثور على تقييم القطع الأثرية لـ OSDI'24 مع الإرشادات هنا. يرجى ذكر nnScaler في منشوراتك إذا كان ذلك يساعد في بحثك:
@inproceedings{lin2024nnscaler, title = {nnScaler: Constraint-Guided Parallelization Plan Generation for Deep Learning Training}, author={Lin, Zhiqi and Miao, Youshan and Zhang, Quanlu and Yang, Fan and Zhu, Yi and Li, Cheng and Maleki, Saeed and Cao, Xu and Shang, Ning and Yang, Yilei and Xu, Weijiang and Yang, Mao and Zhang, Lintao and Zhou, Lidong}, booktitle={18th USENIX Symposium on Operating Systems Design and Implementation (OSDI 24)}, pages={347--363}, year={2024} }
يرحب هذا المشروع بالمساهمات والاقتراحات. تتطلب معظم المساهمات منك الموافقة على اتفاقية ترخيص المساهم (CLA) التي تعلن أن لديك الحق في منحنا حقوق استخدام مساهمتك، بل وتفعل ذلك بالفعل. للحصول على التفاصيل، تفضل بزيارة https://cla.opensource.microsoft.com.
عند إرسال طلب سحب، سيحدد روبوت CLA تلقائيًا ما إذا كنت بحاجة إلى تقديم CLA وتزيين العلاقات العامة بشكل مناسب (على سبيل المثال، التحقق من الحالة، والتعليق). ما عليك سوى اتباع التعليمات التي يقدمها لك الروبوت. سوف تحتاج إلى القيام بذلك مرة واحدة فقط عبر جميع اتفاقيات إعادة الشراء باستخدام CLA الخاصة بنا.
اعتمد هذا المشروع قواعد السلوك الخاصة بشركة Microsoft مفتوحة المصدر. لمزيد من المعلومات، راجع الأسئلة المتداولة حول قواعد السلوك أو اتصل بـ [email protected] لطرح أي أسئلة أو تعليقات إضافية.
قد يحتوي هذا المشروع على علامات تجارية أو شعارات للمشاريع أو المنتجات أو الخدمات. يخضع الاستخدام المصرح به للعلامات التجارية أو الشعارات الخاصة بشركة Microsoft ويجب أن يتبع إرشادات العلامة التجارية والعلامات التجارية الخاصة بشركة Microsoft. يجب ألا يتسبب استخدام العلامات التجارية أو الشعارات الخاصة بشركة Microsoft في الإصدارات المعدلة من هذا المشروع في حدوث ارتباك أو الإشارة ضمنًا إلى رعاية Microsoft. يخضع أي استخدام لعلامات تجارية أو شعارات تابعة لجهات خارجية لسياسات تلك الجهات الخارجية.
يمكنك العثور على الريبو العام الخاص بنا من https://github.com/microsoft/nnscaler أو الريبو الداخلي لـ Microsoft https://aka.ms/ms-nnscaler. إذا كانت لديك أية أسئلة أو استفسارات، يرجى الاتصال بنا على [email protected].