Benchmarkowanie lokalnych modeli LLM

Repozytorium GitHub projektu

Tło

Zbudowałem LLM Speed Benchmark (LLMSB) podczas mojego czasu jako inżynierski stażysta w niepełnym wymiarze godzin w Anarchy (YC W23). LLMSB jest narzędziem do benchmarkowania służącym do oceny wydajności modelu LLM. Używa biblioteki transformers firmy HuggingFace do ładowania i uruchamiania modelu LLM i mierzy:

  • całkowity czas wykonania
  • tokeny na sekundę
  • ogólne specyfikacje sprzętowe
  • użycie CPU (bieżąca częstotliwość i procent użycia rdzeni w czasie)
  • użycie RAM (RAM i swap w czasie)
  • użycie GPU (obciążenie, użycie pamięci i temperatura w czasie)

TUTAJ znajduje się przykład uruchomienia benchmarku dla modelu codellama-13b-oasst-sft-v10 działającego na H100. Osobiście posiadam Nvidia RTX 2070 Ti, która ma 8 GB VRAM. Niestety, w przypadku większości nowoczesnych modeli LLM 8 GB VRAM to za mało, aby współpracować z modelem. Z tego powodu używałem RunPod, aby „wynajmować” GPU i uruchamiać moje benchmarki na niektórych modelach.

To była historia pochodzenia LLMSB. Ponieważ projekt jest open-source, możesz zobaczyć kod TUTAJ. Poniżej zamieściłem README z repozytorium, jeśli chcesz je sprawdzić.

O projekcie

🚧 LLM Speed Benchmark (LLMSB) jest obecnie w wersji beta (v0). Proszę nie używać tego w produkcji albo używać na własne ryzyko. Nadal dopracowujemy pewne niedoskonałości i ulepszamy funkcjonalność. Jeśli napotkasz jakiekolwiek błędy lub masz sugestie, prosimy zgłaszaj je w sekcji ISSUES. Twoja opinia jest nieoceniona!

LLM Speed Benchmark (LLMSB) to narzędzie do benchmarkowania służące do oceny wydajności modeli LLM na różnych platformach sprzętowych. Jego ostatecznym celem jest skompilowanie obszernego zbioru danych opisującego wydajność modeli LLM na różnych systemach, umożliwiającego użytkownikom skuteczniejszy dobór odpowiedniego modelu lub modeli LLM do ich projektów.

Ograniczenia

LLMSB jest w wersji v0, więc ma ograniczenia:

  • Został zaprojektowany wyłącznie do działania na systemach operacyjnych opartych na Debianie, czyli nie jest przeznaczony do uruchamiania na Windows. Wynika to z tego, że LLMSB używa neofetch i nvidia-smi do zbierania metryk „od środka”, a logika ścieżek plików opiera się na systemach Unix.
  • Ze względu na sposób rejestrowania metryk, kolektor metryk może potrzebować do 1 sekundy na wykonanie zbierania. Oznacza to, że najszybciej możemy zbierać metryki sprzętowe co 1 sekundę.
  • LLMSB używa tylko HuggingFace do ładowania i uruchamiania modeli. Na razie to działa, ale celem jest, aby LLMSB obsługiwał wiele frameworków, a nie tylko HuggingFace.
  • Obecnie wszystkie modele są uruchamiane przez logikę przedstawioną w funkcji run_llm(), znajdującej się w src/hf.py, gdzie używane są funkcje AutoTokenizer() i AutoModelForCausalLM() do ładowania i uruchamiania modelu. To działa, ale ogranicza to, jak możemy konfigurować/optymalizować konkretne modele. Wiedząc o tym, celem jest stworzenie osobnych klas dla każdego popularnego modelu i wykorzystanie specyficznych klas modeli HuggingFace, takich jak LlamaTokenizer i LlamaForCausalLM, zamiast tego.
  • LLMSB zbiera jedynie ogólne, wysokopoziomowe metryki. W przyszłości chcielibyśmy zbierać metryki niższego poziomu. Uważamy, że częściowo można to zrobić, używając wrappera profilu Pythona porfiler wrapper.

Przykładowe wyniki

22 listopada 2023

LLMSB został uruchomiony/przetestowany na GPU L40 i H100 za pośrednictwem RunPod. W tych benchmarkach modele llama-2-7b-hf, codellama-13b-oasst-sft-v10 oraz mpt-7b zostały przetestowane. Sprawdź wyniki TUTAJ. Jeśli zostaną zauważone jakiekolwiek błędy/problemy, prosimy zgłaszać je do sekcji ISSUES.

