Overview
このモデルは、LLM-JP-3-13Bをベースに、LoRA (Low-Rank Adaptation)を利用してファインチューニングしたモデルです。
モデル詳細
- ベースモデル: llm-jp/llm-jp-3-13b
- ファインチューニング手法: LoRA (Low-Rank Adaptation)
- 量子化: 4ビット量子化 (QLoRA)
インストール
必要なパッケージのインストール: # Google Colab使用時 ※ローカル環境で実行する場合は、!を付けずにコマンドを実行してください
!pip install -U bitsandbytes
!pip install -U transformers
!pip install -U accelerate
!pip install -U datasets
!pip install -U peft
!pip install -U trl
!pip install ipywidgets --upgrade
使用方法
セットアップから推論まで
1.必要なライブラリのインポート:
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
BitsAndBytesConfig,
)
from peft import PeftModel
import torch
from datasets import load_dataset
import json
from tqdm import tqdm
# Hugging Faceのトークン設定
from google.colab import userdata # Google Colab使用時
HF_TOKEN = userdata.get('HF_TOKEN')
2.モデルとトークナイザーの読み込み:
# QLoRA設定
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
)
# ベースモデルの読み込み
base_model_id = "llm-jp/llm-jp-3-13b"
adapter_id = "frhug12og/llm-jp-3-13b-finetune"
model = AutoModelForCausalLM.from_pretrained(
base_model_id,
quantization_config=bnb_config,
device_map="auto",
token=HF_TOKEN
)
tokenizer = AutoTokenizer.from_pretrained(
base_model_id,
trust_remote_code=True,
token=HF_TOKEN
)
# LoRAアダプタの適用
model = PeftModel.from_pretrained(
model,
adapter_id,
token=HF_TOKEN
)
3.推論用の関数定義:
def generate_response(input_text):
prompt = f"""### 指示
{input_text}
### 回答
"""
inputs = tokenizer(
prompt,
return_tensors="pt",
return_token_type_ids=False
).to(model.device)
with torch.no_grad():
outputs = model.generate(
input_ids=inputs['input_ids'],
max_new_tokens=512,
do_sample=False,
repetition_penalty=1.2
)
return tokenizer.decode(outputs[0], skip_special_tokens=True)
ELYZA-tasks-100-TV_0での実行方法
import json
from tqdm import tqdm
# データの読み込み
datasets = []
with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
for line in f:
if line.strip():
datasets.append(json.loads(line.strip()))
# 推論実行
results = []
for data in tqdm(datasets):
input_text = data["input"]
output = generate_response(input_text)
results.append({
"task_id": data["task_id"],
"input": input_text,
"output": output
})
# 結果の保存
output_file = "results.jsonl"
with open(output_file, 'w', encoding='utf-8') as f:
for result in results:
json.dump(result, f, ensure_ascii=False)
f.write('\n')
Notes
- Google Colabで実行する場合は、T4 GPU環境を選択してください
- メモリ不足が発生した場合は、max_new_tokensの値を調整してください
Citation
このモデルの学習には以下のデータセットを使用しています:
@inproceedings{sekine-etal-2024-ichikara,
title = "ichikara-instruction: {LLM}のための日本語インストラクションデータの構築",
author = "関根 聡 and 安藤 まや and 後藤 美知子 and 鈴木 久美 and 河原 大輔 and 井之上 直也 and 乾 健太郎",
booktitle = "言語処理学会第30回年次大会",
year = "2024",
}