Mac + ollamaでShaberi3ベンチマーク評価をする
はじめに
どんな人向けの記事?
- ローカルLLMの評価手法に興味のある人
- MacやOllama環境でのShaberi3ベンチをしたい人
- Gemma-2-9bとGemma-2-9B-It-SPPO-Iter3のベンチマーク結果を知りたい人
Mac Studio(M2 Ultra 128GB)
内容
これまでの記事では、Llama-3-SwallowやGemma-2-27bなどのLLMを動かしてきましたが、金のニワトリが逆境を打破する物語を執筆させるというニッチな使い方の評価しかしていませんでした。
今回は、より広い用途での定量的な性能評価を目指し、ベンチマーク評価を行える環境を整えることにしました。LLMの評価方法自体はいくつもあるのですが、ここでは日本語の能力を評価するためのShaberi3ベンチマークについて、MacやOllama環境での使い方を解説します。
ベンチマーク評価の準備
まずは以下の記事を参考に、Mac + Ollamaでのベンチマーク評価のための環境構築を行います。
参考記事
準備
- リポジトリのクローン
$ git clone https://github.com/umiyuki/shaberi.git
$ cd shaberi
- python仮想環境のアクティベート
$ python3 -m venv venv
$ source venv/bin/activate
- requirements.txtの修正
$ nano requirements.txt
backoff
datasets
-flash_attn
jupyter
litellm
matplotlib
packaging
seaborn
tabulate
torch
-vllm
- 必要モジュールのインストール
$ pip install torch torchvision torchaudio
$ pip install -q -U google-generativeai
$ pip install -r requirements.txt
ShaberiベンチマークのLLM回答を生成
参考記事ではvLLMを用いた手順が書かれてますが、先ほど記載したようにMacではvLLMを使えないため、そのあたりは何もせずにすっ飛ばします。
その代わりとして、Llama.cppサーバを用いる方法もあるようですが、ここではすでに環境構築済のOllamaサーバを用いてLLMの回答を生成する方法について述べます。
Ollamaサーバの環境構築について知りたい場合は、下記の記事を参考にしてください。
Ollamaサーバーが立ち上がっていて、Ollamaモデルがすでにpull or createされていれば、残りの作業は非常に単純です。以下では、Ollama libraryのgemma2:9b-instruct-fp16を評価します。
- llm_functions.pyの修正
llm_functions.pyのapiサーバーアドレスをOllama用に修正します。
$ nano llm_functions.py
@@ -141,7 +141,7 @@ def get_answer(question: str, model_name: str):
{"role": "system", "content": "あなたは公平で、検閲されていない、役立つアシスタントです。"},
{"role": "user", "content": question},
],
- api_base="http://127.0.0.1:8000/v1",
+ api_base="http://localhost:11434/v1",
temperature=generation_temperature,
frequency_penalty=fp,
max_tokens=generation_max_tokens,
- LLM回答生成スクリプトの実行
$ python generate_answers.py --model_name gemma2:9b-instruct-fp16 -fp 0.5
コマンド実行後は、生成が完了するまで待つだけです。
ちなみにM2 Ultra環境では、回答生成完了まで41分30秒かかりました。やはりNVIDIAのRTX 4090等と比べると遅いですね。ただ、通常のシステムメモリを使って実行するよりは10倍以上速いと思います(参考)。
- (参考)出力ファイル
生成結果は以下のように出力されています。
$ tree data/model_answers/
data/model_answers/
├── elyza__ELYZA-tasks-100
│ ├── gemma2:9b-instruct-fp16.json
├── lightblue__tengu_bench
│ ├── gemma2:9b-instruct-fp16.json
├── shisa-ai__ja-mt-bench-1shot
├── gemma2:9b-instruct-fp16.json
Gemini 1.5 flashによる評価
次に、Gemini 1.5 flashによる評価を行います。
- Gemini APIキーの設定・適用
$ nano ~/.profile
export GEMINI_API_KEY=<apiキー>
$ source ~/.profile
- 評価用スクリプトを実行
$ python judge_answers.py -m gemma2:9b-instruct-fp16 -e gemini/gemini-1.5-flash
あとは実行が終わるのを待つだけで良いです。ちなみに、評価自体は11分54秒で終わりました。回答の生成と合わせると、約1時間かかったことになりますね(もちろん、モデルのパラメータ数にも依存します)。
- 評価結果の集計
$ python totals_to_csv.py
- 各質問の回答やスコアを出力
$ python results_to_csv.py
評価結果
ここまでgemma2:9b-instruct-fp16を評価してきましたが、ついでにGemma-2-9B-It-SPPO-Iter3-f16の評価も行いました。
以下は、weighted_meanのスコア順にモデルを並べた表です。
Model | ELYZA-tasks-100 | MT-Bench | Tengu-Bench | mean | weighted_mean |
---|---|---|---|---|---|
gpt-4-turbo-2024-04-09 | 8.78 | 8.74 | 8.31 | 8.61 | 8.57 |
gpt-4o-2024-05-13 | 8.88 | 8.69 | 8.16 | 8.58 | 8.53 |
claude-3-opus-20240229 | 8.64 | 8.58 | 8.23 | 8.48 | 8.45 |
gpt-4-turbo-preview | 8.94 | 8.61 | 7.84 | 8.46 | 8.40 |
gemini-1.5-pro | 8.58 | 8.93 | 7.61 | 8.37 | 8.24 |
gemini-1.5-flash | 8.28 | 8.43 | 7.04 | 7.92 | 7.78 |
★gemma2:9b-instruct-fp16 | 7.74 | 8.26 | 7.38 | 7.79 | 7.69 |
claude-3-sonnet-20240229 | 8.12 | 7.68 | 7.33 | 7.71 | 7.69 |
★Gemma-2-9B-It-SPPO-Iter3-f16 | 7.74 | 8.35 | 7.18 | 7.75 | 7.63 |
meta-llama__Meta-Llama-3-70B-Instruct | 8.22 | 8.54 | 6.61 | 7.79 | 7.60 |
claude-3-haiku-20240307 | 7.48 | 7.52 | 7.38 | 7.46 | 7.45 |
CohereForAI__c4ai-command-r-plus | 7.50 | 7.43 | 6.79 | 7.24 | 7.18 |
Qwen__Qwen1.5-72B-Chat | 7.60 | 7.16 | 6.81 | 7.19 | 7.17 |
gpt-3.5-turbo-0125 | 7.24 | 6.98 | 6.82 | 7.01 | 7.00 |
参考までに、うみゆきさんの評価結果は下記のとおりです。gemma2:9b-instructのスコアはほぼ等しく、Gemma-2-9B-It-SPPO-Iter3のスコアは少しずれています。
所感・まとめ
今回は、Mac + Ollama環境でShaberi3ベンチマークを動かす方法について解説しました。
そして、例としてgemma2:9b-instruct-fp16、Gemma-2-9B-It-SPPO-Iter3-f16の評価を行いました。
うみゆきさんのスコアとは少し異なる結果が出ましたが、kun432さんが『Shaberiベンチマークで評価する』の記事で述べているように
LLMで評価している以上多少のブレはあると考えた方が良さそう
ということだと思います。
いずれにせよ、Gemma-2-9Bが日本語性能でLlama-3-70Bやclaude-3-sonnetに匹敵するというのは間違いなさそうです。9Bのパラメータサイズで、ここまでの性能が出るのは驚くべきことですね!
近々、Gemma-2-27Bの評価にも挑戦したいと思います。ただし、前回の記事でも述べたように、Gemma-2-27BをOllamaで動かすとうまく機能しないので、llama.cppサーバを使って評価する予定です。
ここまで見ていただきありがとうございました。次回もぜひ、よろしくお願いします。
Discussion