🔥 依存関係地獄からの大脱出
「Project Genesisの世界観をAIに学習させたい!」と意気込んで、LLMのファインチューニング環境を構築しようとしたら、2時間以上も依存関係の迷宮に迷い込んでしまった話です。
同じように苦しんでいる未来の誰かのために、この長い戦いの全記録を残します。
📋 前提条件
- OS: Windows 11
- GPU: RTX 3060 Ti (8GB VRAM)
- Python: 3.10
- 目的: Llama-3ベースのモデルをProject Genesisのデータでファインチューニング
💥 第一の罠:Unslothのインストール
期待していたこと
「Unslothは高速でメモリ効率が良い」と評判だったので、これを使おうと決めました。
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install unsloth
現実
エラー連発。まず ModuleNotFoundError: No module named 'torch' が発生。
原因: Unslothが pip install の「ビルド段階」で torch
の存在をチェックするが、Windowsでは同時インストール中のパッケージがまだ認識されていない。
💥 第二の罠:torchバージョンの不一致
torchを先にインストールしたら、今度は:
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed.
torchaudio 2.5.1+cu121 requires torch==2.5.1+cu121, but you have torch 2.10.0 which is incompatible.
原因: Unslothの最新版(2026.1.4)が、自動的に最新のPyTorch 2.10.0を要求するが、CUDA 12.1向けのPyTorchは2.5.1までしか公式提供されていない。
💥 第三の罠:xformersの闇
バージョンを統一しようとして xformers を指定すると:
ERROR: Could not find a version that satisfies the requirement xformers==0.0.28.post3
原因: xformersのビルド済みバイナリがPythonバージョンやCUDAバージョンに非常に依存しており、指定したバージョンが存在しない。
💥 第四の罠:torchaoの自爆
何とか進めると、実行時にこれが出現:
AttributeError: module 'torch' has no attribute 'int1'
原因: torchao という最適化ライブラリが、まだリリースされていない超最新機能(int1
データ型)を前提にしている。torch 2.5.1にはそんなものはない。
💥 第五の罠:transformersの大爆発
transformersをアップグレードすると:
ImportError: cannot import name 'CompileConfig' from 'transformers'
逆にダウングレードすると:
unsloth-zoo 2026.1.4 requires transformers>=4.51.3, but you have transformers 4.47.1
原因: Unslothが最新のtransformersの機能(CompileConfig)を使おうとするが、バージョン管理が追いついていない。
🚨 決断:Unslothを諦める
2時間の試行錯誤の末、ついに決断しました:
「Unslothはまだ2026年初頭のWindowsでは不安定すぎる。標準ライブラリに切り替えよう。」
✅ 解決策:PEFT + LoRAの標準構成
最終的なインストールコマンド
# 問題児を全削除
pip uninstall unsloth unsloth-zoo torchao xformers -y
# シンプルで確実な構成
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install transformers datasets peft trl accelerate bitsandbytes
学習スクリプト(train_genesis_simple.py)
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from trl import SFTTrainer
import torch
# 4-bit量子化設定(8GB VRAM向け)
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
)
# TinyLlama(認証不要、軽量)
model = AutoModelForCausalLM.from_pretrained(
"TinyLlama/TinyLlama-1.1B-Chat-v1.0",
quantization_config=bnb_config,
device_map="auto",
)
# LoRA設定
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
# ... 以下、学習処理
このシンプルな構成で、ついに 「Loading model and tokenizer...」 という待望のメッセージが表示され、学習が始まりました。
💥 第六の罠:API仕様の激変 (TRL 2025-2026)
「標準ライブラリなら安心」と思っていたら、そこにも罠が。2025年から2026年にかけて、trl ライブラリのAPIが大幅に更新されていました。
1. SFTTrainer の引数名変更
TypeError: SFTTrainer.__init__() got an unexpected keyword argument 'tokenizer'
解決策: tokenizer は processing_class という名前に変更されていました。
2. SFTConfig への設定集約
TypeError: SFTTrainer.__init__() got an unexpected keyword argument 'dataset_text_field'
解決策: 設定値の多くが、SFTTrainer に直接渡すのではなく、新設された SFTConfig
オブジェクトの中に含める形式に変わっていました。
3. バージョン 0.12.2 の地雷:max_length
TypeError: SFTConfig.__init__() got an unexpected keyword argument 'max_seq_length'
解決策: 多くのドキュメントでは max_seq_length とされていますが、この特定のバージョンでは単に
max_length と定義されていました。OS側からAPIの中身を inspect することでようやく正解に辿り着きました。
📊 比較:UnslothとPEFT
| 項目 | Unsloth | PEFT + LoRA |
|---|---|---|
| インストール | 🔴 非常に困難(2026年2月時点) | 🟢 シンプル |
| 学習速度 | 🟢 高速 | 🟡 やや遅い |
| VRAM消費 | 🟢 最小 | 🟡 やや多い(8GBでも動く) |
| 安定性 | 🔴 依存関係が複雑 | 🟢 枯れた技術 |
🎓 学んだ教訓
- 2026年初頭のUnslothは、Windowsでは「開発版」扱い
- Linux環境やGoogle Colabでは安定しているが、Windowsの依存関係管理ツール(pip)との相性が悪い。
- 「最新」は必ずしも「ベスト」ではない
- 枯れた技術(PEFT + LoRA)の方が、結果的に早く目的を達成できることもある。
- 依存関係地獄に2時間以上費やすくらいなら、早めに方針転換を
- 「あと少しで動くはず」という希望的観測が、時間を浪費させる。
🔮 今後の展望
Unslothの開発は非常に活発なので、数ヶ月後にはWindows環境でも安定すると期待しています。
それまでは、標準的なPEFT + LoRA で十分に高品質なファインチューニングが可能です。
Project Genesisの世界観をAIに学習させる旅は、これからが本番です!
この記事は、実際に2時間以上かけて試行錯誤した全記録をもとに執筆しました。
