Closed2

Shaberiベンチマークで評価する

kun432kun432

https://github.com/shisa-ai/shaberi

自分はうみゆきさんのを評価用LLMにGemini 1.5 Flashを使うフォークを使った。

https://soysoftware.sakura.ne.jp/archives/3949

ローカルで。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

モデルの準備。今回は以下を使ってみる。

https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B

自分は既にダウンロード済み/data/Llama-3-ELYZA-JP-8Bにあるものとする)なのでそれを使う。チャットテンプレートの作成。

chat_templates/get_chattemplate_Llama-3-ELYZA-JP-8B.py
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で指定する必要があるようだった。

https://litellm.vercel.app/docs/providers/gemini

ということで書き換えて再度評価を実行。

$ 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

うみゆきさんのスコアとは少し開きが出た結果となってしまった。

https://twitter.com/umiyuki_ai/status/1805846641687359562

再度評価だけ回してみた。

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による自動評価はそのあたりを念頭に置いたうえで使えば、共通的な指標になると思うので、使い所を意識したいところ。

kun432kun432

思いの外大変だったけども、これ全部イチから組むとなるとホント大変・・・・ここまで整理できているだけでほんとありがたい。

このスクラップは6ヶ月前にクローズされました