ローカルLLMモデルのベンチマーク

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

背景

私はアナーキー (YC W23)でのパートタイムエンジニアインターンの間にLLMスピードベンチマーク(LLMSB)を構築しました。LLMSBはLLMモデルのパフォーマンスを評価するためのベンチマークツールです。これはHuggingFaceのtransformersライブラリを使用してLLMモデルを読み込み、実行し、以下を測定します:

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

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

これがLLMSBの背景/起源の話です。プロジェクトはオープンソースであるため、コードはこちらで見ることができます。以下に、リポジトリからのREADMEを含めましたので、ぜひご覧ください。

概要

🚧 LLMスピードベンチマーク(LLMSB)は現在ベータ版(v0)です。これを本番環境で使用しないでください、または自己責任で使用してください。まだいくつかの不具合を解消し、機能を改善しています。バグに遭遇したり、提案がある場合は、ISSUESに報告してください。あなたのフィードバックは非常に貴重です!

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

制限事項

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

  • Debianベースのオペレーティングシステムでのみ実行するように設計されており、つまりWindowsでは実行できません。これは、LLMSBが内部でメトリクスを収集するためにneofetchとnvidia-smiを使用しており、ファイルパスのロジックがUnixオペレーティングシステムに基づいているためです。
  • メトリクスが記録される方法のため、メトリクスコレクターが収集を行うのに最大1秒かかることがあります。これは、最速であれば、1秒ごとにハードウェアメトリクスを収集できることを意味します。
  • LLMSBはモデルを読み込み、実行するためにHuggingFaceのみを使用します。これは今のところ機能しますが、目標はLLMSBがHuggingFaceだけでなく複数のフレームワークをサポートすることです。
  • 現在、すべてのモデルはsrc/hf.pyにあるrun_llm()関数で提示されたロジックを通じて実行されており、AutoTokenizer()およびAutoModelForCausalLM()関数を使用してモデルを読み込み、実行します。これは機能しますが、特定のモデルを構成/最適化する方法を制限します。これを考慮して、人気のある各モデルのために別々のクラスを作成し、HuggingFaceのモデル固有のクラス(LlamaTokenizerやLlamaForCausalLMなど)を利用することを目指しています。
  • LLMSBは一般的で高レベルのメトリクスのみを収集します。将来的には、より低レベルのメトリクスを収集したいと考えています。これは部分的にPytorchのプロファイララッパーを使用することで実現できると考えています。

サンプル出力

2023年11月22日

LLMSBはRunPodを通じてL40およびH100 GPUで実行/テストされました。これらのベンチマークでは、llama-2-7b-hfcodellama-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をインストールします:

    # Linux用のCUDA 12.1を使用してpytorchの安定版をインストール:
    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,                        # LLMモデルのtop-k値
      "top_p": 0.9,                       # LLMモデルのtop-p値
      "num_return_sequences": 1,          # モデルの独立して実行されるインスタンスの数
      "time_delay": 0,                    # メトリクスコレクターが各反復ごとに待機する時間(秒)
      "model_start_pause": 1,             # テストがLLMモデルを実行する前に待機する時間(秒)
      "model_end_pause": 1                # テストがLLMモデルの実行後に待機する時間(秒)
      "framework": "llm-vm"               # モデルを実行するために使用したいフレームワーク/ライブラリの名前
    }
    
  3. 前のステップで作成した設定ファイルへのパスを使用して、次のコマンドを実行してベンチマークを開始します(いずれかのオプションを選択):

    # 1つのベンチマークを実行
    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証明書/キーを設定し、ポッドを起動します。ポッドにはRunPodのコンソールページからアクセスできます。

  2. 「接続」ボタンをクリックして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. ポッドの使用が終わったら、シャットダウンまたは一時停止します。ただし、一時停止すると、料金が発生することに注意してくださいが、かなり少なくなります。

参考資料: