|
--- |
|
base_model: None |
|
tags: |
|
- generated_from_trainer |
|
--- |
|
|
|
# モデル概要 |
|
|
|
0.3Bクラスの日本語LLM([Mistralモデル](https://huggingface.co/docs/transformers/main/en/model_doc/mistral))をフルスクラッチ開発しました. |
|
|
|
# 使用方法 |
|
|
|
```python |
|
import torch |
|
from transformers import AutoTokenizer, AutoModelForCausalLM |
|
import os |
|
|
|
MODEL_NAME = "asaoka/japanese-mistral-300m-clone" |
|
torch.set_float32_matmul_precision('high') |
|
|
|
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
|
print(device) |
|
|
|
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, use_fast=False, trust_remote_code=True) |
|
model = AutoModelForCausalLM.from_pretrained(MODEL_NAME, trust_remote_code=True).to(device) |
|
|
|
MAX_ASSISTANT_LENGTH = 100 |
|
MAX_INPUT_LENGTH = 128 |
|
INPUT_PROMPT = r'<s>\n以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。\n[SEP]\n指示:\n{instruction}\n[SEP]\n入力:\n{input}\n[SEP]\n応答:\n' |
|
NO_INPUT_PROMPT = r'<s>\n以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\n[SEP]\n指示:\n{instruction}\n[SEP]\n応答:\n' |
|
|
|
def prepare_input(instruction, input_text): |
|
if input_text != "": |
|
prompt = INPUT_PROMPT.format(instruction=instruction, input=input_text) |
|
else: |
|
prompt = NO_INPUT_PROMPT.format(instruction=instruction) |
|
return prompt |
|
|
|
def format_output(output): |
|
output = output.lstrip("<s>").rstrip("</s>").replace("[SEP]", "").replace("\\n", "\n") |
|
return output |
|
|
|
def generate_response(instruction, input_text): |
|
prompt = prepare_input(instruction, input_text) |
|
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt") |
|
n = len(token_ids[0]) |
|
|
|
with torch.no_grad(): |
|
output_ids = model.generate( |
|
token_ids.to(model.device), |
|
min_length=n, |
|
max_length=min(MAX_INPUT_LENGTH, n + MAX_ASSISTANT_LENGTH), |
|
top_p=0.95, |
|
top_k=50, |
|
temperature=0.4, |
|
do_sample=True, |
|
no_repeat_ngram_size=2, |
|
num_beams=3, |
|
pad_token_id=tokenizer.pad_token_id, |
|
bos_token_id=tokenizer.bos_token_id, |
|
eos_token_id=tokenizer.eos_token_id, |
|
bad_words_ids=[[tokenizer.unk_token_id]] |
|
) |
|
|
|
output = tokenizer.decode(output_ids.tolist()[0]) |
|
formatted_output_all = format_output(output) |
|
response = f"Assistant:{formatted_output_all.split('応答:')[-1].strip()}" |
|
|
|
return formatted_output_all, response |
|
|
|
instruction = "あなたは何でも正確に答えられるAIです。" |
|
questions = [ |
|
"日本で一番高い山は?", |
|
"日本で一番広い湖は?", |
|
"世界で一番高い山は?", |
|
"世界で一番広い湖は?", |
|
"冗談を言ってください。", |
|
] |
|
|
|
# 各質問に対して応答を生成して表示 |
|
for question in questions: |
|
formatted_output_all, response = generate_response(instruction, question) |
|
print(response) |
|
``` |
|
|
|
使用方法は,[ce-lery/japanese-mistral-300m-instruction](https://huggingface.co/ce-lery/japanese-mistral-300m-instruction)を参照しました. |
|
|
|
# トレーニング |
|
|
|
### 1. 事前学習パイプライン |
|
|
|
- 学習データ |
|
- [CC-100データセット(Japanese)](http://data.statmt.org/cc-100/)(展開後のサイズ:70.9 GB) |
|
- [Wikipediaデータセット(jawiki-latest-pages-articles.xml.bz2)](https://dumps.wikimedia.org/jawiki/latest/)(展開後のサイズ:16.2 GB) |
|
|
|
- データ前処理 |
|
- トークナイザー学習 |
|
- 事前学習 |
|
|
|
データ前処理・トークナイザー学習・事前学習は,[ce-lery/japanese-mistral-300m-base](https://huggingface.co/ce-lery/japanese-mistral-300m-base)を参照しました. |
|
|
|
### 2. ファインチューニング・パイプライン |
|
|
|
- 学習データ |
|
- [databricks-dolly-15k-ja](https://huggingface.co/datasets/kunishou/databricks-dolly-15k-ja)(データサイズ:17.1 MB) |
|
|
|
- データ前処理 |
|
- インストラクションチューニング |
|
|
|
データ前処理・インストラクションチューニングは,[ce-lery/japanese-mistral-300m-instruction](https://huggingface.co/ce-lery/japanese-mistral-300m-instruction)を参照しました. |
|
|
|
# JGLUEスコア |
|
|
|
| タスク | スコア | |
|
|:-|:-| |
|
| jsquad-1.2-0.6(exact_match/f1) | 0.0/0.8599 | |
|
| marc_ja-1.1-0.6(acc) | 0.8428 | |
|
| jcommonsenseqa-1.1-0.6(acc) | 0.2672 | |
|
| jnli-1.3-0.6(acc) | 0.2482 | |
|
|
|
[JGLUEスコア](https://aclanthology.org/2022.lrec-1.317/)は,Stability AI社の[lm-evaluation-harness](https://github.com/Stability-AI/lm-evaluation-harness)を用いて |
|
算出しました.JGLUEスコアの算出に用いたスクリプトを下記に示します. |
|
|
|
```bash |
|
python main.py \ |
|
--model hf-causal-experimental \ |
|
--model_args "pretrained=asaoka/japanese-mistral-300m-clone" \ |
|
--tasks jsquad-1.2-0.6,jcommonsenseqa-1.1-0.6,jnli-1.3-0.6,marc_ja-1.1-0.6 \ |
|
--num_fewshot 2,3,3,3 \ |
|
--device cuda \ |
|
--output_path "./results.json" |
|
``` |
|
|