|
--- |
|
language: |
|
- ja |
|
- en |
|
tags: |
|
- llm |
|
- question-answering |
|
- text-generation |
|
--- |
|
|
|
|
|
## Overview |
|
このモデルは、LLM-JP-3-13Bをベースに、LoRA (Low-Rank Adaptation)を利用してファインチューニングしたモデルです。 |
|
|
|
## モデル詳細 |
|
- ベースモデル: llm-jp/llm-jp-3-13b |
|
- ファインチューニング手法: LoRA (Low-Rank Adaptation) |
|
- 量子化: 4ビット量子化 (QLoRA) |
|
|
|
## インストール |
|
|
|
必要なパッケージのインストール: # Google Colab使用時 ※ローカル環境で実行する場合は、!を付けずにコマンドを実行してください |
|
```bash |
|
!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.必要なライブラリのインポート: |
|
```python |
|
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.モデルとトークナイザーの読み込み: |
|
```python |
|
# 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.推論用の関数定義: |
|
```python |
|
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での実行方法 |
|
```python |
|
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 |
|
|
|
このモデルの学習には以下のデータセットを使用しています: |
|
|
|
```bibtex |
|
@inproceedings{sekine-etal-2024-ichikara, |
|
title = "ichikara-instruction: {LLM}のための日本語インストラクションデータの構築", |
|
author = "関根 聡 and 安藤 まや and 後藤 美知子 and 鈴木 久美 and 河原 大輔 and 井之上 直也 and 乾 健太郎", |
|
booktitle = "言語処理学会第30回年次大会", |
|
year = "2024", |
|
} |
|
``` |