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 は以下のパラメータで回しました.
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 です.
上記の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 を用いることや、他のデータセットを使うことができなかませんでした. これからも時間を見つけては学習などを回し、性能向上に向けて励んでいきたいです.