معیارسنجی مدل‌های محلی LLM

مخزن گیت‌هاب پروژه

پیش‌زمینه

من LLMSB (معیارسنجی سرعت LLM) را در دوران کارآموزی پاره‌وقت مهندسی‌ام در Anarchy (YC W23) ساختم. LLMSB یک ابزار معیارسنجی برای ارزیابی عملکرد یک مدل LLM است. این ابزار از کتابخانه transformers هگینگ‌فیس برای بارگذاری و اجرای یک مدل LLM استفاده می‌کند و موارد زیر را اندازه‌گیری می‌کند:

  • زمان اجرای کل
  • تعداد توکن در ثانیه
  • مشخصات کلی سخت‌افزار
  • مصرف CPU (فرکانس فعلی و درصد استفاده هسته‌ها در طول زمان)
  • مصرف RAM (RAM و swap در طول زمان)
  • مصرف GPU (بار، استفاده از حافظه، و دما در طول زمان)

اینجا یک نمونه از اجرای معیارسنجی برای مدل codellama-13b-oasst-sft-v10 است که روی یک H100 اجرا شده است. من شخصاً یک Nvidia RTX 2070 Ti دارم که 8 گیگابایت VRAM دارد. متأسفانه، برای بیشتر مدل‌های مدرن LLM، 8 گیگابایت VRAM برای کار با یک مدل کافی نیست. به همین دلیل، از RunPod برای «اجاره» GPU(ها) و اجرای معیارسنجی‌های خود روی برخی مدل‌ها استفاده کردم.

این بود پیش‌زمینه/داستان پیدایش LLMSB. از آنجا که این پروژه متن‌باز است، می‌توانید کد را اینجا ببینید. در ادامه، README مخزن را آورده‌ام اگر خواستید آن را بررسی کنید.

درباره

🚧 LLMSB (معیارسنجی سرعت LLM) در حال حاضر در نسخه بتا (v0) است. لطفاً از آن در محیط تولید استفاده نکنید، یا با مسئولیت خودتان از آن استفاده کنید. ما هنوز در حال برطرف‌کردن برخی اشکالات و بهبود قابلیت‌ها هستیم. اگر با هر باگ یا پیشنهادی مواجه شدید، لطفاً آن را در ISSUES گزارش کنید. بازخورد شما بسیار ارزشمند است!

LLMSB (معیارسنجی سرعت LLM) یک ابزار معیارسنجی برای ارزیابی عملکرد مدل‌های LLM در پلتفرم‌های سخت‌افزاری مختلف است. هدف نهایی آن گردآوری یک مجموعه‌داده جامع است که عملکرد مدل‌های LLM را روی سیستم‌های گوناگون به‌تفصیل ثبت کند و به کاربران امکان دهد مدل(های) مناسب LLM را برای پروژه‌های خود با اثربخشی بیشتری انتخاب کنند.

محدودیت‌ها

LLMSB در نسخه v0 قرار دارد، بنابراین محدودیت‌هایی دارد:

  • فقط برای اجرا روی سیستم‌عامل‌های مبتنی بر Debian طراحی شده است، یعنی برای اجرا روی Windows طراحی نشده است. این به این دلیل است که LLMSB در پشت‌صحنه از neofetch و nvidia-smi برای جمع‌آوری معیارها استفاده می‌کند و منطق مسیر فایل بر پایه سیستم‌عامل‌های Unix است.
  • به دلیل نحوه ثبت معیارها، ممکن است گردآورنده معیارها تا 1 ثانیه برای انجام یک جمع‌آوری زمان نیاز داشته باشد. این یعنی، در بهترین حالت، می‌توانیم هر 1 ثانیه معیارهای سخت‌افزاری را جمع‌آوری کنیم.
  • LLMSB فقط از HuggingFace برای بارگذاری و اجرای مدل‌ها استفاده می‌کند. این فعلاً کار می‌کند، اما هدف این است که LLMSB از چندین چارچوب پشتیبانی کند، نه فقط HuggingFace.
  • در حال حاضر، همه مدل‌ها از طریق منطقی که در تابع run_llm() ارائه شده و در src/hf.py قرار دارد اجرا می‌شوند، جایی که از توابع AutoTokenizer() و AutoModelForCausalLM() برای بارگذاری و اجرای یک مدل استفاده می‌شود. این کار می‌کند، اما نحوه پیکربندی/بهینه‌سازی مدل‌های خاص را محدود می‌کند. با توجه به این موضوع، هدف این است که برای هر مدل محبوب کلاس‌های جداگانه‌ای ساخته شود و به‌جای آن از کلاس‌های مخصوص مدل هگینگ‌فیس، مانند LlamaTokenizer و LlamaForCausalLM، استفاده شود.
  • LLMSB فقط معیارهای کلی و سطح‌بالا را جمع‌آوری می‌کند. در آینده، مایل هستیم معیارهای سطح پایین‌تر را جمع‌آوری کنیم. ما فکر می‌کنیم این کار تا حدی می‌تواند با استفاده از wraper پروفایلر پایتورچ انجام شود.

خروجی‌های نمونه

۲۲ نوامبر ۲۰۲۳

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 را نصب کنید

    # نصب نسخه پایدار pytorch، برای لینوکس، با استفاده از 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",   # مسیر/مخزن مدل در HuggingFace (https://huggingface.co/models)
      "prompt": "Hello World!",           # پرامپتی که می‌خواهید به مدل LLM وارد کنید
      "device": "cuda:0",                 # دستگاهی که می‌خواهید مدل LLM را روی آن اجرا کنید (GPU/CPU)
      "max_length": 50,                   # حداکثر طول توکن‌های تولیدشده
      "temperature": 0.9,                 # مقدار دما برای مدل LLM
      "top_k": 50,                        # مقدار top-k برای مدل LLM
      "top_p": 0.9,                       # مقدار top-p برای مدل LLM
      "num_return_sequences": 1,          # تعداد نمونه‌های مستقل اجراشده از مدل
      "time_delay": 0,                    # تأخیر زمانی (ثانیه) که گردآورنده معیارها در هر تکرار منتظر می‌ماند
      "model_start_pause": 1,             # زمانی (ثانیه) که آزمون پیش از اجرای مدل LLM منتظر می‌ماند
      "model_end_pause": 1                # زمانی (ثانیه) که آزمون پس از اتمام اجرای مدل LLM منتظر می‌ماند،
      "framework": "llm-vm"               # نام چارچوب/کتابخانه‌ای که می‌خواهید برای اجرای مدل استفاده کنید
    }
    
  3. با استفاده از مسیر فایل پیکربندی‌ای که در مرحله قبلی ایجاد کردید، برای شروع معیارسنجی دستور زیر را اجرا کنید (یکی از گزینه‌ها را انتخاب کنید):

    # اجرای یک معیارسنجی
    python3 run.py --config ./configs/llmvm_test.json
    
    # اجرای بیش از یک معیارسنجی (در این حالت 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(ها)ی خود در صفحه کنسول 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، باید بتوانید به pod از طریق ssh متصل شوید و از 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 تمام شد، آن را خاموش کنید یا متوقفش کنید. اما هشدار: اگر آن را متوقف کنید، باز هم هزینه از شما دریافت خواهد شد، فقط خیلی کمتر.

منابع عالی: