قياس أداء النماذج المحلية للـ LLM

مستودع GitHub الخاص بالمشروع

الخلفية

قمتُ ببناء LLMSB لقياس سرعة نماذج LLM (LLMSB) خلال فترة عملي كمتدرب هندسة بدوام جزئي في Anarchy (YC W23). LLMSB هي أداة قياس أداء لتقييم أداء نموذج LLM. وهي تستخدم مكتبة transformers الخاصة بـ HuggingFace لتحميل وتشغيل نموذج LLM، وتقيس:

  • إجمالي زمن التشغيل
  • عدد الرموز في الثانية
  • المواصفات العامة للعتاد
  • استخدام وحدة المعالجة المركزية (التردد الحالي ونسبة استخدام الأنوية % عبر الزمن)
  • استخدام الذاكرة العشوائية (RAM وswap عبر الزمن)
  • استخدام وحدة معالجة الرسوميات (التحميل، واستخدام الذاكرة، ودرجة الحرارة عبر الزمن)

هنا مثال على تشغيل لقياس أداء لنموذج codellama-13b-oasst-sft-v10 يعمل على H100. أمتلك شخصيًا Nvidia RTX 2070 Ti، والتي تحتوي على 8 جيجابايت من ذاكرة VRAM. للأسف، بالنسبة لمعظم نماذج LLM الحديثة، فإن 8 جيجابايت من VRAM ليست كافية للتعامل مع نموذج. وبسبب ذلك، استخدمت RunPod لـ"استئجار" وحدة/وحدات GPU وتشغيل اختبارات القياس الخاصة بي على نماذج معينة.

كانت هذه هي الخلفية/قصة نشأة LLMSB. وبما أن المشروع مفتوح المصدر، يمكنك الاطلاع على الشيفرة هنا. أدناه أدرجتُ ملف README من المستودع إذا كنت تريد الاطلاع عليه.

حول

🚧 إن LLMSB (LLM Speed Benchmark) ما يزال حاليًا في مرحلة بيتا (v0). يُرجى عدم استخدامه في الإنتاج، أو استخدامه على مسؤوليتك الخاصة. ما زلنا نعمل على إزالة بعض المشكلات وتحسين الوظائف. إذا صادفت أي أخطاء أو كانت لديك اقتراحات، فيُرجى الإبلاغ عنها تحت ISSUES. إن ملاحظاتك لا تقدر بثمن!

LLM Speed Benchmark (LLMSB) هي أداة قياس أداء لتقييم أداء نماذج LLM عبر منصات عتادية مختلفة. هدفها النهائي هو تجميع مجموعة بيانات شاملة تفصل أداء نماذج LLM على أنظمة متعددة، مما يمكّن المستخدمين من اختيار نموذج/نماذج LLM المناسبة لمشاريعهم بشكل أكثر فعالية.

القيود

LLMSB في الإصدار v0، لذا لديها قيود:

  • صُممت فقط للعمل على أنظمة تشغيل مبنية على Debian، أي أنها غير مصممة للعمل على Windows. وذلك لأن LLMSB تستخدم neofetch و nvidia-smi لجمع المقاييس في الخلفية، ومنطق مسار الملفات يعتمد على أنظمة تشغيل Unix.
  • بسبب طريقة تسجيل المقاييس، قد يستغرق جامع المقاييس ما يصل إلى ثانية واحدة لإجراء عملية جمع. هذا يعني أنه، في أفضل الأحوال، يمكننا جمع مقاييس العتاد كل ثانية واحدة.
  • تستخدم LLMSB فقط HuggingFace لتحميل وتشغيل النماذج. هذا يعمل حاليًا، لكن الهدف هو أن تدعم LLMSB أطر عمل متعددة، وليس فقط HuggingFace.
  • حاليًا، تُشغَّل جميع النماذج عبر المنطق المعروض في الدالة run_llm()، الموجودة في src/hf.py، حيث تُستخدم الدالتان AutoTokenizer() وAutoModelForCausalLM() لتحميل نموذج وتشغيله. هذا يعمل، لكنه يحد من كيفية تكوين/تحسين نماذج معينة. ومع أخذ ذلك في الاعتبار، فالهدف هو إنشاء فئات منفصلة لكل نموذج شائع واستخدام الفئات الخاصة بالنموذج في HuggingFace، مثل LlamaTokenizer و LlamaForCausalLM، بدلًا من ذلك.
  • تجمع LLMSB فقط المقاييس العامة وعالية المستوى. في المستقبل، نود جمع مقاييس أدنى مستوى. ونعتقد أن هذا يمكن أن يتم جزئيًا باستخدام أداة التتبع الخاصة بـ Pytorch porfiler wrapper.

مخرجات نموذجية

22 نوفمبر 2023

تم تشغيل/اختبار LLMSB على وحدة GPU من نوع L40 وH100 عبر RunPod. في تلك الاختبارات، تم اختبار النماذج llama-2-7b-hf، وcodellama-13b-oasst-sft-v10، وmpt-7b. اطّلع على النتائج هنا. إذا لوحِظت أي أخطاء/مشكلات، فيُرجى الإبلاغ عنها إلى ISSUES.

