OSSでLLMをファインチューニング:LLaMA Factory vs Axolotl vs Unsloth 比較
オープンソースラボ編集部 ・ 2026年6月14日
OSSでLLMをファインチューニング:LLaMA Factory vs Axolotl vs Unsloth 比較
OpenAI Fine-tuning API(GPT-4o-miniのファインチューニングは$0.003/1Kトークン〜)を使わずにモデルを自社データで特化させる方法として、LLaMA Factory(UIも付いた多様なモデル対応)・Axolotl(設定ファイルベースの柔軟ファインチューニング)・Unsloth(2倍高速・メモリ半分の高効率実装)はOSSのLLMファインチューニングフレームワークです。
LLMファインチューニングの手法
LLMのカスタマイズには複数の手法があります:
- Full Fine-tuning: モデルの全パラメーターを更新。最高精度だがGPUメモリが大量必要(70BモデルでA100×8枚以上)
- LoRA(Low-Rank Adaptation): 全パラメーターの代わりに低ランク行列(アダプター)のみ学習。VRAMを1/10程度に削減
- QLoRA(Quantized LoRA): LoRAに量子化を組み合わせ。4bit量子化で7BモデルをRTX 4090(24GB)1枚でFT可能
- RLHF(Reinforcement Learning from Human Feedback): 人間の評価フィードバックで報酬モデルを学習してPPOで最適化
- DPO(Direct Preference Optimization): RLHFより安定した選好学習。ChatGPTのような応答スタイルに調整
主要ツールの概要
LLaMA Factory
2023年に公開されたマルチモデル対応のファインチューニングフレームワークです。GitHubスター45k+。100以上のモデル(LLaMA・Mistral・Gemma・Qwen・Phi等)に対応し、LoRA/QLoRA/Full FT/RLHFをワンコマンドで実行できます。Web UIも提供しており、コードなしでファインチューニングジョブを設定・実行・評価できます。
# LLaMA Factoryのインストール
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
# 推奨: CUDA 12.1 + PyTorch 2.3
pip install torch==2.3.0 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install flash-attn --no-build-isolation # Flash Attention 2(速度向上)
# train_config.yaml - QLoRAファインチューニングの設定
model_name_or_path: meta-llama/Meta-Llama-3.1-8B-Instruct
stage: sft # supervised fine-tuning
do_train: true
finetuning_type: lora # qlora の場合は quantization_bit: 4 を追加
dataset: my_dataset # data/dataset_info.json に定義したデータセット名
template: llama3 # プロンプトテンプレート
cutoff_len: 2048
max_samples: 5000
output_dir: ./outputs/llama3-sft-lora
logging_steps: 10
save_steps: 500
plot_loss: true
overwrite_output_dir: true
per_device_train_batch_size: 2
gradient_accumulation_steps: 8 # 実効バッチサイズ: 2*8=16
learning_rate: 0.0001
num_train_epochs: 3
lr_scheduler_type: cosine
warmup_ratio: 0.1
fp16: true # RTX 3090/4090ではbf16推奨
lora_rank: 16
lora_target: all # 全Linear層にLoRAアダプターを適用
lora_alpha: 32
lora_dropout: 0.05
# 量子化を使う場合 (QLoRA)
# quantization_bit: 4
# quantization_type: nf4 # NF4量子化(精度とメモリのバランス)
# 学習を開始
llamafactory-cli train train_config.yaml
# Web UIでインタラクティブに設定(コードなし)
llamafactory-cli webui
# 評価・推論
llamafactory-cli eval --model_name_or_path outputs/llama3-sft-lora --task mmlu --split test
Axolotl
2023年に公開されたYAML設定ファイルベースのLLMファインチューニングツールです。GitHubスター9k+。Hugging Face TransformersとPEFT(Parameter-Efficient Fine-Tuning)をラップし、LoRA・QLoRA・Full FT・ReLoRA(LoRAのランク増加手法)・FSDP(大規模分散学習)に対応します。Docker/RunPodでワンコマンド実行でき、クラウドGPUでの学習が容易です。
# config.yml - Axolotlの設定ファイル(LLaMA-3 8B QLoRA)
base_model: meta-llama/Meta-Llama-3.1-8B-Instruct
model_type: LlamaForCausalLM
tokenizer_type: AutoTokenizer
# データセット設定
datasets:
- path: ./data/my_training_data.jsonl
type: sharegpt # または alpaca / instruct / completion
conversation: chatml
# 量子化設定(QLoRA)
load_in_4bit: true
gptq: false
strict: false
# LoRA設定
adapter: lora
lora_r: 32
lora_alpha: 16
lora_dropout: 0.05
lora_target_linear: true # 全Linear層
# 学習設定
sequence_len: 4096
sample_packing: true # シーケンスをパックして効率化
pad_to_sequence_len: true
gradient_accumulation_steps: 4
micro_batch_size: 2
num_epochs: 3
learning_rate: 0.0002
optimizer: adamw_bnb_8bit
lr_scheduler: cosine
warmup_steps: 100
# 出力設定
output_dir: ./outputs/axolotl-llama3
logging_steps: 25
save_strategy: epoch
save_total_limit: 3
# Axolotlで学習を開始
pip install axolotl[flash-attn,deepspeed]
# シングルGPU
accelerate launch -m axolotl.cli.train config.yml
# マルチGPU(4枚のA100で分散学習)
accelerate launch --num_processes 4 -m axolotl.cli.train config.yml
# RunPod/Modal等のクラウドGPUでDockerを使って実行
docker run --gpus all -v $(pwd):/workspace winglian/axolotl:main-py3.11-cu121-2.1.2 python -m axolotl.cli.train config.yml
Unsloth
2023年に公開された超高速・省メモリのファインチューニングライブラリです。GitHubスター30k+。標準的なHugging Face実装と比べて2倍高速、メモリ使用量60%削減を達成。Triton(OpenAIが開発したGPUカーネル言語)でカスタム実装されたバックワードパスが高速化の鍵です。Google ColabやRTX 4090でのファインチューニングに最適。
# Unslothで LLaMA-3 8B をQLoRAファインチューニング
# pip install unsloth
from unsloth import FastLanguageModel
from trl import SFTTrainer
from transformers import TrainingArguments
from datasets import load_dataset
# モデルをロード(Unslothの最適化済みバージョン)
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/Meta-Llama-3.1-8B-Instruct",
max_seq_length=2048,
dtype=None, # 自動判定(float16/bfloat16)
load_in_4bit=True, # QLoRA用4bit量子化
)
# LoRAアダプターを追加
model = FastLanguageModel.get_peft_model(
model,
r=16, # LoRAランク
target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
lora_alpha=16,
lora_dropout=0, # Unslothは0推奨(最適化済み)
bias="none",
use_gradient_checkpointing="unsloth", # Unslothの勾配チェックポイント
random_state=3407,
)
# データセットを準備(alpaca形式)
def formatting_prompts_func(examples):
alpaca_prompt = (
"以下は日本語での指示です。指示に従って適切な応答を生成してください。
"
"### 指示:
{}
"
"### 入力:
{}
"
"### 応答:
{}"
)
texts = []
for instruction, input_text, output in zip(
examples["instruction"], examples["input"], examples["output"]
):
text = alpaca_prompt.format(instruction, input_text, output) + tokenizer.eos_token
texts.append(text)
return {"text": texts}
dataset = load_dataset("json", data_files="./data/train.jsonl", split="train")
dataset = dataset.map(formatting_prompts_func, batched=True)
# SFTTrainerで学習
trainer = SFTTrainer(
model=model,
tokenizer=tokenizer,
train_dataset=dataset,
dataset_text_field="text",
max_seq_length=2048,
dataset_num_proc=2,
args=TrainingArguments(
per_device_train_batch_size=2,
gradient_accumulation_steps=4,
warmup_steps=5,
num_train_epochs=3,
learning_rate=2e-4,
fp16=True,
logging_steps=10,
output_dir="outputs",
optim="adamw_8bit",
weight_decay=0.01,
lr_scheduler_type="linear",
seed=3407,
),
)
trainer.train()
# LoRAアダプターを保存
model.save_pretrained("lora_model")
tokenizer.save_pretrained("lora_model")
# Ollamaで使えるGGUFに変換
model.save_pretrained_gguf("gguf_model", tokenizer, quantization_method="q4_k_m")
GPU要件とコスト比較
| モデルサイズ | 手法 | 最低GPU | 推奨GPU |
|---|---|---|---|
| 7B/8B | QLoRA (4bit) | RTX 3080 10GB | RTX 4090 24GB |
| 7B/8B | LoRA (fp16) | RTX 4090 24GB | A100 40GB |
| 13B/14B | QLoRA (4bit) | RTX 4090 24GB | A100 40GB |
| 70B | QLoRA (4bit) | A100 80GB × 2 | A100 80GB × 4 |
機能比較表
| 比較項目 | LLaMA Factory | Axolotl | Unsloth |
|---|---|---|---|
| 対応モデル数 | 100+ | 50+ | 30+ |
| Web UI | ✅(内蔵) | ❌ | ❌ |
| 速度 | 標準 | 標準 | 2倍高速 |
| メモリ効率 | 標準 | 標準 | 60%削減 |
| 分散学習 | ✅ | ✅(FSDP) | 制限あり |
| RLHF/DPO | ✅ | ✅ | ✅ |
| GitHub Stars | 45k+ | 9k+ | 30k+ |
ファインチューニングした独自モデルをAPIサーバーとして展開するにはLLMツールカテゴリ/categories/llm-toolsのvLLM・Ollama・LiteLLMを参照してください。学習の実験追跡・モデルレジストリの管理は同カテゴリのMLflowと組み合わせるのが最善です。モデルのパフォーマンス監視にはDevOpsカテゴリ/categories/devopsのGrafanaが有効です。
FAQ
Q. LLaMA-3 8BをRTX 4090でQLoRAファインチューニングするとどのくらいの時間がかかりますか?
A. データセットと設定に依存しますが、目安:
データセット: 5,000サンプル × 平均1,024トークン
RTX 4090 (24GB VRAM)
QLoRA: 4bit量子化 + LoRA rank=16
バッチサイズ: 2 + 勾配累積: 4(実効バッチサイズ: 8)
3エポック
所要時間: 約2〜4時間
クラウドGPU(A100 40GB SXM)では同じ設定で約1〜2時間。
RunPodでA100の料金は約$1.5〜2.5/時間なので、$3〜5でFT完了。
バッチサイズを大きくするか(VRAMが余る場合)、sample_packing=Trueで高速化可能です。
Q. ファインチューニングしたモデルはどうやって本番環境にデプロイしますか?
A. 主な方法:
# 1. Ollama(ローカル・セルフホスト)
# LoRAアダプターをGGUFに変換
python -c "
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained('lora_model', load_in_4bit=True)
model.save_pretrained_gguf('model.gguf', tokenizer, quantization_method='q4_k_m')
"
# Modelfileを作成
cat > Modelfile << 'EOF'
FROM ./model.gguf
SYSTEM "あなたはXXX社の専門アシスタントです。"
EOF
ollama create my-custom-model -f Modelfile
ollama run my-custom-model
# 2. vLLM(高スループットAPIサーバー)
# HuggingFaceにpush後
vllm serve your-hf-username/my-fine-tuned-model --host 0.0.0.0 --port 8000 --max-model-len 4096 --gpu-memory-utilization 0.9
Q. DPO(Direct Preference Optimization)とSFTの違いは何ですか?
A. SFT(Supervised Fine-tuning): 正解の回答ペア(Instruction → Response)で学習。「このような質問にはこのように答えなさい」。DPO: 選好ペア(Chosen(好ましい回答)vs Rejected(好ましくない回答))で学習。「AよりBの方が良い回答だ」という相対的な選好を学習。OpenAIが公開したInstructGPTの簡略版として、モデルをより人間好みの応答に調整できます。実用では①まずSFTでドメイン特化させ②次にDPOで応答スタイル・安全性を調整、という2段階が有効です。
Q. ファインチューニングのデータはどのくらい必要ですか?
A. タスクとベースモデルの強さによります。1,000〜10,000サンプル: 特定ドメインの用語・スタイル調整(カスタマーサポート口調・法律文書スタイル等)。10,000〜100,000サンプル: 新しいスキル・知識の習得(専門分野のQ&A・コード生成の特定言語対応)。ただしデータ品質 > 数量です。100件の高品質データが10,000件の低品質データより効果的な場合があります。データ前処理に注力し、重複除去・低品質サンプルの除去・多様性の確保を行うことが重要です。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| UI付きで手軽に開始 | LLaMA Factory |
| 柔軟な設定・クラウドGPU | Axolotl |
| RTX4090・最高効率 | Unsloth |