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

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

背景

私は、Anarchy (YC W23)でパートタイムのエンジニアリング・インターンとして働いていた期間に、LLM Speed Benchmark(LLMSB)を構築しました。LLMSBは、LLMモデルの性能を評価するためのベンチマークツールです。HuggingFace の transformers ライブラリを使用してLLMモデルを読み込み・実行し、以下を測定します。

  • 総実行時間
  • 1秒あたりのトークン数
  • 一般的なハードウェア仕様
  • CPU使用率(現在の周波数と、時間経過に伴う各コアの使用率%)
  • RAM使用率(RAMとスワップの時間経過)
  • GPU使用率(負荷、メモリ使用量、および温度の時間経過)

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

これが LLMSB の背景/誕生の物語です。このプロジェクトはオープンソースなので、コードを HERE で見ることができます。以下に、確認したい場合のためにリポジトリの 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秒かかる場合があります。つまり、最速でもハードウェアメトリクスを1秒ごとに収集することになります。
  • LLMSB はモデルの読み込みと実行に HuggingFace のみを使用します。これは現時点では動作しますが、将来的には HuggingFace だけでなく複数のフレームワークを LLMSB がサポートすることを目指しています。
  • 現在、すべてのモデルは src/hf.py にある run_llm() 関数で示されたロジックを通して実行されており、モデルの読み込みと実行には AutoTokenizer() と AutoModelForCausalLM() が使用されています。これは機能しますが、特定のモデルをどのように設定/最適化できるかを制限します。これを踏まえ、代わりに各人気モデルごとに個別のクラスを作成し、LlamaTokenizer や LlamaForCausalLM のような HuggingFace のモデル固有クラスを利用することを目指しています。
  • LLMSB が収集するのは、一般的で高レベルなメトリクスのみです。将来的には、より低レベルのメトリクスも収集したいと考えています。これは、PyTorch の profiler ラッパー を使うことで一部実現できると考えています。

サンプル出力

2023年11月22日

LLMSB は RunPod を通じて L40 および H100 GPU 上で実行/テストされました。これらのベンチマークでは、llama-2-7b-hfcodellama-13b-oasst-sft-v10、および mpt-7b がテストされました。結果は HERE で確認できます。何かエラー/問題に気づいた場合は、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 をインストールします

    # CUDA 12.1 を使用して、Linux 用の安定版 PyTorch をインストール:
    pip3 install torch torchvision torchaudio
    
  5. LLM-VM をインストールします:

    pip install llm-vm
    
  6. (任意)LLAMA のようなモデルを使用する場合は、HuggingFace のアクセストークンが必要になります。アクセストークンを HERE で設定し、次のコマンドを実行してコンソールにトークンを保存します。

    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モデルの temperature 
      "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つを選択):

    # 1回ベンチマークを実行
    python3 run.py --config ./configs/llmvm_test.json
    
    # 1回より多くベンチマークを実行(この場合は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 のコマンドを使えば、pod に ssh で接続し、その RunPod pod で選択した GPU を使用できるはずです。

  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 の使用が終わったら、停止するか一時停止します。ただし警告として、一時停止しても課金は継続されますが、かなり少なくなります。

優れた参考資料: