MT-Bench の使い方
「MT-Bench」 の使い方をまとめました。
前回
1. MT-Bench
「MT-Bench」は、80の高品質でマルチターンの質問を含む、慎重にキュレーションされたLLMのベンチマークです。これらの質問は、LLMがマルチターンダイアログのモデルの会話の流れと指示に従う能力の評価を目的としており、「一般的なユースケース」と「挑戦的な指示」の両方が含まれています。
2. インストール
Colabでのインストール手順は、次のとおりです。
(1) パッケージのインストール。
!git clone https://github.com/lm-sys/FastChat
%cd FastChat
!pip install -e ".[model_worker,webui]"
!pip install openai anthropic
!pip install plotly kaleido
(2) 環境変数の準備。
以下のコードの <OpenAI_APIのトークン> にはOpenAI APIのトークンを指定します。(有料)
# 環境変数の準備
import os
os.environ["OPENAI_API_KEY"] = "<OpenAI_APIのトークン>"
(3) mt-benchのフォルダ (llm_judge) に移動。
%cd fastchat/llm_judge/
3. 質問に対する回答の生成
「gen_model_answer.py」でMT-Benchの質問に対する回答を生成します。
(1) 「gen_model_answer.py」の実行。
今回は、「lmsys/vicuna-7b-v1.5」で回答を生成しました。
!python gen_model_answer.py --model-path lmsys/vicuna-7b-v1.5 --model-id vicuna-7b-v1.5
回答は「data/mt_bench/model_answer/vicuna-7b-v1.5.jsonl」に出力されます。時間は22分ほどかかりました。
コマンドの書式は、次のとおりです。
!python gen_model_answer.py --model-path [MODEL-PATH] --model-id [MODEL-ID]
FastChat が正しいプロンプトテンプレートを読み込むことを確認するには、
ここでサポートされているモデルと新しいモデルを追加する方法を参照してください。
モデルの並列処理 (大規模な65Bモデルに必要) には --num-gpus-per-model、複数のGPU で応答生成を並列化するには --num-gpus-total を指定することもできます。
4. 回答に対する評価の生成
「gen_judgment.py」で、回答に対するGPT-4による評価を生成します。「単一回答」(デフォルト)や「ペアごとの勝率」など、いくつかのオプションがあります。
(1) 「gen_judgment.py」の実行。
!python gen_judgment.py --model-list vicuna-7b-v1.5 --parallel 2
Stats:
{
"bench_name": "mt_bench",
"mode": "single",
"judge": "gpt-4",
"baseline": null,
"model_list": [
"vicuna-7b-v1.5"
],
"total_num_questions": 80,
"total_num_matches": 160,
"output_path": "data/mt_bench/model_judgment/gpt-4_single.jsonl"
}
Press Enter to confirm...
(2) 「Press Enter to confirm...」が表示されたら設定を確認してENTER。
評価は「data/mt_bench/model_judgment/gpt-4_single.jsonl」に出力されます。時間は25分ほどかかりましたGPT-4の使用料金は$4.78ほどかかりました。
コマンドの書式は、次のとおりです。
!python gen_judgment.py --model-list [LIST-OF-MODEL-ID] --parallel [num-concurrent-api-call]
次のように比較する対象を複数指定できます。
!python gen_judgment.py --model-list vicuna-13b-v1.3 alpaca-13b llama-13b claude-v1 gpt-3.5-turbo gpt-4 --parallel 2
5. MT-Benchのスコアの表示
「show_result.py」で、MT-Benchのスコアを表示します。
(1) 「show_result.py」の実行。
スコアが出力されます。
!python show_result.py --model-list vicuna-7b-v1.5
Mode: single
Input file: data/mt_bench/model_judgment/gpt-4_single.jsonl
########## First turn ##########
score
model turn
vicuna-7b-v1.5 1 6.6
########## Second turn ##########
score
model turn
vicuna-7b-v1.5 2 5.45
########## Average ##########
score
model
vicuna-7b-v1.5 6.025
6. レーダーチャートのプロット
レーダーチャートをプロットします。詳しい手順はこのColabが参考になります。
(1) 評価をDataFrameとして読み込み。
import json
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
CATEGORIES = ["Writing", "Roleplay", "Reasoning", "Math", "Coding", "Extraction", "STEM", "Humanities"]
def get_model_df():
cnt = 0
q2result = []
fin = open("data/mt_bench/model_judgment/gpt-4_single.jsonl", "r")
for line in fin:
obj = json.loads(line)
obj["category"] = CATEGORIES[(obj["question_id"]-81)//10]
q2result.append(obj)
df = pd.DataFrame(q2result)
return df
df = get_model_df()
(2) スコアの計算。
all_models = df["model"].unique()
print(all_models)
scores_all = []
for model in all_models:
for cat in CATEGORIES:
res = df[(df["category"]==cat) & (df["model"]==model) & (df["score"] >= 0)]
score = res["score"].mean()
scores_all.append({"model": model, "category": cat, "score": score})
(3) レーダーチャートの表示。
target_models = ["vicuna-7b-v1.5"]
scores_target = [scores_all[i] for i in range(len(scores_all)) if scores_all[i]["model"] in target_models]
# sort by target_models
scores_target = sorted(scores_target, key=lambda x: target_models.index(x["model"]), reverse=True)
df_score = pd.DataFrame(scores_target)
df_score = df_score[df_score["model"].isin(target_models)]
rename_map = {"vicuna-7b-v1.5": "Vicuna-7B",}
for k, v in rename_map.items():
df_score.replace(k, v, inplace=True)
fig = px.line_polar(df_score, r = 'score', theta = 'category', line_close = True, category_orders = {"category": CATEGORIES},
color = 'model', markers=True, color_discrete_sequence=px.colors.qualitative.Pastel)
fig.show()
【おまけ】 入出力ファイル
・質問ファイル (入力)
fastchat/llm_judge/data/mt_bench/question.jsonl
・ジャッジファイル (入力)
fastchat/llm_judge/data/judge_prompts.jsonl
・参照回答として利用するGPT-4の回答ファイル (入力)
fastchat/llm_judge/data/mt_bench/model_reference/gpt-4.jsonl
・回答ファイル (出力)
fastchat/llm_judge/data/mt_bench/model_answer/vicuna-7b-v1.5.jsonl
・評価ファイル (出力)
fastchat/llm_judge/data/mt_bench/model_judgment/gpt-4_single.jsonl
【おまけ】 その他の操作
・GPT-3.5/GPT-4/Claudeでの回答の取得
!python gen_api_answer.py --model [MODEL-NAME]
・ベースラインに対してペアごとに比較して評価
「pairwise-baseline」での評価生成コマンドは、次のとおりです。デフォルトで「gpt-3.5-turbo」を使います。
!python gen_judgment.py --mode pairwise-baseline --model-list vicuna-13b-v1.3 alpaca-13b llama-13b --parallel 2
結果は data/mt_bench/model_judgment/gpt-4_pair.jsonl に保存されます。
!python show_result.py --mode pairwise-baseline
・すべてのペア間で比較して評価
「pairwise-all」での評価生成コマンドは、次のとおりです。モデルが増えるとコストが高くなりますが、より包括的な情報が得られます。
!python gen_judgment.py --mode pairwise-all --model-list [LIST-OF-MODEL-ID] --parallel [num-concurrent-api-call]
!python show_result.py --mode pairwise-all
関連
次回
この記事が気に入ったらサポートをしてみませんか?