Qwen3-4B の完全なファインチューニング
単一の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 コンピュートに接続するには:
- ノートブックの 接続 ドロップダウンメニューをクリックし、 サーバレス GPU を選択します。
- アクセラレーターとして 1x H100 GPUを選択します。
- **環境**パネルを開き、**AI v5**をベース環境として選択します。
- [適用] をクリックします。
情報については、GPU コンピュートのドキュメントを参照してください。
ライブラリをインポートします
Databricks AI v5 環境には、この例に必要なすべてのライブラリ(trl、transformers、datasets、mlflowなど)がすでに含まれているため、追加のインストールは不要です。
次のセルでは、モデルのトレーニング、データセットの処理、MLflowトラッキングに必要なライブラリをインポートします。
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ステップごとにメトリクスをログに記録します
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に分割します
- **データ検証**:会話型ファインチューニングのための適切なフォーマットを保証します。
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トークンに設定します。
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ステップごとに評価します。
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}
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にファインチューニング済みモデルを登録します。
モデル登録ワークフロー
- トレーニング済みモデルの読み込み :保存されたフルウェイトモデルとトークナイザーを読み込みます
- ログ記録の準備 :モデルとトークナイザーを含むトランスフォーマーモデル辞書を作成します。
- **Unity Catalogに登録**:MLflowに記録し、Unity Catalogに登録します
- **メタデータを追加**:タスクタイプ、モデルファミリー、サイズ情報を含みます。
Unity Catalog登録のメリット
- ガバナンス :アクセス制御とリネージ追跡を備えた一元化されたモデルレジストリ
- **バージョン管理**:モデルライフサイクルの自動バージョン管理
- デプロイ : モデルサービングエンドポイントへの簡単なデプロイ
- 検出可能性 :モデルはUnity Catalogで検索・文書化されます
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に登録されました。次に、次のことが可能です。
- モデルをデプロイする :Model Servingでモデルを提供する
- 分散トレーニングの詳細 : マルチGPUおよびマルチノード分散トレーニング
- エクスペリメントを追跡し、GPUを監視する :エクスペリメントの追跡と観察可能性
- **問題のトラブルシューティング**:サーバレスGPUコンピュートでの問題のトラブルシューティング