LLM スピードベンチマーク
背景
私はパートタイムのエンジニアリングインターンとして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-hf、codellama-13b-oasst-sft-v10、および mpt-7b の 3 つのモデルがテストされました。結果は こちら で確認できます。エラーや問題が見つかった場合は、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 をインストールします
# install pytorch stable build, for linux, using CUDA 12.1: pip3 install torch torchvision torchaudio
-
LLM-VM をインストールします:
pip install llm-vm
-
(任意) LLAMA などのモデルを使用する場合は、HuggingFace のアクセストークンが必要です。アクセストークンを こちら で取得し、以下のコマンドでコンソールに保存してください:
huggingface-cli login
実行方法
-
セットアップ セクションに記載された手順をすべて完了させます。
-
設定ファイルを作成し、以下のパラメータを記入します(例を示します):
- 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 }
-
前ステップで作成した設定ファイルへのパスを指定し、ベンチマークを開始します(いずれかを選択):
# 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
-
ベンチマークが完了したら、以下のような名前のファイルに最終結果が出力されます:
report_2023-11-25_05:55:04.207515_utc_1ffc4fa7-3aa9-4878-b874-1ff445e1ff8a.json
RunPod の設定
-
RunPod をセットアップし、SSH 証明書/キーを設定してポッドを起動します。ポッドは 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 のコマンドを使用してポッドに SSH 接続し、選択した GPU を利用できるようになります。
-
ポッドからローカルマシンへファイルをコピーしたい場合は、次の形式でコマンドを実行します(手順 #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/
-
-
ポッドの使用が終わったら、シャットダウンまたは一時停止してください。ただし、一時停止すると料金はかかりますが、使用中よりははるかに安くなります。
参考資料
- プロンプトデータセット: awesome-chatgpt-prompts、bigscience/P3、および writing-prompts
- LLM パラメータの詳細を学ぶ
- クラウドベース LLM モデルのベンチマーク
- 優れた LLM インテリジェンスリーダーボード: FastEval と open_llm_leaderboard