はじめに
こんにちは、ひよこです。LLM を自分の用途に寄せたいと思ったとき、大きな壁になるのが「GPU の VRAM 不足」と「学習速度の遅さ」です。
本来、エンジニアが情熱を注ぐべきなのは「どんなデータとモデルで何を学習するか」という創造的な部分のはずなのに、現実は環境構築やメモリ管理で膨大な時間を消耗してしまっています。そこで面倒な部分を丸投げで、学習を圧倒的に効率化してくれるツール「Unsloth」を紹介します。
🐣 あの動物のナマケモノは Sloth ですね
Unsloth とは
Unsloth は、LLM のファインチューニングや強化学習を、高速かつ少ない VRAM で実行するためのライブラリです。Apache-2.0 ライセンスで公開されています。
「遅い(Sloth)」を「ひっくり返す(Un)」という名の通り、独自のカーネル最適化によって計算資源の無駄を削ぎ落としてくれます。
何がうれしいの
このツールを使う最大のメリットは、環境にかかるコストを最小化し、試行錯誤の回数を増やせる点にあります。
- メモリ効率の劇的な向上: 公式リポジトリでは、メモリ消費を 70% 削減できると示されています
- 学習時間の短縮: 従来の手法と比較して 2 倍速い学習が可能になります
- 再現のしやすさ: 公式の Google Colab ノートブックが豊富に用意されており、型を真似るだけでスムーズに開始できます
「優れたエンジニアは、楽をするために自動化を徹底する」と言われます。Unsloth は、まさにそのための強力な武器となります。
まずは動かす
最短ルート
最も手軽なのは、公式の Google Colab ノートブック一覧 から最適なものを選ぶ方法です。
ローカル環境にインストールして使用する場合は、以下のコマンドから開始します。
pip install unsloth
ただし、GPU や CUDA のバージョンによって最適なインストール方法が異なります。環境構築で無駄な時間を使わないよう、公式のインストールガイド を確認してから進めるのがいちばん効率的です。
🐣 Unsloth に限らずこの分野のツールはすごいスピードで進化するので最新情報のチェックは重要です
最小の SFT 実装例
以下に、チャット形式のデータを SFT(教師あり微調整)で学習する際の最小限のコードを示します。
コード例
最新の SFTConfig を使用した構成に変更し、VRAM 節約設定や応答部分のみの学習といった推奨設定を盛り込んでいます。
from datasets import load_dataset
from trl import SFTTrainer, SFTConfig
from unsloth import FastLanguageModel
from unsloth.chat_templates import get_chat_template, train_on_responses_only
import torch
model_name = "unsloth/Meta-Llama-3.1-8B-bnb-4bit"
max_seq_length = 2048
# モデルとトークナイザーの読み込み
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = model_name,
max_seq_length = max_seq_length,
dtype = None,
load_in_4bit = True,
)
# モデルに LoRA アダプタを追加
model = FastLanguageModel.get_peft_model(
model,
r = 16,
target_modules = [
"q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",
],
lora_alpha = 16,
lora_dropout = 0,
bias = "none",
use_gradient_checkpointing = "unsloth", # 追加:30%のVRAM節約
random_state = 3407,
)
# チャットテンプレートの適用
tokenizer = get_chat_template(
tokenizer,
chat_template = "llama-3.1",
)
def formatting_prompts_func(examples):
convos = examples["messages"]
texts = [tokenizer.apply_chat_template(convo, tokenize=False, add_generation_prompt=False) for convo in convos]
return {"text": texts}
# データセットの読み込みとフォーマット適用
dataset = load_dataset("trl-lib/Capybara", split="train")
dataset = dataset.map(formatting_prompts_func, batched=True)
# SFTTrainer の設定
trainer = SFTTrainer(
model = model,
tokenizer = tokenizer,
train_dataset = dataset,
args = SFTConfig(
dataset_text_field = "text",
max_seq_length = max_seq_length,
output_dir = "outputs", # 追加:必須パラメータ
per_device_train_batch_size = 2,
gradient_accumulation_steps = 4,
),
)
# アシスタント応答のみ学習(オプション)
trainer = train_on_responses_only(
trainer,
instruction_part = "<|start_header_id|>user<|end_header_id|>\n\n",
response_part = "<|start_header_id|>assistant<|end_header_id|>\n\n",
)
trainer.train()
Unsloth を賢く使うポイント
初心者が環境面で詰まりやすいポイントを回避し、本来の目的に集中しましょう。
-
VRAM 節約: 4-bit 量子化に加え、
use_gradient_checkpointing = "unsloth"を指定することでメモリ効率を最大化します -
学習対象の最適化:
train_on_responses_onlyを活用し、モデルがユーザーの指示を「覚える」のではなく、適切に「応答する」ことに集中させます - 依存関係の解決: インストール手順は公式ドキュメントに従い、手動での調整は最小限にします
- OS の選択: Windows で動かす場合は、WSL2 の利用を推奨する公式ガイドを必ず一読しましょう
おわりに
Unsloth は「LLM 学習の重荷」を肩代わりしてくれる、エンジニアにとって非常にありがたい道具です。面倒な設定やリソース管理はツールに任せて、私たちは「より良いモデルを作る」というクリエイティブな仕事に時間を使いましょう。ではまた次の記事でお会いしましょう。
🐣 できる人って賢い『ナマケモノ』な場合が多い印象があります