見出し画像

MT-Bench の使い方

「MT-Bench」 の使い方をまとめました。

【注意】Google Colab Pro/Pro+ のA100で動作確認しています。


前回

1. MT-Bench

MT-Bench」は、80の高品質でマルチターンの質問を含む、慎重にキュレーションされたLLMのベンチマークです。これらの質問は、LLMがマルチターンダイアログのモデルの会話の流れと指示に従う能力の評価を目的としており、「一般的なユースケース」と「挑戦的な指示」の両方が含まれています。

MT-Benchのドキュメント

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]

・-h, --help : ヘルプ
・--model-path [MODEL_PATH] : モデルパス
・--model-id [MODEL_ID] : モデルのカスタム名
・--bench-name [BENCH_NAME] : ベンチマーク名
・--answer-file [ANSWER_FILE] : 回答ファイル
・--max-new-token [NUM] : 新規生成するトークン最大数
・--num-choices [NUM] : 生成するコンプリーション選択肢数
・--num-gpus-per-model [NUM] : モデル毎のGPU数
・--num-gpus-total [NUM] : GPUの合計数
・--max-gpu-memory [MEMORY] : GPU毎の最大GPUメモリ。
・--dtype {float32,float16,bfloat16} : dtype (GPU:float16、CPU:float32)

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]

・-h, --help : ヘルプ
・--bench-name [BENCH_NAME] : ベンチマーク名
・--judge-file [JUDGE_FILE] : ジャッジファイル
・--judge-model [JUDGE_MODEL] : ジャッジモデル
・--baseline-model [BASELINE_MODEL] : ベースラインモデル
・--mode {pairwise-baseline,pairwise-all,single} : 評価モード
 ・pairwise-baseline : ベースラインに対してペアごとに比較して評価
 ・pairwise-all : すべてのペア間で比較して評価
 ・single : 単一回答による評価
・--model-list MODEL_LIST [MODEL_LIST ...] : 評価対象モデルのリスト
・--parallel [PARALLEL] : 同時API呼び出し数。

次のように比較する対象を複数指定できます。

!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

・writing (テキスト生成) : 10問、2ターン
・roleplay (ロールプレイ) : 10問、2ターン
・reasoning (推論) : 10問、2ターン、参照回答あり
・math (計算問題) : 10問、2ターン、参照回答あり
・coding (コード生成) : 10問、2ターン、参照回答あり
・extraction (情報抽出) : 10問、2ターン
・stem (知識 I) : 10問、2ターン
・humanities (知識 II) : 10問、2ターン

・ジャッジファイル (入力)
fastchat/llm_judge/data/judge_prompts.jsonl

・single-v1 : 参照回答なし、シングルターン
・single-v1-multi-turn
: 参照回答なし、マルチターン
・single-math-v1 : 参照回答あり、シングルターン
・single-math-v1-multi-turn
: 参照回答あり、マルチターン
・pair-v2
: 参照回答なし、シングルターン
・pair-v2-multi-turn
: 参照回答なし、マルチターン
・pair-math-v1
: 参照回答あり、シングルターン
・pair-math-v1-multi-turn
: 参照回答あり、マルチターン

・参照回答として利用する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]

・gpt-3.5-turbo, gpt-4 など
・claude-1, claude-2, claude-instant-1
・palm-2-chat-bison-001

・ベースラインに対してペアごとに比較して評価

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

関連

Stability AI の Japanese MT-Bench

次回



この記事が気に入ったらサポートをしてみませんか?