メインコンテンツまでスキップ

Qwen3-4B の完全なファインチューニング

Open in Databricks

単一のH100 GPUでQwen3-4B大規模言語モデルをフルファインチューニングします。このウォークスルーでは、次の方法を示します:

  • 完全なファインチューニング を実行します。これは、データへの最大適応のためにすべてのモデルパラメーターを更新します。
  • 追加のライブラリをインストールせずに、**Databricks AI v5環境**を使用します。
  • 教師ありファインチューニングに**TRL (Transformer Reinforcement Learning)** を活用します。
  • ガバナンスとデプロイのために、ファインチューニングされたモデルをUnity Catalogに登録します。

主要な概念:

  • フル ファインチューニング :すべてのモデルの重みを更新し、パラメーター効率の高い手法よりも多くのメモリとコンピュートを要する代わりに、データセットから学習するための最大の क्षमताをモデルに与えます
  • TRL: 強化学習と教師ありファインチューニングによる言語モデルのトレーニング用ライブラリ
  • メモリ効率の高いトレーニング :BF16混合精度と勾配チェックポイントを使用して、40億パラメーターのフルファインチューニングを単一のH100 GPUに適合させます

フル ファインチューニングと LoRA の判断表

このノートブックでは、すべてのモデルパラメーターを更新する**フルファインチューニング**を使用します。代替として、LoRA (Low-Rank Adaptation) はベースモデルをフリーズし、小さなアダプターレイヤーのみをトレーニングする。

シナリオ

推奨事項

理由:

主要なモデルの動作変更

フルファインチューニング

モデルの動作への根本的な変更のために、すべてのパラメーターを更新します。

単一のタスクにおける最高の品質

フルファインチューニング

低ランク近似がないため、モデルは完全に適応する能力を持っています。

GPUメモリが制限されています。

LoRA

パラメーターの約1%のみをトレーニングすることで、より大きなモデルをメモリに収めます。

複数のタスク固有のアダプター

LoRA

同じベースモデル上で異なるアダプターをスワップする

4Bパラメーターのモデルをフル ファインチューニングするには、オプティマイザー状態と勾配がすべてのパラメーターに対して保持されるため、LoRAよりも大幅に多くのGPUメモリが必要です。このノートブックでは、 BF16混合精度勾配チェックポイント保存 を使用しているため、トレーニングは単一のH100(80 GB)GPUに収まります。

サーバレス GPU コンピュートに接続する

サーバレス GPU コンピュートに接続するには:

  1. ノートブックの 接続 ドロップダウンメニューをクリックし、 サーバレス GPU を選択します。
  2. アクセラレーターとして 1x H100 GPUを選択します。
  3. **環境**パネルを開き、**AI v5**をベース環境として選択します。
  4. [適用] をクリックします。

情報については、GPU コンピュートのドキュメントを参照してください。

ライブラリをインポートします

Databricks AI v5 環境には、この例に必要なすべてのライブラリ(trltransformersdatasetsmlflowなど)がすでに含まれているため、追加のインストールは不要です。

次のセルでは、モデルのトレーニング、データセットの処理、MLflowトラッキングに必要なライブラリをインポートします。

Python
from datasets import load_dataset
from transformers import AutoModelForCausalLM, AutoTokenizer
from trl import (
SFTConfig,
SFTTrainer,
setup_chat_format
)
import torch
import mlflow

構成のセットアップ

Unity Catalogとの統合

次のセルでは、ファインチューニングされたモデルが保存および登録される場所を設定します:

  • **カタログ & スキーマ**:Unity Catalogネームスペース内でモデルを整理します(デフォルト:main.default )。
  • モデル名 : ガバナンスとデプロイのためのUnity Catalogに登録されたモデル名
  • **ボリューム**:トレーニング中にモデルのチェックポイントを保存するためのUnity Catalogボリューム

これらのウィジェットを使用すると、コードを編集せずにストレージの場所をカスタマイズできます。モデルは、簡単にアクセスしてバージョン管理できるよう、{catalog}.{schema}.{model_name}として登録されます。

トレーニングのハイパーパラメーター

このセルは主要なトレーニングパラメーターも定義しています:

  • モデルとデータセット :Qwen3-4BとCapybara対話データセット
  • バッチサイズ (1) : トレーニングステップあたりのGPUごとの例の数。完全なファインチューニングをメモリに収めるために小さく保たれます。
  • **勾配蓄積 (8)**:有効バッチサイズ8のために8つのバッチにわたって勾配を蓄積します
  • **学習率 (2e-5)**:完全なファインチューニングに適した控えめなレート。
  • 最大ステップ数(50) :高速なデモンストレーション実行のため、トレーニングを50ステップに制限します
  • ログ記録とチェックポイント保存 :25ステップごとに進捗を保存し、10ステップごとにメトリクスをログに記録します
