Fine-tuning
Unsloth en profondeur : fine-tuning rapide et GGUF dynamiques
Comment Unsloth accélère le fine-tuning LoRA et produit des GGUF Dynamic supérieurs, avec un exemple sur Qwen3.6-27B.
Unsloth est un framework d’optimisation qui accélère drastiquement le fine-tuning et produit des quantifications GGUF de qualité supérieure grâce à sa technique de Dynamic Quantization. C’est l’outil de référence pour entraîner des modèles sur GPU consumer, et la source des GGUF « UD- » que SoberCloud utilise en production.
Pourquoi Unsloth ?
Unsloth optimise les kernels d’entraînement et les workflows LoRA pour offrir des gains substantiels sans sacrifier la qualité. Sur du matériel grand public, les ordres de grandeur typiques sont :
- environ 2× plus rapide à l’entraînement ;
- jusqu’à -70 % de VRAM utilisée ;
- aucune perte de précision mesurable par rapport à un fine-tuning classique.
Dynamic Quantization — le secret d’Unsloth
La Dynamic Quantization d’Unsloth ne quantifie pas tous les paramètres de la même manière. Elle analyse chaque couche et applique une précision variable selon son importance.
Principe de base
- Les couches
down_proj(surtout les premières) sont les plus sensibles à la quantification. - Unsloth garde ces couches critiques en 8 ou 16 bits.
- Les couches moins importantes sont quantifiées plus agressivement (1 à 6 bits).
- Résultat : compression maximale avec qualité préservée.
Dynamic 2.0
La version 2.0 étend la quantification dynamique à tous les modèles (pas seulement les MoE) et optimise chaque couche individuellement avec un « quant plan » spécifique par architecture.
Sur un MoE comme Qwen3.6-35B-A3B (3B actifs par token), cette logique est particulièrement utile : seuls quelques experts s’activent à chaque pas, et préserver les routeurs et les couches down_proj critiques en haute précision évite l’effondrement de qualité qu’on observe avec une quantification uniforme agressive. Sur un dense comme Qwen3.6-27B, le « quant plan » répartit le budget de bits entre attention et MLP couche par couche.
Nomenclature des fichiers Unsloth
Qwen3.6-27B-Instruct-UD-Q4_K_XL.gguf
│ │ │
│ │ └── XL = blocs Extra Large
│ └── Q4_K = base K-quant 4-bit
└── UD = Unsloth Dynamic
Qwen3.6-35B-A3B-UD-IQ2_M.gguf
│ │
│ └── IQ2_M = quant 2-bit (importance-aware)
└── UD = Unsloth Dynamic
Utiliser Unsloth pour le fine-tuning
from unsloth import FastLanguageModel
from trl import SFTTrainer
from transformers import TrainingArguments
from datasets import load_dataset
# Charger le modèle optimisé Unsloth (4-bit automatique)
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/Qwen3.6-27B-Instruct-bnb-4bit",
max_seq_length=8192,
load_in_4bit=True,
)
# Ajouter les adaptateurs 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,
use_gradient_checkpointing="unsloth", # Économise ~30 % de VRAM
)
dataset = load_dataset("json", data_files="train.json")
trainer = SFTTrainer(
model=model,
train_dataset=dataset["train"],
dataset_text_field="text",
max_seq_length=2048,
args=TrainingArguments(
per_device_train_batch_size=2,
gradient_accumulation_steps=4,
warmup_steps=5,
max_steps=60,
learning_rate=2e-4,
fp16=True,
output_dir="outputs",
),
)
trainer.train()
Exporter en GGUF
Après l’entraînement, Unsloth facilite l’export vers différents formats :
# Option A : export GGUF direct
model.save_pretrained_gguf(
"model-gguf",
tokenizer,
quantization_method="q4_k_m" # ou "q8_0", "f16"
)
# Option B : merge LoRA puis export
model.save_pretrained_merged(
"model-merged",
tokenizer,
save_method="merged_16bit"
)
# Puis conversion manuelle avec llama.cpp pour plus de contrôle
# ./llama-quantize model-merged/model.safetensors output.gguf Q4_K_M
Le GGUF obtenu se charge ensuite directement dans llama.cpp, Ollama ou LM Studio.
Unsloth Dynamic vs GGUF standard
| Modèle | Type | Taille | Perplexité | Benchmark |
|---|---|---|---|---|
| Dense 8B | Q4_K_M standard | 4.9 Go | Baseline | Baseline |
| Dense 8B | UD-Q4_K_M | ~5.1 Go | -0.15 | +2.3 % |
| MoE 671B | Standard Q2 | ~180 Go | Baseline | Baseline |
| MoE 671B | UD-IQ1.58 | 192 Go | -0.3 | Supérieur |
À taille quasi identique, la variante Dynamic récupère une part significative de la qualité perdue par une quantification uniforme : l’écart de perplexité se resserre et les scores de benchmark remontent.
Hardware supporté
Unsloth supporte les GPU NVIDIA (CUDA), AMD (ROCm) et Intel. Apple Silicon n’est pas supporté pour le fine-tuning local (utilisez MLX dans ce cas). En revanche, les GGUF exportés fonctionnent ensuite partout via llama.cpp ou MLX, y compris sur le backend Vulkan d’un iGPU Strix Halo.
C’est précisément cet écosystème que SoberCloud réutilise : on ne ré-entraîne pas systématiquement, mais on s’appuie sur les GGUF « UD- » (Unsloth Dynamic) et sur les presets de sampling d’Unsloth pour servir des modèles quantifiés de qualité, notamment sur Strix Halo.