- このリポジトリではSwallowプロジェクトによる大規模言語モデル;Swallowシリーズのリリースに用いた評価スクリプトを公開しています。 再現実験などにご利用ください。
- 本文書では評価スクリプトの実行方法のみを説明します。評価方法や結果はSwallowプロジェクトの評価ページや論文発表を参照ください。
- 評価スクリプトは、基本的には llm-jp-eval などの既存のLLM評価フレームワークを使用しています。 この場をお借りしてフレームワーク開発者の皆様にお礼申し上げます。
- 推論型モデルを含む事後学習済みモデルの評価をお考えの方は swallow-evaluation-instruct をご検討ください.
- 実行環境の違いにより、異なる評価結果になる場合があります。
- 評価がうまくいかないなど問題があればIssueまでお願いします。
- 以前のバージョンをご利用になりたい方はReleasesを参照してください。
- バージョン: llm-jp-eval v1.3.0 [Han+, ANLP24]
- ライセンス: Copyright 2023 LLM-jp, Apache License Version 2.0 (LICENSE)
- バージョン: JP Language Model Evaluation Harness v0.4.2
- ライセンス: Copyright (c) 2020 EleutherAI, MIT License (LICENSE)
- 数学のベンチマークである MATH の評価を行えるようにしました。
- プロンプトは minerva_mathの 4-shot CoT プロンプトを使用しています。
- テストセットは Hendrycksら [Hendrycks+, NeurIPS21] によるオリジナルのtest split 5,000問ではなく、Lightmanらによる後続研究[Lightman+, ICLR24]で作成されたtest split 500問(いわゆる"MATH-500")を使用しています。
- 回答文生成は貪欲法で、停止条件に
I hope it is correct
を追加したほか、生成トークン数の上限を 1024 に変更しています。 - 回答スパンの抽出方法は、デフォルト実装の
The final answer is(.*?).
だけでなく\\boxed{}
も併用する方法に変更しました。
- 博士課程レベルの科学的知識や能力のベンチマークである GPQA の評価を行えるようにしました。
- プロンプトは、Meta社によるLlama3.1評価再現用のリファレンス実装 meta-llama/Llama-3.1-8B-Instruct-evals の zero-shot CoT プロンプトを使用しています。 またプロンプトと整合するように回答選択肢を抽出する正規表現を調整しました(リンク)。
- テストセットは "main" subset の448問を使用しています。
- 回答文生成は貪欲法で、生成トークン数の上限を 2048 にしています。
- バージョン: Language Model Evaluation Harness v0.3.0 (commit #9b42d41) [Gao+, 22]
- ライセンス: Copyright (c) 2020 EleutherAI, MIT License (LICENSE)
- TER (Translation Error Rate) をブートストラップ統計量から除外しました。
- 評価結果のキャッシュの保存先を指定できるようにしました。
- huggingface tokenizerを読み込む際に
trust_remote_code
に渡す値を指定できるようにしました。
- 新しいモデルに対応するために、それぞれのモデルに対応するChatTemplateの追加をしました (リンク)。
- 一つの事例に対して複数回の応答文の生成と評価を行えるようにしました。
- OpenAIのAPIを呼び出す際のretryの処理を改善しました。
- 審判(judge)を gpt-4o-2024-08-06 に変更しました(リンク)。
- 設問は Nejumi Leaderboard v3 の mtbench_ja_question:v4 (リンク) を使用しています。
ただし coding/math/reasoning の模範解答は、mtbench_ja_referenceanswer:v2 (リンク)をもとに、Swallowチームで独自に校閲・修正したものに変更しました(リンク)。 - 応答文の日本語文字率を計算する関数を追加しました(リンク)。
- バージョン: bigcode-evaluation-harness (commit #0261c52)
- ライセンス: Apache License Version 2.0 (LICENSE)
- JHumanEvalの評価を行えるようにしました (リンク)。
- プロンプト末尾の改行
n
を削除しない、いわゆる "unstripped" を使用しています。
- プロンプト末尾の改行
- MBPP-Ja の評価を行えるようにしました (リンク)。
- HumanEval / JHumanEval について、設問に対する回答率を計算する関数を追加しました (リンク)。
- バージョン: HuggingFaceH4/MATH-500, オリジナル
- ライセンス: Copyright (c) 2021 Dan Hendrycks , MIT License (LICENSE)
- 主な変更点: なし
- バージョン: idavidrein/gpqa
- ライセンス: Copyright (c) 2022 I. David Rein, MIT License (LICENSE)
- 主な変更点: なし
- バージョン: jhuman-eval
- ライセンス: Copyright (c) 2023 Kimio Kuramitsu's Laboratory, MIT License (LICENSE)
- 主な変更点: なし
- 取得元: llm-jp/mbpp-ja
- ライセンス: Copyright (c) 2024 LLM-jp, CC BY 4.0 (LICENSE)
- 主な変更点: なし
- バージョン: llm-jp-eval v1.3.0 [Han+, ANLP24]
- ライセンス: Copyright 2023 LLM-jp, Apache License Version 2.0 (LICENSE)
- 主な変更点:
- バージョン: JP Language Model Evaluation Harness v0.4.2
- ライセンス: Copyright (c) 2020 EleutherAI, MIT License (LICENSE)
- 主な変更点: なし
- バージョン: Language Model Evaluation Harness v0.3.0 (commit #9b42d41) [Gao+, 22]
- ライセンス: Copyright (c) 2020 EleutherAI, MIT License (LICENSE)
- 主な変更点:
- TER (Translation Error Rate) をブートストラップ統計量から除外しました。
- 評価結果のキャッシュの保存先を指定できるようにしました。
- huggingface tokenizerを読み込む際に
trust_remote_code
に渡す値を指定できるようにしました。
- バージョン: FastChat (commit #e86e70d0)
- ライセンス: Apache License Version 2.0 (LICENSE)
- 主な変更点:
- 新しいモデルに対応するために、それぞれのモデルに対応するChatTemplateの追加をしました (リンク)。
- 一つの事例に対して複数回の応答文の生成と評価を行えるようにしました。
- OpenAIのAPIを呼び出す際のretryの処理を改善しました。
- バージョン: bigcode-evaluation-harness (commit #0261c52)
- ライセンス: Apache License Version 2.0 (LICENSE)
- 主な変更点:
- バージョン: jhuman-eval
- ライセンス: Copyright (c) 2023 Kimio Kuramitsu's Laboratory, MIT License (LICENSE)
- 主な変更点: なし
各フレームワークに対し、別々の仮想環境を用意します。
Pythonのバージョンは3.10.14を使ってください。
python -m venv .venv_llm_jp_eval
python -m venv .venv_harness_jp
python -m venv .venv_harness_en
python -m venv .venv_bigcode
python -m venv .venv_fastchat
なお、以下の環境構築コードは、我々の計算環境においては動作検証をしておりますが、
利用される計算環境によってはバージョンが合わないことが考えられます。
その際は適宜適当なバージョンに置き換えてください。
jalm-evaluation-private/
にて
source .venv_llm_jp_eval/bin/activate
cd llm-jp-eval
pip install --upgrade pip
pip install -e .
pip install protobuf sentencepiece
pip install 'accelerate>=0.26.0'
pip install datasets==2.21.0
pip install torch==2.4.0 --index-url https://download.pytorch.org/whl/cu121
swallow-evaluation/
にて
source .venv_harness_jp/bin/activate
cd lm-evaluation-harness-jp
pip install --upgrade pip
pip install -e ".[ja]"
pip install sacrebleu sentencepiece protobuf nagisa
pip install 'accelerate>=0.26.0'
pip install datasets==2.21.0
pip install torch==2.4.0 --index-url https://download.pytorch.org/whl/cu121
swallow-evaluation/
にて
source .venv_harness_en/bin/activate
cd lm-evaluation-harness-en
pip install --upgrade pip
pip install -e ".[math]"
pip install sentencepiece==0.2.0 protobuf==5.28.3 transformers==4.46.2
pip install 'accelerate>=0.26.0'
pip install datasets==2.21.0
pip install vllm==v0.6.3.post1
pip install torch==2.4.0 --index-url https://download.pytorch.org/whl/cu121
jalm-evaluation-private/
にて
docker build -t evaluation-harness-jalm-evaluation .
source .venv_bigcode/bin/activate
cd bigcode-evaluation-harness
pip install --upgrade pip
pip install -e .
pip install sentencepiece==0.2.0 protobuf==5.28.3 transformers==4.46.2
pip install 'accelerate>=0.26.0'
pip install datasets==2.21.0
pip install vllm==v0.6.3.post1
pip install torch==2.4.0 --index-url https://download.pytorch.org/whl/cu121
swallow-evaluation/
にて
source .venv_fastchat/bin/activate
cd fastchat
pip install --upgrade pip
pip install python-dotenv pandas
pip install -e ".[model_worker,llm_judge]"
pip install vllm==v0.6.3.post1
pip install torch==2.4.0 --index-url https://download.pytorch.org/whl/cu121
pip install markdown beautifulsoup4
モデルの生成文を gpt-4o-2024-08-06 を用いて評価する(LLM-as-a-judge)ので
jalm-evaluation-private/.env
ファイルを作成し、OpenAIのAPIキーを入力する。
OPENAI_API_KEY=...
結果は
results/${MODEL_PATH}/ja/
以下に保存されます。
llm-jp-evalのREADME.mdに従い、以下のコマンドを実行してデータセットをダウンロードする
source .venv_llm_jp_eval/bin/activate
cd llm-jp-eval
python scripts/preprocess_dataset.py \
--dataset-name all \
--output-dir ./dataset
cd ../
swallow-evaluation/
にて
bash scripts/evaluate_ja_llmjp.sh $MODEL_PATH
jamp, janli, jemhopqa, jcommonsenseqa, jnli, jsem, jsick, jsquad, jsts, niilc, jmmluの評価が実行されます。
NLIタスクのbalanced accuracyを計算する
- NLIタスクデータセット(
jamp,janli,jnli,jsem,jsick
)のbalanced accuracyを計算するには./scripts/re_evaluate_nli_task.py
にllm-jp-eval
が出力したoutput_eval.json
を渡してください。 計算結果はjson形式でstdoutに出力されます。
python re_evaluate_nli_task.py --input="{output_eval.jsonのパス}" > {保存先のjsonファイルパス}
# 出力されるjsonの見本
{
"input_path": "{入力したoutput_eval.jsonのパス}",
"macro_accuracy": 0.38721748069591116, # accuracyのマクロ平均
"macro_balanced_accuracy": 0.3709781734463517, # balanced accuracyのマクロ平均
"jamp_balanced_accuracy": 0.33338203779466197, # 個別データセットのbalanced accuracy
...
}
- 多数の
output_eval.json
を一括で処理する場合は./scripts/batch_re_evaluate_nli_task.sh
を実行してください。 ただし find コマンドの対象パスをあなたのフォルダ構造に合わせて書き換えて使ってください。 計算結果はndjson形式でja_nli_task_dataset_scores.json
に出力されます。 - ndjsonファイルをtsv形式に変換したい場合は jq を使うとよいでしょう。
# ヘッダ行の生成
head -n 1 {ndjsonファイル} | jq -r 'keys_unsorted | @tsv' > output.tsv
# 各行のデータの生成
cat {ndjsonファイル} | jq -r '[.[]] | @tsv' >> output.tsv
bash scripts/evaluate_ja_xlsum.sh $MODEL_PATH
bash scripts/evaluate_ja_mgsm.sh $MODEL_PATH
bash scripts/evaluate_ja_wmt20_{enja,jaen}.sh $MODEL_PATH
結果は
results/${MODEL_PATH}/ja/${task_name}_${NUM_FEWSHOT}shot_${NUM_TESTCASE}cases/
に保存される。
- データはJHumanEvalを使用。
- few-shot数: 10
- 評価を行うにはdockerイメージのビルドが必要
bash scripts/evaluate_ja_{humaneval-unstripped,mbpp}.sh $MODEL_PATH true true
bash scripts/evaluate_ja_{humaneval-unstripped,mbpp}.sh $MODEL_PATH true false
bash scripts/evaluate_ja_{humaneval-unstripped,mbpp}.sh $MODEL_PATH false true
few-shot数: 0 (JHumanEval), 3 (MBPP Ja)
bash scripts/evaluate_ja_mt_bench.sh $MODEL_PATH $GPU_NUM
結果は
results/${MODEL_PATH}/en/
以下に保存されます。
llm-evaluation-harness
を採用- 常識推論: HellaSwag, WinoGrande, OpenBookQA
- 世界知識: TriviaQA
- 文書読解: SQuAD2
- 算術推論: GSM8K
- 数学: MATH
- 一般教養・学術知識: MMLU
- 博士課程: GPQA
本フレームワークでは評価時間の削減(評価の並列化)のために以下のようにスクリプトを分けている。
evaluate_english_general.sh
- TriviaQA, GSM8K, OpenBookQA, HellaSwag,WinoGrande, SQuAD2evaluate_english_bbh.sh
- BBHevaluate_english_gpqa.sh
- GPQAevaluate_english_mmlu.sh
- MMLUevaluate_english_math.sh
- MATH
jalm-evaluation-private/
にて
bash scripts/evaluate_english_{general,bbh,gpqa,mmlu,math}.sh $MODEL_PATH
bash scripts/evaluate_english_{humaneval-unstripped,mbpp}.sh $MODEL_PATH true true
bash scripts/evaluate_english_{humaneval-unstripped,mbpp}.sh $MODEL_PATH true false
bash scripts/evaluate_english_{humaneval-unstripped,mbpp}.sh $MODEL_PATH false true
- 全体の結果は
results/$MODEL_NAME/aggregated_result.json
に書き込まれます。 - 複数のモデルの結果を確認したい場合は、
tmp/model_list
ファイルを作成し、各モデル名を1行ずつ記入してください。その後、scripts/show_results.py
を実行すると、複数モデルの結果を一覧表示できます。