Python
dbutils.widgets.text("uc_catalog", "main")
dbutils.widgets.text("uc_schema", "default")
dbutils.widgets.text("uc_model_name", "qwen3_4b_assistant")
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}")

# MLflow and Unity Catalog configuration

# Model selection
MODEL_NAME = "Qwen/Qwen3-4B"
DATASET_NAME = "trl-lib/Capybara"
OUTPUT_DIR = f"/Volumes/{UC_CATALOG}/{UC_SCHEMA}/{UC_VOLUME}/{UC_MODEL_NAME}"

# Training hyperparameters
BATCH_SIZE = 1
GRADIENT_ACCUMULATION_STEPS = 8
LEARNING_RATE = 2e-5
MAX_STEPS = 50
EVAL_STEPS = 25
LOGGING_STEPS = 10
SAVE_STEPS = 25

データセットの読み込みと準備

次のセルは、トレーニングデータセットを読み込み、ファインチューニングの準備をします。

  • データセットtrl-lib/Capybara - 指示追従向けに最適化された高品質の会話データ
  • **トレーニングする/検証分割**:テストセットが存在しない場合、90/10に分割します
  • **データ検証**:会話型ファインチューニングのための適切なフォーマットを保証します。
Python
dataset = load_dataset(DATASET_NAME)
print(f"✓ Dataset loaded: {dataset}")

if "test" not in dataset:
print("Creating validation split from training data...")
dataset = dataset["train"].train_test_split(test_size=0.1, seed=42)
print("✓ Data split: 90% train, 10% validation")

モデルとトークナイザーの初期化

次のセルでは、ベースモデルとトークナイザーを読み込み、その後、会話用のファインチューニングに構成します:

  • モデルの読み込み :Hugging FaceからBF16精度でQwen3-4Bをダウンロードします
  • **トークナイザのセットアップ**:適切なパディングで高速トークナイザを設定します。
  • チャット形式のフォーマット :トークナイザーでまだ定義されていない場合、構造化された会話にチャットテンプレートを適用します
  • トークン設定 : 適切なシーケンス処理のために、パディングトークンをEOSトークンに設定します。
Python
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
torch_dtype=torch.bfloat16,
trust_remote_code=True,
)

tokenizer = AutoTokenizer.from_pretrained(
MODEL_NAME,
trust_remote_code=True,
use_fast=True
)

# Chat template formatting for conversational fine-tuning
if tokenizer.chat_template is None:
print("Adding chat template for proper conversation formatting...")
model, tokenizer = setup_chat_format(model, tokenizer, format="chatml")
print("✓ ChatML format applied for structured conversations")

if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
print("✓ Padding token set to EOS token")

print("✓ Model and tokenizer loaded successfully")

モデルをトレーニングする

次のセルでは、フルファインチューニングプロセスを設定し、実行します:

トレーニング構成

  • バッチ構成 : デバイスあたり1サンプル、勾配蓄積ステップ8回(実効バッチサイズ: 8)
  • 最適化 :ウォームアップステップ、重み減衰、評価損失に基づく最適なモデル選択
  • ログ記録 :エクスペリメント トラッキングのためにメトリクスを MLflow に報告します

主要な最適化の有効化

  • BF16混合精度 :より少ないメモリ使用量で高速なコンピュートを実現し、H100 GPUに適しています
  • 勾配チェックポイント : 追加のコンピュートを活性化メモリの大幅な削減と交換し、それにより4Bの完全なファインチューニングが単一のH100に収まるようにします。
  • グレディエントアキュムレーション :安定したトレーニングのために、より大きなバッチサイズをシミュレートします。
  • チェックポイント処理 :25ステップごとにモデルを保存し、チェックポイントは2個までに制限されます

トレーニングループは10ステップごとに進行状況をログに記録し、25ステップごとに評価します。

Python
with mlflow.start_run(run_name=f"{MODEL_NAME}_full-fine-tuning", log_system_metrics=True):
try:
print(f"Learning rate: {LEARNING_RATE}")

training_args_dict = {
"output_dir": OUTPUT_DIR,
"per_device_train_batch_size": BATCH_SIZE,
"per_device_eval_batch_size": BATCH_SIZE,
"gradient_accumulation_steps": GRADIENT_ACCUMULATION_STEPS,
"learning_rate": LEARNING_RATE,
"max_steps": MAX_STEPS,
"eval_steps": EVAL_STEPS,
"logging_steps": LOGGING_STEPS,
"save_steps": SAVE_STEPS,
"save_total_limit": 2,
"report_to": "mlflow", # Log to MLflow
"warmup_steps": 10,
"weight_decay": 0.01,
"metric_for_best_model": "eval_loss",
"greater_is_better": False,
"eval_strategy": "steps", # Run evaluation every eval_steps
"save_strategy": "steps", # Checkpoint on the same cadence as eval
"load_best_model_at_end": True, # Register the best-eval checkpoint, not the last
"dataloader_pin_memory": False,
"remove_unused_columns": False,
"bf16": True, # Mixed precision training
"gradient_checkpointing": True, # Reduce activation memory for full fine-tuning
"gradient_checkpointing_kwargs": {"use_reentrant": False},
}

