Shaberiベンチマークで評価する
自分はうみゆきさんのを評価用LLMにGemini 1.5 Flashを使うフォークを使った。
ローカルで。Python仮想環境は適宜用意しておく。
レポジトリクローン
$ git clone https://github.com/umiyuki/shaberi && cd shaberi
パッケージインストールしていく。自分の環境はpython-3.11.4(pyenv)+CUDA-12.1で、torchはrequirements.txtに含まれているので、明示的にインストールをしなかった。追加でwheelのインストールは別途必要だった。
$ pip install wheel
$ pip install -r requirements.txt
$ pip install google-generativeai
モデルの準備。今回は以下を使ってみる。
自分は既にダウンロード済み(/data/Llama-3-ELYZA-JP-8B
にあるものとする)なのでそれを使う。チャットテンプレートの作成。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda"
tokenizer = AutoTokenizer.from_pretrained("/data/Llama-3-ELYZA-JP-8B", trust_remote_code=True)
print(tokenizer.default_chat_template)
実行する。
$ cd chat_templates
$ python get_chattemplate_Llama-3-ELYZA-JP-8B.py
以下のように表示される。とりあえずいけてそ?
{% for message in messages %}{{'<|im_start|>' + message['role'] + '
' + message['content'] + '<|im_end|>' + '
'}}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant
' }}{% endif %}
これをファイルに出力する。
$ python get_chattemplate_Llama-3-ELYZA-JP-8B.py > Llama-3-ELYZA-JP-8B.jinja
確認してみる。
$ python jinja_test.py Llama-3-ELYZA-JP-8B.jinja
以下のように表示される。進める。
<|im_start|>user
まどか☆マギカで一番可愛いキャラは?<|im_end|>
<|im_start|>assistant
ではvLLMでOpenAI互換APIサーバを立ち上げる。細かいパラメータはよくわかってないけど記述どおりにした。
$ python -m vllm.entrypoints.openai.api_server \
--model /data/Llama-3-ELYZA-JP-8B \
--chat-template Llama-3-ELYZA-JP-8B.jinja \
--trust-remote-code \
--gpu-memory-utilization 0.9 \
--max-model-len 4096
これはこのままにしておいて、別ターミナルを開いてクローンしたディレクトリのトップに移動。以下を実行して、LLMに回答を生成させる。
$ python generate_answers.py --model_name /data/Llama-3-ELYZA-JP-8B -fp 0.5
エラー等なく完了したらdata/model_answers
を見てみる。
$ find data -type f -name "*Llama-3-ELYZA-JP-8B*"
data/model_answers/shisa-ai__ja-mt-bench-1shot/__data__Llama-3-ELYZA-JP-8B.json
data/model_answers/elyza__ELYZA-tasks-100/__data__Llama-3-ELYZA-JP-8B.json
data/model_answers/lightblue__tengu_bench/__data__Llama-3-ELYZA-JP-8B.json
なるほど、ここに各評価用データセットでの生成結果が出力される。モデルへの指定の仕方でファイル名が決まるっぽい。
生成が完了したらGeminiで評価を行うが、評価結果出力先に、フォーク元の過去の評価結果が含まれているらしいので削除しておく。
$ rm -rf data/judgements/judge_gpt-4-turbo-preview
ではGeminiによる評価を実行する。APIキーについては自分はもう直接環境変数を指定した。では実行する。
$ export GOOGLE_API_KEY=XXXXXXXXXXX python judge_answers.py -m /data/Llama-3-ELYZA-JP-8B -e gemini/gemini-1.5-flash
のだが、API key not valid. Please pass a valid API key
となってしまう。。。APIキー自体はColaboratoryあたりで使っているものなので使えないということはないはず。。。
コードを見てみたところ、LiteLLM経由で送っているようなので、LiteLLMのドキュメントを調べてみたところ、どうも環境変数名はGEMINI_API_KEY
で指定する必要があるようだった。
ということで書き換えて再度評価を実行。
$ export GEMINI_API_KEY=XXXXXXXXXXX python judge_answers.py -m /data/Llama-3-ELYZA-JP-8B -e gemini/gemini-1
今度はOKだった。結果は以下のように出力されている。
$ tree data/judgements/
data/judgements/
└── judge_gemini__gemini-1.5-flash
├── elyza__ELYZA-tasks-100
│ └── __data__Llama-3-ELYZA-JP-8B.json
├── lightblue__tengu_bench
│ └── __data__Llama-3-ELYZA-JP-8B.json
└── shisa-ai__ja-mt-bench-1shot
└── __data__Llama-3-ELYZA-JP-8B.json
評価結果を集計する。
$ python totals_to_csv.py
設問ごとの出力やスコアは以下でCSVに出力される。
$ python results_to_csv.py
集計結果が出力される。
それぞれresults
ディレクトリ配下に出力される。totals.csvが集計結果で、もう一つが設問ごとのCSVとなっている。
$ tree results
results
├── __data__Llama-3-ELYZA-JP-8B_output.csv
└── totals.csv
totals.csvはこんな感じ。
$ cat results/totals.csv
,MT-Bench,ELYZA-tasks-100,Tengu-Bench,mean,weighted_mean
__data__Llama-3-ELYZA-JP-8B,7.019230769230769,7.24,6.783333333333333,7.014188034188034,6.996978021978022
氷にまとめるとこう。小数点第2位以下は四捨五入した。
モデルサイズ | MT-Bench | ELYZA-tasks-100 | Tengu-Bench | 平均 | 重み付け平均 |
---|---|---|---|---|---|
8B | 7.02 | 7.24 | 6.78 | 7.01 | 7.00 |
うみゆきさんのスコアとは少し開きが出た結果となってしまった。
再度評価だけ回してみた。
2回目
モデルサイズ | MT-Bench | ELYZA-tasks-100 | Tengu-Bench | 平均 | 重み付け平均 |
---|---|---|---|---|---|
8B | 6.74 | 7.24 | 6.79 | 6.92 | 6.94 |
3回目
モデルサイズ | MT-Bench | ELYZA-tasks-100 | Tengu-Bench | 平均 | 重み付け平均 |
---|---|---|---|---|---|
8B | 6.81 | 7.24 | 6.75 | 6.93 | 6.94 |
LLMで評価している以上多少のブレはあると考えた方が良さそう。あと、チャットテンプレートもちゃんと確認できていない気もするし、その辺りも見直して再度生成から実行しなおしたら多少変わってきそうな気もする。
LLMによる自動評価はそのあたりを念頭に置いたうえで使えば、共通的な指標になると思うので、使い所を意識したいところ。
思いの外大変だったけども、これ全部イチから組むとなるとホント大変・・・・ここまで整理できているだけでほんとありがたい。