Локальний бенчмарк моделей LLM

Репозиторій проєкту на GitHub

Передісторія

Я створив LLM Speed Benchmark (LLMSB) під час своєї роботи на неповний робочий день як Engineering Intern в Anarchy (YC W23). LLMSB — це інструмент для бенчмаркінгу, призначений для оцінювання продуктивності моделі LLM. Він використовує бібліотеку HuggingFace 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. Оскільки проєкт є open-source, ви можете переглянути код ТУТ. Нижче я додав README з репозиторію, якщо ви хочете з ним ознайомитися.

Про проєкт

🚧 LLM Speed Benchmark (LLMSB) наразі перебуває в бета-версії (v0). Будь ласка, не використовуйте його в продакшені або використовуйте на власний ризик. Ми все ще усуваємо деякі недоліки та покращуємо функціональність. Якщо ви виявите будь-які помилки або маєте пропозиції, будь ласка, повідомте про них у розділі ISSUES. Ваш відгук безцінний!

LLM Speed Benchmark (LLMSB) — це інструмент для бенчмаркінгу, призначений для оцінювання продуктивності моделей 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(). Це працює, але обмежує те, як ми можемо конфігурувати/оптимізувати конкретні моделі. З огляду на це, мета полягає в тому, щоб створити окремі класи для кожної популярної моделі та натомість використовувати специфічні для моделі класи 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. Створіть і активуйте середовище Python:

    python3 -m venv env
    source env/bin/activate
    
  2. Встановіть залежності пакета (за допомогою APT):

    apt -y update
    apt install -y vim
    apt install -y neofetch
    
  3. Встановіть залежності Python:

    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(ів) на сторінці консолі 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, вимкніть його або поставте на паузу. Але застереження: якщо ви поставите його на паузу, з вас усе одно буде стягуватися плата, просто значно менша.

Чудові джерела: