Model Card for Model ID
usui2024/llm-jp-3-13b-dpo_w_100usud
LLM-JP モデルのFine-Tuning と DPOの学習
概要
このプロジェクトでは、LLM-JPモデルをFine-Tuningし、DPO(Direct Preference Optimization)学習を用いてタスク生成と応答生成を行う方法を説明します。データセットは、ELYZAタスクを参考にしたものを用いて、新たなタスク生成を行います。このプロジェクトは、主に自然言語処理タスクにおけるトレーニングデータの自動生成に役立ちます。
利用方法
モデルをロード後、タスク生成を開始します。
datasets
モジュールを用いて、ELYZA-tasks-100
からタスクを取得します。- モデルを使ってタスクに基づいた新しいタスク生成を行います。
- 出力されたタスクを用いて、さらにモデルによる応答生成を行います。
DPO(Direct Preference Optimization)学習:
- 生成されたタスクと応答を使い、DPO学習を行います。
- トレーニングのための設定は、
DPOTrainer
を用いて行います。
from trl import DPOTrainer trainer = DPOTrainer(model, args, train_dataset=dpo_datasets) trainer.train()
トレーニングが完了したモデルを使用して、タスクに基づく推論を行います。
モデルの詳細
- Developed by: usui2040
- モデル名: LLM-JP
- ベースモデル: llm-jp-3-13b
- ファインチューニング方法: LoRA(Low-Rank Adaptation)
- 学習タスク: タスク生成、応答生成
- 利用されるアルゴリズム: DPO (Direct Preference Optimization)
- トークナイザー: AutoTokenizer(Hugging Face提供)
- 出力形式: テキスト生成
- This llama model was trained 2x faster with Unsloth and Huggingface's TRL library.
モデルは、日本語を対象とした大規模なトランスフォーマーモデルです。タスクに基づいたテキスト生成や応答生成が可能で、生成タスクを指定することで柔軟に動作します。
モデルの設定とトレーニング
Hugging Face上でモデルをトレーニングし、評価・出力を行う方法を説明します。
必要なライブラリのインストール
pip install -U ipywidgets
pip install transformers==4.46.3
pip install -U bitsandbytes
pip install -U accelerate
pip install -U datasets
pip install -U peft==0.13.2
pip install -U trl==0.12.1
モデルの設定とトレーニング
使用するベースモデルを指定して、それを読み込みます。ここでは、llm-jp-3-13bというモデルを使用しています。
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
BitsAndBytesConfig
)
from peft import PeftModel
# モデル設定
base_model_id = "llm-jp/llm-jp-3-13b" # モデルのIDまたはパスを指定
adapter_id = "usui2024/20241211_w_llm-jp-3-13b-it_lora" # LoRAアダプターID
# QLoRAの設定
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
)
# モデルとトークナイザーのロード
model = AutoModelForCausalLM.from_pretrained(
base_model_id,
quantization_config=bnb_config,
device_map="auto",
token=HF_TOKEN # HF_TOKENはHugging Faceのアクセストークン
)
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)
合成データの生成
次に、モデルを使って合成データを生成します。以下では、ELYZA-tasks-100のデータを使用して新しいタスクを生成し、それに対するモデルの回答を作成します。
from datasets import load_dataset
from tqdm import tqdm
# データセットの読み込み
datasets = load_dataset("elyza/ELYZA-tasks-100")
task_results = []
# タスクの生成
for ref_input in tqdm(datasets['test']['input']):
prompt = f"""以下に示す参考タスクに従って、類似したタスクを生成しなさい。
## 参考タスク
仕事の熱意を取り戻すためのアイデアを5つ挙げてください。
## 類似タスク
試合に挑む心構えを3つほど挙げてください。
## 参考タスク
{ref_input}
## 類似タスク
"""
tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
attention_mask = torch.ones_like(tokenized_input)
with torch.no_grad():
outputs = model.generate(
tokenized_input,
attention_mask=attention_mask,
max_new_tokens=100,
num_return_sequences=3, # 同じタスクから3つの新タスクを生成
do_sample=True,
temperature=0.6,
top_p=0.9,
repetition_penalty=1.2,
pad_token_id=tokenizer.eos_token_id
)
output_texts = [tokenizer.decode(output[tokenized_input.size(1):], skip_special_tokens=True) for output in outputs]
new_task = {"reference_task": ref_input}
new_task.update({f"similar_task_{i}": output_text for i, output_text in enumerate(output_texts)})
task_results.append(new_task)
df = pd.DataFrame(task_results)
df.head()
DPO (Differentiable Prompt Optimization) の学習
DPOを使って、生成したタスクと回答のペアに基づいてモデルをトレーニングします。
from trl import DPOConfig, DPOTrainer
from datasets import Dataset
import torch
# DPO用のデータセットを準備
dpo_datasets = Dataset.from_list(dpo_datasets)
# DPOの設定
training_args = DPOConfig(
output_dir=new_model_id,
per_device_train_batch_size=1,
gradient_accumulation_steps=4,
num_train_epochs=2,
logging_steps=10,
save_steps=100,
save_total_limit=1,
learning_rate=1.5e-4,
fp16=True,
)
# DPOトレーナーの設定
dpo_trainer = DPOTrainer(
model,
args=training_args,
train_dataset=dpo_datasets,
tokenizer=tokenizer,
peft_config=peft_config,
)
# 学習の実行
dpo_trainer.train()
モデルの推論
最後に、モデルにタスクを入力し、その結果を得るための推論コードを提供します。
# データセットの読み込み。
datasets = []
with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
item = ""
for line in f:
line = line.strip()
item += line
if item.endswith("}"):
datasets.append(json.loads(item))
item = ""
task_results = []
outputs_results = []
for task in tqdm(dataset):
prompt = f"### 指示:\n{task}\n### 回答:\n"
tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
attention_mask = torch.ones_like(tokenized_input)
with torch.no_grad():
outputs = model.generate(
tokenized_input,
attention_mask=attention_mask,
max_new_tokens=512,
num_return_sequences=3, # 最低でも2個の出力を生成
do_sample=True,
temperature=0.6,
top_p=0.9,
repetition_penalty=1.2,
pad_token_id=tokenizer.eos_token_id
)
output_texts = [tokenizer.decode(output[tokenized_input.size(1):], skip_special_tokens=True) for output in outputs]
outputs_results.append(output_texts)
# 結果の表示
for result in outputs_results:
print(result)
Model tree for usui2024/llm-jp-3-13b-dpo_w_u_original
Base model
llm-jp/llm-jp-3-13b