ローカルLLMモデルのベンチマーク
背景
私は、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-hf、codellama-13b-oasst-sft-v10、および mpt-7b がテストされました。結果は HERE で確認できます。何かエラー/問題に気づいた場合は、ISSUES に報告してください。
セットアップ
-
Python 環境を作成して有効化します。
python3 -m venv env source env/bin/activate -
パッケージ依存関係をインストールします(APT を使用):
apt -y update apt install -y vim apt install -y neofetch -
Python 依存関係をインストールします:
pip3 install transformers pip3 install psutil pip3 install gputil pip3 install tabulate pip3 install sentencepiece pip3 install protobuf -
Pytorch をインストールします
# CUDA 12.1 を使用して、Linux 用の安定版 PyTorch をインストール: pip3 install torch torchvision torchaudio -
LLM-VM をインストールします:
pip install llm-vm -
(任意)LLAMA のようなモデルを使用する場合は、HuggingFace のアクセストークンが必要になります。アクセストークンを HERE で設定し、次のコマンドを実行してコンソールにトークンを保存します。
huggingface-cli login
実行方法
-
セットアップ セクションに記載された手順を完了します。
-
セットを設定するには、次のパラメータを持つ 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" # モデルの実行に使用したいフレームワーク/ライブラリ名 } -
前の手順で作成した設定ファイルへのパスを使用して、ベンチマークを開始するには以下を実行します(いずれか1つを選択):
# 1回ベンチマークを実行 python3 run.py --config ./configs/llmvm_test.json # 1回より多くベンチマークを実行(この場合は3回) python3 run.py --config ./configs/llmvm_test.json --loops 3 -
ベンチマークの実行が完了したら、次のような名前のファイルにある最終結果を確認します。
report_2023-11-25_05:55:04.207515_utc_1ffc4fa7-3aa9-4878-b874-1ff445e1ff8a.json
RunPod の設定:
-
RunPod を設定し、ssh 証明書/鍵を設定して、pod を起動します。pod には RunPod のコンソールページ からアクセスできます。
-
「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>
-
-
手順 #2 のコマンドを使えば、pod に ssh で接続し、その RunPod pod で選択した GPU を使用できるはずです。
-
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/
-
-
pod の使用が終わったら、停止するか一時停止します。ただし警告として、一時停止しても課金は継続されますが、かなり少なくなります。
優れた参考資料:
- プロンプトデータセット: awesome-chatgpt-prompts、bigscience/P3、および writing-prompts
- LLM パラメータについてさらに学ぶ
- クラウドベースの LLM モデルをベンチマークするのに優れたベンチマーク
- かっこいい LLM インテリジェンスのリーダーボード: FastEval および open_llm_leaderboard