Unsloth で Llama-3.2-3B を微調整する
このノートブックはLlama-3.2-3Bを微調整する方法を示していますUnslothライブラリを使用した大規模言語モデル。Unsloth は、LoRA (Low-Rank Adaptation) などの効率的なファインチューニング (PEFT) テクニックの最適化された実装を提供し、メモリ使用量を減らしてより高速なトレーニングを可能にします。
ノートブックには次の内容が記載されています。
- ベースLlama-3.2-3Bのロードと設定モデル
- LoRA アダプタを使用した PEFT モデルの作成
- FineTome-100k データセットからのトレーニング データの処理
- 監修付きファインチューニング(SFT)によるトレーニング
- MLflowを使用したロギング体験
- 微調整したモデルをUnity Catalogに登録する
要件: サーバレス GPU コンピュート
このノートブックは、A10 アクセラレータによる GPU コンピュートを必要とします。 環境パネルでアクセラレータとして A10 を選択し、 [適用] をクリックします。
注: コンピュート プロビジョニングには最大 8 分かかる場合があります。
必要なライブラリをインストールする
CUDA 12.4 およびPyTorch 2.6.0 をサポートする Unsloth ライブラリをインストールし、分散トレーニング用のアクセラレーションとエクスペリメント トラッキング用のMLflowインストールします。 インストール後、Python ランタイムが再起動し、新しいパッケージがロードされます。
%pip install unsloth[cu124-torch260]==2025.9.6
%pip install accelerate==1.7.0
%pip install unsloth_zoo==2025.9.8
%pip install -U mlflow
%restart_python
Unity Catalogとモデル設定を構成する
モデル チェックポイントと最終的に登録されたモデルを保存するためのUnity Catalog場所を定義します。 構成には以下が含まれます。
- Unity Catalog名前空間 (カタログ、スキーマ、モデル名、ボリューム)
- ベースモデルの選択 (Llama-3.2-3B-Instructアンスロートより
- チェックポイントを保存するための出力ディレクトリ
- トレーニングデータセット(FineTome-100k)
dbutils.widgets.text("uc_catalog", "main")
dbutils.widgets.text("uc_schema", "default")
dbutils.widgets.text("uc_model_name", "llama-3.2-3b")
dbutils.widgets.text("uc_volume", "checkpoints")
UC_CATALOG = dbutils.widgets.get("uc_catalog")
UC_SCHEMA = dbutils.widgets.get("uc_schema")
UC_MODEL_NAME = dbutils.widgets.get("uc_model_name")
UC_VOLUME = dbutils.widgets.get("uc_volume")
print(f"UC_CATALOG: {UC_CATALOG}")
print(f"UC_SCHEMA: {UC_SCHEMA}")
print(f"UC_MODEL_NAME: {UC_MODEL_NAME}")
print(f"UC_VOLUME: {UC_VOLUME}")
# Model selection - Choose based on your compute constraints
MODEL_NAME = "unsloth/Llama-3.2-3B-Instruct" # or choose "unsloth/Llama-3.2-1B-Instruct"
OUTPUT_DIR = f"/Volumes/{UC_CATALOG}/{UC_SCHEMA}/{UC_VOLUME}/{UC_MODEL_NAME}"
DATASET_NAME = "mlabonne/FineTome-100k"
print(f"MODEL_NAME: {MODEL_NAME}")
print(f"OUTPUT_DIR: {OUTPUT_DIR}")
print(f"DAASET_NAME: {DATASET_NAME}")
ベースモデルとトークナイザーをロードする
Llama-3.2-3B-InstructをロードするUnsloth のFastLanguageModelを使用したモデル。これにより、利用可能な GPU で最適なパフォーマンスを得るために、モデルの最大シーケンス長を 2048 トークンに設定し、dtype の自動検出を行います。
from unsloth import FastLanguageModel
import torch
max_seq_length = 2048 # Choose any!
dtype = None # None for auto detection. Float16 for Tesla T4, V100, Bfloat16 for Ampere+
load_in_4bit = False # Use 4bit quantization to reduce memory usage. Can be False.
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = MODEL_NAME,
max_seq_length = max_seq_length,
dtype = dtype,
load_in_4bit = load_in_4bit,
# token = "hf_...", # use one if using gated models like meta-llama/Llama-2-7b-hf
)
LoRA アダプターを適用して効率的な微調整を行う
LoRA (低ランク適応) アダプターをアテンション レイヤーとフィードフォワード レイヤーに追加して、ベース モデルを PEFT モデルに変換します。これはランク 16 アダプターを使用し、ベース モデルを固定したままトレーニング可能なパラメーターのごく一部だけを追加するため、メモリ要件とトレーニング時間が大幅に削減されます。
model = FastLanguageModel.get_peft_model(
model,
r = 16, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",],
lora_alpha = 16,
lora_dropout = 0, # Supports any, but = 0 is optimized
bias = "none", # Supports any, but = "none" is optimized
# [NEW] "unsloth" uses 30% less VRAM, fits 2x larger batch sizes!
use_gradient_checkpointing = "unsloth", # True or "unsloth" for very long context
random_state = 3407,
use_rslora = False, # We support rank stabilized LoRA
loftq_config = None, # And LoftQ
)
トレーニングデータセットをロードしてフォーマットする
FineTome-100k データセットをロードし、トレーニングの準備をします。データ処理では、Llama-3.1 チャット テンプレートを適用して会話をフォーマットし、ShareGPT 形式を標準化し、各会話を教師ありファインチューニングに適したトークン化されたテキスト シーケンスに変換します。
from unsloth.chat_templates import get_chat_template
tokenizer = get_chat_template(
tokenizer,
chat_template = "llama-3.1",
)
def formatting_prompts_func(examples):
convos = examples["conversations"]
texts = [tokenizer.apply_chat_template(convo, tokenize = False, add_generation_prompt = False) for convo in convos]
return { "text" : texts, }
pass
from datasets import load_dataset
dataset = load_dataset(DATASET_NAME, split = "train")
from unsloth.chat_templates import standardize_sharegpt
dataset = standardize_sharegpt(dataset)
dataset = dataset.map(formatting_prompts_func, batched = True,)
監視付きファインチューニングトレーナーを設定する
バッチ サイズ、学習率、オプティマイザー設定などのトレーニング ハイパーパラメータを使用してSFTTrainerを設定します。トレーナーは、MLflow トラッキングを有効にして 25 ステップ実行するように構成されています。応答のみのトレーニングにより、モデルはユーザーのプロンプトではなくアシスタントの応答のみから学習するため、トレーニングの効率が向上します。
from trl import SFTTrainer
from transformers import TrainingArguments, DataCollatorForSeq2Seq
from unsloth import is_bfloat16_supported
from transformers.integrations import MLflowCallback
from unsloth.chat_templates import train_on_responses_only
import mlflow
from unsloth import FastLanguageModel
import torch
trainer = SFTTrainer(
model = model,
tokenizer = tokenizer,
train_dataset = dataset,
dataset_text_field = "text",
max_seq_length = max_seq_length,
data_collator = DataCollatorForSeq2Seq(tokenizer = tokenizer),
dataset_num_proc = 6,
packing = False, # Can make training 5x faster for short sequences.
args = TrainingArguments(
per_device_train_batch_size = 2,
gradient_accumulation_steps = 4,
warmup_steps = 5,
# num_train_epochs = 1, # Set this for 1 full training run.
max_steps = 25,
learning_rate = 2e-4,
fp16 = not is_bfloat16_supported(),
bf16 = is_bfloat16_supported(),
logging_steps = 1,
optim = "adamw_8bit",
weight_decay = 0.01,
lr_scheduler_type = "linear",
seed = 3407,
output_dir = OUTPUT_DIR,
report_to = "mlflow", # Use MLflow to track model metrics
),
)
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",
num_proc=1)
トレーニングループを実行する
MLflow実行内でファインチューニング プロセスを実行し、トレーニング メトリクス (損失、学習率など) とシステム メトリクス (GPU 使用率、メモリ使用量) を自動的に追跡します。 トレーナーで設定された 25 ステップのトレーニング実行。チェックポイントはUnity Catalogボリュームに保存されます。
import mlflow
with mlflow.start_run(
run_name='finetune-llama-3.2-3b-unsloth',
log_system_metrics=True
):
trainer.train()
LoRAアダプターをマージしてUnity Catalogに登録する
トレーニング済みの LoRA アダプターの重みを基本モデルと組み合わせて、単一の展開可能なモデルを作成します。マージされたモデルはMLflowに記録され、チャット タスク タイプでUnity Catalogに登録され、モデルサービング エンドポイントにデプロイできるようになります。
mlflow_run_id = mlflow.last_active_run().info.run_id
merged_model = model.merge_and_unload()
# Create Unity Catalog model name
full_model_name = f"{UC_CATALOG}.{UC_SCHEMA}.{UC_MODEL_NAME}"
try:
with mlflow.start_run(run_id = mlflow_run_id):
model_info = mlflow.transformers.log_model(
transformers_model={'model': merged_model, 'tokenizer': tokenizer},
name='model',
registered_model_name=full_model_name, # TODO: Replace with your own model name!
await_registration_for=3600,
task='llm/v1/chat',
)
print(f"✓ Model successfully registered in Unity Catalog: {full_model_name}")
print(f"✓ MLflow model URI: {model_info.model_uri}")
print(f"✓ Model version: {model_info.version}")
except Exception as e:
print(f"✗ Model registration failed: {e}")
print("Model is still saved locally and can be registered manually")
print(f"Local model path: {OUTPUT_DIR}")
次のステップ
微調整されたモデルが Unity Catalog に登録され、提供できる状態になりました。モデルのデプロイと使用の詳細については、以下をご覧ください。