Konfiguracja

  1. Utwórz i aktywuj środowisko Python:

    python3 -m venv env
    source env/bin/activate
    
  2. Zainstaluj zależności pakietów (za pomocą APT):

    apt -y update
    apt install -y vim
    apt install -y neofetch
    
  3. Zainstaluj zależności Pythona:

    pip3 install transformers
    pip3 install psutil
    pip3 install gputil
    pip3 install tabulate
    pip3 install sentencepiece
    pip3 install protobuf
    
  4. Zainstaluj Pytorch

    # zainstaluj stabilną wersję pytorch dla linuxa, używając CUDA 12.1:
    pip3 install torch torchvision torchaudio
    
  5. Zainstaluj LLM-VM:

    pip install llm-vm
    
  6. (opcjonalnie) Jeśli używasz modeli takich jak LLAMA, będziesz potrzebować tokenu dostępu HuggingFace. Skonfiguruj swój token dostępu TUTAJ, a następnie zapisz swój token w konsoli, uruchamiając następujące polecenie:

    huggingface-cli login
    

Jak uruchomić

  1. Wykonaj kroki wymienione w sekcji Konfiguracja.

  2. Aby skonfigurować swój zestaw, musisz utworzyć plik json z następującymi parametrami (oto przykład):

    • UWAGA: nie każdy framework obsługuje te same parametry
    {
      "model": "bigscience/bloom-560m",   # ścieżka/repo modelu w HuggingFace (https://huggingface.co/models)
      "prompt": "Hello World!",           # prompt, który chcesz wprowadzić do modelu LLM
      "device": "cuda:0",                 # urządzenie, na którym chcesz uruchomić model LLM (GPU/CPU)
      "max_length": 50,                   # maksymalna długość generowanych tokenów
      "temperature": 0.9,                 # wartość temperatury dla modelu LLM
      "top_k": 50,                        # wartość top-k dla modelu LLM
      "top_p": 0.9,                       # wartość top-p dla modelu LLM
      "num_return_sequences": 1,          # liczba niezależnie uruchomionych instancji modelu
      "time_delay": 0,                    # opóźnienie czasowe (sekundy), na które kolektor metryk będzie czekał na iterację
      "model_start_pause": 1,             # czas (sekundy), jaki test odczeka PRZED uruchomieniem modelu LLM
      "model_end_pause": 1                # czas (sekundy), jaki test odczeka PO zakończeniu działania modelu LLM,
      "framework": "llm-vm"               # nazwa frameworka/biblioteki, której chcesz użyć do uruchomienia modelu
    }
    
  3. Korzystając ze ścieżki do pliku konfiguracyjnego utworzonego w poprzednim kroku, uruchom poniższe polecenie, aby rozpocząć benchmark (wybierz jedną opcję):

    # uruchom jeden benchmark
    python3 run.py --config ./configs/llmvm_test.json
    
    # uruchom więcej niż jeden benchmark (w tym przypadku 3)
    python3 run.py --config ./configs/llmvm_test.json --loops 3
    
  4. Po zakończeniu benchmarku sprawdź końcowe wyniki w pliku, który powinien wyglądać mniej więcej tak:

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

Konfiguracja RunPod:

  1. Skonfiguruj RunPod, skonfiguruj swój certyfikat/klucz SSH i uruchom pod. Możesz uzyskać dostęp do swojego poda na stronie konsoli RunPod.

  2. Kliknij przycisk „Connect”, aby uzyskać informacje o połączeniu SSH. Informacje te powinny wyglądać mniej więcej tak:

    ssh root&12.345.678.90 -p 12345 -i ~/.ssh/id_example
    
    • To polecenie będzie sformatowane w ten sposób:

      ssh <user>@<ip-address> -p <port> -i <local-path-to-ssh-cert>
      
  3. Korzystając z polecenia z kroku #2, powinieneś móc połączyć się przez ssh z podem i użyć wybranego GPU w tym podzie RunPod.

  4. Jeśli chcesz skopiować plik z poda na swój lokalny komputer, użyj polecenia w takim formacie (odnosi się to do zmiennych pokazanych w kroku #2):

    scp -P <port> -i <local-path-to-ssh-cert> <user>@<ip-address>:<path-to-file-in-pod> <path-to-local-directory>
    
    • Oto przykład takiego polecenia:

      scp -P 12345 -i ~/.ssh/id_example <user>@<ip-address>:/root/test.txt /home/user1/Downloads/
      
  5. Po zakończeniu pracy z podem wyłącz go lub wstrzymaj. Ale uwaga: jeśli go wstrzymasz, nadal będziesz naliczany, tylko znacznie mniej.

Świetne źródła: