LLM スピードベンチマーク

プロジェクトのGitHubリポジトリ

背景

私はパートタイムのエンジニアリングインターンとしてAnarchy (YC W23)に在籍している間に LLM Speed Benchmark (LLMSB) を構築しました。LLMSB は LLM モデルのパフォーマンスを評価するベンチマークツールです。HuggingFace の transformers ライブラリを使用して LLM モデルをロードおよび実行し、以下を測定します:

  • 総実行時間
  • トークン毎秒数
  • 一般的なハードウェア仕様
  • CPU 使用率(現在の周波数とコア使用率の時間経過)
  • RAM 使用率(RAM とスワップの時間経過)
  • GPU 使用率(負荷、メモリ使用率、温度の時間経過)

こちら は、codellama-13b-oasst-sft-v10 モデルを H100 上で実行したベンチマークの例です。私は個人的に Nvidia RTX 2070 Ti を所有しており、8 GB の VRAM を持っています。残念ながら、ほとんどの最新 LLM モデルでは 8 GB の VRAM ではモデルを扱うのに十分ではありません。そのため、RunPod を利用して GPU を「レンタル」し、特定のモデルでベンチマークを実行しました。

これが LLMSB の背景/起源です。プロジェクトはオープンソースなので、コードは こちら で確認できます。以下に、リポジトリの README を掲載します。

概要

🚧 LLM Speed Benchmark (LLMSB) は現在ベータ版 (v0) です。プロダクション環境での使用は控えるか、自己責任でご利用ください。まだいくつかの不具合を解消中で、機能改善を行っています。バグや提案がある場合は、ISSUES で報告してください。皆様のフィードバックは非常に貴重です!

LLM Speed Benchmark (LLMSB) は、さまざまなハードウェアプラットフォーム上で LLM モデルのパフォーマンスを評価するベンチマークツールです。その最終目標は、さまざまなシステム上での LLM モデルのパフォーマンスを詳細に記録した包括的なデータセットを作成し、ユーザーがプロジェクトに最適な LLM モデルをより効果的に選択できるようにすることです。

制限事項

LLMSB は v0 であるため、以下の制限があります:

  • Debian 系 OS のみで動作するよう設計されており、Windows では動作しません。これは LLMSB が内部で neofetch と nvidia-smi を使用してメトリクスを取得し、ファイルパスロジックが Unix 系 OS を前提としているためです。
  • メトリクスの記録方法により、メトリクスコレクタが収集を完了するまでに最大で 1 秒かかることがあります。つまり、最速でも 1 秒ごとにハードウェアメトリクスを取得できます。
  • LLMSB は現在 HuggingFace のみを使用してモデルをロード・実行しています。今後は HuggingFace に限らず複数のフレームワークに対応させることが目標です。
  • 現在、すべてのモデルは src/hf.py にある run_llm() 関数のロジックを通して実行されます。この関数では AutoTokenizer() と AutoModelForCausalLM() を使用してモデルをロード・実行しています。この方法は機能しますが、特定のモデルを個別に設定・最適化する柔軟性が制限されます。そのため、各人気モデル用に個別クラスを作成し、LlamaTokenizer や LlamaForCausalLM など HuggingFace のモデル固有クラスを利用できるようにすることが目標です。
  • LLMSB は一般的で高レベルなメトリクスのみを収集します。将来的には、より低レベルなメトリクスも取得したいと考えています。その一部は PyTorch の profiler wrapper を使用して実現できると考えています。

サンプル出力

2023年11月22日

LLMSB は RunPod を介して L40 と H100 GPU 上で実行されました。そのベンチマークでは、llama-2-7b-hfcodellama-13b-oasst-sft-v10、および mpt-7b の 3 つのモデルがテストされました。結果は こちら で確認できます。エラーや問題が見つかった場合は、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. 設定ファイルを作成し、以下のパラメータを記入します(例を示します):

    • NOTE: not every framework supports the same parameters
    {
      "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 証明書/キーを設定してポッドを起動します。ポッドは 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 接続し、選択した GPU を利用できるようになります。

  4. ポッドからローカルマシンへファイルをコピーしたい場合は、次の形式でコマンドを実行します(手順 #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. ポッドの使用が終わったら、シャットダウンまたは一時停止してください。ただし、一時停止すると料金はかかりますが、使用中よりははるかに安くなります。

参考資料