🐡

llm-jp-evalを試す

2023/12/31に公開

llm-jp-evalとは

llm-jp-evalとはLLM-JP(LLM勉強会)で作成された複数のデータセットから大規模言語モデルの評価を手軽に行うことができるリポジトリである。
https://github.com/llm-jp/llm-jp-eval

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を使用して行う。

インストール

  1. llm-jp-evalのインストール
git clone -b v1.1.0 https://github.com/llm-jp/llm-jp-eval.git
cd llm-jp-eval
pip install .
  1. 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のその他のオプションを参照。

config.yaml
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から変更が可能である。

wiki_reading.json
{
    "instruction": "与えられたテキストを全てひらがなに変換してください。",
    "output_length": 256,
    "metrics": [
        "char_f1"
    ],

-------------------------------------------------------
以下略
-------------------------------------------------------

Discussion