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タスクを参考にしたものを用いて、新たなタスク生成を行います。このプロジェクトは、主に自然言語処理タスクにおけるトレーニングデータの自動生成に役立ちます。

利用方法

  1. モデルをロード後、タスク生成を開始します。

    • datasets モジュールを用いて、ELYZA-tasks-100からタスクを取得します。
    • モデルを使ってタスクに基づいた新しいタスク生成を行います。
    • 出力されたタスクを用いて、さらにモデルによる応答生成を行います。
  2. DPO(Direct Preference Optimization)学習:

    • 生成されたタスクと応答を使い、DPO学習を行います。
    • トレーニングのための設定は、DPOTrainerを用いて行います。
    from trl import DPOTrainer
    trainer = DPOTrainer(model, args, train_dataset=dpo_datasets)
    trainer.train()
    
  3. トレーニングが完了したモデルを使用して、タスクに基づく推論を行います。

モデルの詳細

  • 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)
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference API
Unable to determine this model’s pipeline type. Check the docs .

Model tree for usui2024/llm-jp-3-13b-dpo_w_u_original

Finetuned
(1141)
this model