LLM スピードベンチマーク

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

背景

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

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

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

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

概要

🚧 LLM Speed Benchmark (LLMSB) は現在ベータ版 (v0) です。実運用での使用は避けるか、自己責任でご利用ください。まだいくつかの不具合を解消し、機能改善を行っています。バグに遭遇したり提案がある場合は、課題 に報告してください。皆様のフィードバックは非常に貴重です!

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

制限事項

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

  • Debian 系のオペレーティングシステムでの実行のみを想定しており、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-hf、codellama-13b-oasst-sft-v10、そして mpt-7b がテストされました。結果は こちら で確認できます。エラーや問題が見つかった場合は、課題 に報告してください。

セットアップ

  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. Setup セクションに記載された手順を完了してください。

  2. 設定を行うには、以下のパラメータを含む JSON ファイルを作成する必要があります(例は以下の通りです):

    • NOTE: すべてのフレームワークが同じパラメータをサポートしているわけではありません
    {
      "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. ポッドの使用が終わったら、シャットダウンまたは一時停止してください。ただし、注意点として、一時停止しても料金は発生しますが、はるかに少額です。

参考情報