U-18部門優秀賞をいただいたので、ここに記します.

Fine-Tuning と DPO を行いました. また、 https://github.com/unslothai/unsloth.git を用いて学習しました.

データセット

データセットには、 LLMのための日本語インストラクションデータ 公開ページ – LIAT-AIP homepage の ichikara-instruction-003-001-1.json のみ使用しました.

元モデル

元のモデルとして、llm-jp/llm-jp-3-13b · Hugging Face の llm-jp/llm-jp-3-13b を使いました.

Fine-Tuning

Fine-Tuning は以下のパラメータで回しました.

from unsloth import FastLanguageModel
import torch
max_seq_length = 512 # 自由に設定可能
model = FastLanguageModel.get_peft_model(
    model,
    r = 32,
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
                      "gate_proj", "up_proj", "down_proj",],
    lora_alpha = 32,
    lora_dropout = 0.05,
    bias = "none",
    use_gradient_checkpointing = "unsloth",
    random_state = 3407,
    use_rslora = False,
    loftq_config = None,
    max_seq_length = max_seq_length,
)

"""
training_arguments: 学習の設定

  - output_dir:
      -トレーニング後のモデルを保存するディレクトリ

  - per_device_train_batch_size:
      - デバイスごとのトレーニングバッチサイズ

  - per_device_eval_batch_size:
      - デバイスごとの評価バッチサイズ

  - gradient_accumulation_steps:
      - 勾配を更新する前にステップを積み重ねる回数

  - optim:
      - オプティマイザの設定

  - num_train_epochs:
      - エポック数

  - eval_strategy:
      - 評価の戦略 ("no"/"steps"/"epoch")

  - eval_steps:
      - eval_strategyが"steps"のとき、評価を行うstep間隔

  - logging_strategy:
      - ログ記録の戦略

  - logging_steps:
      - ログを出力するステップ間隔

  - warmup_steps:
      - 学習率のウォームアップステップ数

  - save_steps:
      - モデルを保存するステップ間隔

  - save_total_limit:
      - 保存しておくcheckpointの数

  - max_steps:
      - トレーニングの最大ステップ数

  - learning_rate:
      - 学習率

  - fp16:
      - 16bit浮動小数点の使用設定(第8回演習を参考にすると良いです)

  - bf16:
      - BFloat16の使用設定

  - group_by_length:
      -  入力シーケンスの長さによりバッチをグループ化 (トレーニングの効率化)

  - report_to:
      - ログの送信先 ("wandb"/"tensorboard"など)
"""
from trl import SFTTrainer
from transformers import TrainingArguments
from unsloth import is_bfloat16_supported

trainer = SFTTrainer(
    model = model,
    tokenizer = tokenizer,
    train_dataset=dataset["train"],
    max_seq_length = max_seq_length,
    dataset_text_field="formatted_text",
    packing = False,
    args = TrainingArguments(
        per_device_train_batch_size = 2,
        gradient_accumulation_steps = 4,
        num_train_epochs = 1,
        logging_steps = 10,
        warmup_steps = 10,
        save_steps=100,
        save_total_limit=2,
        max_steps=-1,
        learning_rate = 2e-4,
        fp16 = not is_bfloat16_supported(),
        bf16 = is_bfloat16_supported(),
        group_by_length=True,
        seed = 3407,
        output_dir = "outputs",
        report_to = "none",
    ),
)

学習後のモデルは kikansha-Tomasu/llm-jp-3-13b-sft-dpo_lora · Hugging Face です.

DPO

上記のLLMに類似のタスクとその回答を追加で400個作らせ、そのうち100個を選んで手動で評価しました. その上で、以下のパラメータでDPOを回しました.

peft_config = LoraConfig(
    r=16,
    lora_alpha=32,
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
    target_modules=["q_proj", "v_proj"] # ["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj",]の全てをターゲットとするとL4で動かないので, 計算負荷を抑えるために一部のモジュール("q_proj"と"v_proj")を選択しています。
)

model = get_peft_model(model, peft_config)

from datasets import Dataset

dpo_datasets = Dataset.from_list(dpo_datasets)
split_dpo_datasets = dpo_datasets.train_test_split(test_size=0.1)
train_dataset = split_dpo_datasets["train"]
test_dataset = split_dpo_datasets["test"]

training_args = DPOConfig(
    output_dir=new_model_id,
    per_device_train_batch_size=1,
    per_device_eval_batch_size=1,
    gradient_accumulation_steps=4,
    optim="paged_adamw_32bit",
    num_train_epochs=1,
    eval_strategy="steps",
    eval_steps=0,
    logging_strategy="steps",
    logging_steps=10,
    save_steps=100,
    save_total_limit=1,
    max_steps=-1,
    learning_rate=2e-4,
    fp16=True,
    bf16=False,
    report_to="none",
    max_length=512,  # 最大トークン長
    save_strategy="epoch",  # 保存戦略
)

dpo_trainer = DPOTrainer(
    model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=test_dataset,
    tokenizer=tokenizer,
    peft_config=peft_config,
)

学習後のモデルは kikansha-Tomasu/llm-jp-3-13b-sft-dpo_lora · Hugging Face です.

所感

中途半端に終わってしまい、https://github.com/arcee-ai/mergekit を用いることや、他のデータセットを使うことができなかませんでした. これからも時間を見つけては学習などを回し、性能向上に向けて励んでいきたいです.