الإعداد

  1. أنشئ وفعّل بيئة بايثون:

    python3 -m venv env
    source env/bin/activate
    
  2. ثبّت تبعيات الحزمة (باستخدام APT):

    apt -y update
    apt install -y vim
    apt install -y neofetch
    
  3. ثبّت تبعيات بايثون:

    pip3 install transformers
    pip3 install psutil
    pip3 install gputil
    pip3 install tabulate
    pip3 install sentencepiece
    pip3 install protobuf
    
  4. ثبّت Pytorch

    # install pytorch stable build, for linux, using CUDA 12.1:
    pip3 install torch torchvision torchaudio
    
  5. ثبّت LLM-VM:

    pip install llm-vm
    
  6. (اختياري) إذا كنت تستخدم نماذج مثل LLAMA، فستحتاج إلى رمز وصول من HuggingFace. قم بإعداد رمز الوصول الخاص بك هنا ثم احفظ الرمز في وحدة التحكم لديك عبر تشغيل الأمر التالي:

    huggingface-cli login
    

كيفية التشغيل

  1. أكمل الخطوات المدرجة في قسم الإعداد.

  2. لتكوين إعداداتك، تحتاج إلى إنشاء ملف json بالمَعلمات التالية (وهنا مثال):

    • ملاحظة: ليست كل الأطر تدعم المَعلمات نفسها
    {
      "model": "bigscience/bloom-560m",   # the model's path/repo on HuggingFace (https://huggingface.co/models)
      "prompt": "Hello World!",           # the prompt you want to input into the LLM model
      "device": "cuda:0",                 # the device you want to run the LLM model on (GPU/CPU)
      "max_length": 50,                   # the maximun length of the generated tokens
      "temperature": 0.9,                 # temperatue value for the LLM model
      "top_k": 50,                        # top-k value for the LLM model
      "top_p": 0.9,                       # top-p value for the LLM model
      "num_return_sequences": 1,          # the number of independently ran instances of the model
      "time_delay": 0,                    # the time delay (seconds) the metrics-collecter will wait per interation
      "model_start_pause": 1,             # the time (seconds) the test will wait BEFORE running the LLM model
      "model_end_pause": 1                # the time (seconds) the test will wait AFTER the LLM model is done running,
      "framework": "llm-vm"               # the name of the framework/library you want to use to run the model
    }
    
  3. باستخدام المسار إلى ملف الإعدادات الذي أنشأته في الخطوة السابقة، شغّل ما يلي لبدء قياس الأداء (اختر خيارًا واحدًا):

    # run one benchmark
    python3 run.py --config ./configs/llmvm_test.json
    
    # run more then one benchmark (in this case 3)
    python3 run.py --config ./configs/llmvm_test.json --loops 3
    
  4. بعد انتهاء تشغيل قياس الأداء، راجع النتائج النهائية في ملف يجب أن يبدو شيئًا مثل هذا:

    report_2023-11-25_05:55:04.207515_utc_1ffc4fa7-3aa9-4878-b874-1ff445e1ff8a.json
    

إعداد RunPod:

  1. قم بإعداد RunPod، وأعد إعداد شهادة/مفتاح SSH الخاص بك، وشغّل pod. يمكنك الوصول إلى pod(s) الخاصة بك على صفحة وحدة تحكم RunPod.

  2. انقر على زر “Connect” للحصول على معلومات اتصال SSH. يجب أن تبدو هذه المعلومات شيئًا مثل هذا:

    ssh root&12.345.678.90 -p 12345 -i ~/.ssh/id_example
    
    • سيبدو هذا الأمر بالشكل التالي:

      ssh <user>@<ip-address> -p <port> -i <local-path-to-ssh-cert>
      
  3. باستخدام الأمر في الخطوة #2، ينبغي أن تتمكن من الاتصال عبر ssh إلى pod واستخدام وحدة GPU التي اخترتها في ذلك pod الخاص بـ RunPod.

  4. إذا أردت نسخ ملف من pod إلى جهازك المحلي، فستستخدم أمرًا بهذا الشكل (وهذا يشير إلى المتغيرات الموضحة في الخطوة #2):

    scp -P <port> -i <local-path-to-ssh-cert> <user>@<ip-address>:<path-to-file-in-pod> <path-to-local-directory>
    
    • إليك مثالًا على مثل هذا الأمر:

      scp -P 12345 -i ~/.ssh/id_example <user>@<ip-address>:/root/test.txt /home/user1/Downloads/
      
  5. بعد أن تنتهي من استخدام pod، أوقفه أو أعده إلى وضع الإيقاف المؤقت. لكن تحذير: إذا أوقفتَه مؤقتًا، فستظل تُحاسَب، ولكن بمبلغ أقل بكثير.

مصادر رائعة: