llm-jp-evalを試す
llm-jp-evalとは
llm-jp-evalとはLLM-JP(LLM勉強会)で作成された複数のデータセットから大規模言語モデルの評価を手軽に行うことができるリポジトリである。
v1.0.0では以下のNLPのタスクが評価できる。
- MC(Multi-Choice QA):jcommonsenseqa
- NLI(Natural Language Inference):jamp、janli、jnli、jsem、jsick
- QA(Question Answering):jemhopqa、niilc
- RC(Reading Comprehension):jsquad
v1.1.0では上記の評価に加えて以下が追加されている(ELとFAの正式名称が分からない…)。
- EL:chabsa
- FA:wiki
本記事では2023年12月31日現在の最新版であるv1.1.0を試してみる。
環境構築
環境構築はREADMEの手順に従ってpipを使用して行う。
インストール
- llm-jp-evalのインストール
git clone -b v1.1.0 https://github.com/llm-jp/llm-jp-eval.git
cd llm-jp-eval
pip install .
- configファイルをテンプレートからコピー
cp configs/config_template.yaml configs/config.yaml
評価データセットのダウンロードと前処理
python scripts/preprocess_dataset.py \
--dataset-name all \
--output-dir eval_dataset \
--version-name dataset_version_name \
評価
今回はお試しということでllm-jp/llm-jp-1.3b-v1.0を使用して評価を試してみる。
config.yamlの編集
config.yamlはllm-jp/llm-jp-1.3b-v1.0を使用する場合は、テンプレートからdataset_dirさえ変更すれば正常に動作します。
その他の設定は評価対象のデータ等に合わせて変更する。詳しくはREADMEのその他のオプションを参照。
defaults:
- model: llm-jp_llm-jp-1.3b-v1.0.yaml
- _self_
# basic information
tokenizer:
pretrained_model_name_or_path: "llm-jp/llm-jp-1.3b-v1.0"
use_fast: false
max_seq_length: 2048
dataset_dir: "./eval_dataset/dataset_version_name/evaluation/test"
target_dataset: "all" # {all, jamp, janli, jcommonsenseqa, jemhopqa, jnli, jsem, jsick, jsquad, jsts, niilc, chabsa}
log_dir: "./logs"
torch_dtype: "bf16" # {fp16, bf16, fp32}
custom_prompt_template: null
# if you use this, please include {instruction} and {input}. If you use few shots, please include {few_shots_text} additionally.
# example of prompt template for few-shots
# "以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。\n\n### 指示:\n{instruction}{few_shots_text}\n\n### 入力:\n{input}\n\n### 応答:\n"
# example of prompt template for zeroshot
# "以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。\n\n### 指示:\n{instruction}\n\n### 入力:\n{input}\n\n### 応答:\n"
custom_fewshots_template: null
# Please include {input} and {output}
# example of few-shots template
# "\n\n### 入力:\n{input}\n\n### 応答:\n{output}"
wandb:
log: false # true for logging WANDB in evaluate_llm.py
entity: "your/WANDB/api/entity"
project: "your/WANDB/api/project"
run_name: "run name" # use run_name defined above
metainfo:
version: "1.1.0"
model_name: "llm-jp/llm-jp-1.3b-v1.0"
model_type: "llm-jp" # {llm-jp, external model, ...}
instruction_tuning_method_by_llm_jp: "None" # {"None", "Full", "LoRA", ...}
instruction_tuning_data_by_llm_jp: ["None"] # {"None", "jaster", "dolly_ja", "oasst_ja", ...}
data_type: "dev" # {"dev", "test"}
num_few_shots: 4
max_num_samples: 100 # -1 for all data
generator:
top_p: 1.0
#top_k: 0
#temperature: 0.1
repetition_penalty: 1.0
# hydra settings
hydra:
job:
env_set:
TOKENIZERS_PARALLELISM: false
評価の実行
以下のコマンドで評価を行う。
python scripts/evaluate_llm.py -cn config.yaml
評価完了後、config.yamlで指定した出力ログレクトリに以下のようなログファイルが出力される。
rinna/japanese-gpt2-smallだとモデルが小さいこともあり評価はあまり良くないですね。
{
"scores": {
"AVR": "0.2086",
"EL": "0.0792",
"FA": "0.0714",
"MC": "0.1400",
"NLI": "0.3340",
"QA": "0.2845",
"RC": "0.3426",
"chabsa_set_f1": "0.0792",
"jamp_exact_match": "0.3600",
"janli_exact_match": "0.5000",
"jcommonsenseqa_exact_match": "0.1400",
"jemhopqa_char_f1": "0.3115",
"jnli_exact_match": "0.6100",
"jsem_exact_match": "0.0000",
"jsick_exact_match": "0.2000",
"jsquad_char_f1": "0.3426",
"jsts_pearson": "0.0000",
"jsts_spearman": "0.0000",
"niilc_char_f1": "0.2575",
"wiki_coreference_set_f1": "0.0129",
"wiki_dependency_set_f1": "0.0824",
"wiki_ner_set_f1": "0.0000",
"wiki_pas_set_f1": "0.0047",
"wiki_reading_char_f1": "0.2570"
},
-------------------------------------------------------
以下略
-------------------------------------------------------
TODO
llm-jp/llm-jp-1.3b-v1.0のモデルをrinna/japanese-gpt2-smallに変えてみたところ、wiki_readingとwiki_dependencyのタスクが正常に計測できない。
wiki_readingはoutput_lengthを256に設定することでエラーは回避できる。
正常に計測できる方法を調査する。
output_lengthの変更
wiki_readingのデフォルトのoutput_lengthは512に設定されているのだが、私の環境ではこれだと正常に動作しなかったため256似変更している。
output_lengthはeval_dataset/dataset_version_name/evaluation/test/wiki_reading.jsonから変更が可能である。
{
"instruction": "与えられたテキストを全てひらがなに変換してください。",
"output_length": 256,
"metrics": [
"char_f1"
],
-------------------------------------------------------
以下略
-------------------------------------------------------
Discussion