training_args = SFTConfig(**training_args_dict)

trainer = SFTTrainer(
model=model,
args=training_args,
train_dataset=dataset["train"],
eval_dataset=dataset["test"],
processing_class=tokenizer,
)

print("\n" + "="*50)
print("STARTING TRAINING")
print("="*50)

print("🚀 Full fine-tuning Qwen3-4B on a single H100 GPU")

trainer.train()
print("\n✓ Training completed successfully!")

except Exception as e:
print(f"✗ Training failed: {e}")
raise

モデルアーティファクトの保存

次のセルは、トレーニング済みモデルとトークナイザをUnity Catalogボリュームに保存します。

  • **完全なモデルの重み**:完全なファインチューニング済みモデルを保存し、推論のために直接ロードする準備ができています。
  • トークナイザー : 推論のためのトークナイザー設定を保存します。
  • ストレージロケーション :保存先 /Volumes/{catalog}/{schema}/{volume}/{model_name}
Python
try:
print("\nSaving trained model...")

trainer.save_model(training_args.output_dir)
print("✓ Full model weights saved")

tokenizer.save_pretrained(training_args.output_dir)
print("✓ Tokenizer saved with model")
print(f"\n🎉 All artifacts saved to: {training_args.output_dir}")

except Exception as e:
print(f"✗ Model saving failed: {e}")
raise

Unity Catalogにモデルを登録する

次のセルは、ガバナンスとデプロイのためにUnity Catalogにファインチューニング済みモデルを登録します。

モデル登録ワークフロー

  1. トレーニング済みモデルの読み込み :保存されたフルウェイトモデルとトークナイザーを読み込みます
  2. ログ記録の準備 :モデルとトークナイザーを含むトランスフォーマーモデル辞書を作成します。
  3. **Unity Catalogに登録**:MLflowに記録し、Unity Catalogに登録します
  4. **メタデータを追加**:タスクタイプ、モデルファミリー、サイズ情報を含みます。

Unity Catalog登録のメリット

  • ガバナンス :アクセス制御とリネージ追跡を備えた一元化されたモデルレジストリ
  • **バージョン管理**:モデルライフサイクルの自動バージョン管理
  • デプロイ : モデルサービングエンドポイントへの簡単なデプロイ
  • 検出可能性 :モデルはUnity Catalogで検索・文書化されます
Python
mlflow_run_id = mlflow.last_active_run().info.run_id
print("\nRegistering model with MLflow and Unity Catalog...")

with mlflow.start_run(run_id=mlflow_run_id):
try:
# Load the trained full-weight model for registration
print("Loading fine-tuned model for registration...")
trained_model = AutoModelForCausalLM.from_pretrained(
training_args.output_dir,
torch_dtype=torch.bfloat16,
trust_remote_code=True
)
tokenizer = AutoTokenizer.from_pretrained(training_args.output_dir)
model_type = "Full fine-tuning"
size_params = "4b"

# Prepare transformers model dictionary
transformers_model = {
"model": trained_model,
"tokenizer": tokenizer
}

# Create Unity Catalog model name
full_model_name = f"{UC_CATALOG}.{UC_SCHEMA}.{UC_MODEL_NAME}"

print(f"Registering model as: {full_model_name}")

# Start MLflow run and log model
task = "llm/v1/chat"
model_info = mlflow.transformers.log_model(
transformers_model=transformers_model,
task=task,
registered_model_name=full_model_name,
metadata={
"task": task,
"pretrained_model_name": MODEL_NAME,
"databricks_model_family": "Qwen3ForCausalLM",
"databricks_model_size_parameters": size_params,
},
repo_type="local", # Fix: specify repo_type for local path
)

print(f"✓ Model successfully registered in Unity Catalog: {full_model_name}")
print(f"✓ MLflow model URI: {model_info.model_uri}")

# Print deployment information
print(f"\n📦 Model Registration Complete!")
print(f"Unity Catalog Path: {full_model_name}")
print(f"Model Type: {model_type}")

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: {training_args.output_dir}")
raise

次のステップ

Qwen3-4Bモデルは、完全な重みのファインチューニングで正常にファインチューニングされ、Unity Catalogに登録されました。次に、次のことが可能です。

例のノートブック

Qwen3-4Bの完全なファインチューニング