# Knowledge Distillation Knowledge Distillation is a machine learning technique where a compact "student" model learns to replicate the behavior of a larger, more complex "teacher" model to achieve comparable performance with improved efficiency. Model Optimizer's Distillation is a set of wrappers and utilities to easily perform Knowledge Distillation among teacher and student models. Given a pretrained teacher model, Distillation has the potential to train a smaller student model faster and/or with higher accuracy than the student model could achieve on its own. This section focuses on demonstrating how to apply Model Optimizer to perform knowledge distillation with ease.
| **Section** | **Description** | **Link** | **Docs** | | :------------: | :------------: | :------------: | :------------: | | Pre-Requisites | Required & optional packages to use this technique | \[[Link](#pre-requisites)\] | | | Getting Started | Learn how to optimize your models using distillation to produce more intellegant smaller models | \[[Link](#getting-started)\] | \[[docs](https://nvidia.github.io/Model-Optimizer/guides/4_distillation.html)\] | | Support Matrix | View the support matrix to see compatibility and feature availability across different models | \[[Link](#support-matrix)\] | | | Distillation with Megatron-Bridge | Learn how to distill your models with Megatron-Bridge Framework | \[[Link](#knowledge-distillation-kd-in-nvidia-megatron-bridge-framework)\] | \[[docs](https://nvidia.github.io/Model-Optimizer/guides/4_distillation.html)\] | | Distillation with Megatron-LM | Learn how to distill your models with Megatron-LM Framework | \[[Link](#knowledge-distillation-kd-in-nvidia-megatron-lm-framework)\] | | | Distillation with Huggingface | Learn how to distill your models with Hugging Face | \[[Link](#knowledge-distillation-kd-for-huggingface-models)\] | \[[docs](https://nvidia.github.io/Model-Optimizer/guides/4_distillation.html)\] | | Resources | Extra links to relevant resources | \[[Link](#resources)\] | |
## Pre-Requisites ### Docker For Hugging Face models, please use the PyTorch docker image (e.g., `nvcr.io/nvidia/pytorch:26.01-py3`). Visit our [installation docs](https://nvidia.github.io/Model-Optimizer/getting_started/2_installation.html) for more information. Also follow the installation steps below to upgrade to the latest version of Model Optimizer and install example-specific dependencies. ### Local Installation For Hugging Face models, install Model Optimizer with `hf` dependencies using `pip` from [PyPI](https://pypi.org/project/nvidia-modelopt/) and install the requirements for the example: ```bash pip install -U nvidia-modelopt[hf] pip install -r requirements.txt ``` ## Getting Started ### Set up your base models First obtain both a pretrained model to act as the teacher and a (usually smaller) model to serve as the student. ```python from transformers import AutoModelForCausalLM # Define student & teacher student_model = AutoModelForCausalLM.from_pretrained("student-model-id-or-path") teacher_model = AutoModelForCausalLM.from_pretrained("teacher-model-id-or-path") ``` ### Set up the KDTrainer For HuggingFace models, ModelOpt provides `KDTrainer`, a drop-in replacement for HuggingFace's `Trainer` that handles the teacher forward pass and KD loss computation internally. Unlike the general-purpose Distillation API, `KDTrainer` does **not** call `mtd.convert()` and does not wrap the student in a `DistillationModel` — the student stays a plain HuggingFace model, and the teacher is kept on the trainer and forwarded explicitly during loss computation. ```python from modelopt.torch.distill.plugins.huggingface import KDTrainer trainer = KDTrainer( student_model, training_args, distill_args={"teacher_model": teacher_model}, # criterion defaults to "logits_loss" train_dataset=train_dataset, eval_dataset=eval_dataset, ) ``` `KDTrainer` can be mixed in with other HuggingFace trainers (e.g. `SFTTrainer`) via normal Python multiple inheritance, as done in [`main.py`](main.py): ```python class KDSFTTrainer(KDTrainer, SFTTrainer): pass ``` > [!NOTE] > `KDTrainer` currently only supports logit-level (output) distillation. Hidden-state / intermediate-layer > distillation is not yet supported by `KDTrainer`. Until that support lands, use `mtd.convert()` and > `DistillationModel` directly (see [Distillation](https://nvidia.github.io/Model-Optimizer/guides/4_distillation.html)) > for hidden-state KD. ### Distill during training Since `KDTrainer` overrides `compute_loss()` to run the teacher forward pass and compute the KD loss, training is just the normal HuggingFace `Trainer` loop — no manual loss computation is required: ```python trainer.train() ``` > [!NOTE] > `compute_loss()` returns the KD loss on its own; it does not combine it with the original student > cross-entropy loss. Weighted combination of CE and KD losses is not yet supported by `KDTrainer`, though it > is a planned feature. During evaluation, the CE loss is still computed and reported separately as the > `eval_ce_loss` metric. > [!NOTE] > `KDTrainer` requires FSDP2 when FSDP is enabled; FSDP1 is not supported. Note that HuggingFace Trainer uses > DataParallel by default, which may break distributed teacher/student forwarding — use FSDP2, DeepSpeed, or DDP > instead (see [`accelerate_config/fsdp2.yaml`](accelerate_config/fsdp2.yaml)). ### Export trained model Because the student is never wrapped in a `DistillationModel`, no `mtd.export()` step is needed — `trainer.save_model()` saves the student directly in its original HuggingFace format. ```python trainer.save_model(training_args.output_dir) ``` ## Support Matrix ### Current out of the box components Loss criterion: - `mtd.LogitsDistillationLoss()` - Standard KL-Divergence on output logits - `mtd.MGDLoss()` - Masked Generative Distillation loss for 2D convolutional outputs - `mtd.MFTLoss()` - KL-divergence loss with Minifinetuning threshold modification Loss balancers: - `mtd.StaticLossBalancer()` - Combines original student loss and KD loss into a single weighted sum (without changing over time) ### Supported Models > [!NOTE] > The following are models that were confirmed to run with ModelOpt distillation, but it is absolutely not limited to these | Model | type | confirmed compatible | | :---: | :---: | :---: | | Nemotron | mamba hybrid | ✅ | | Llama 3 | llama | ✅ | | Llama 4 | llama | ✅ | | Gemma 2 | gemma | ✅ | | Gemma 3 | gemma | ✅ | | Phi 3 | phi | ✅ | | Qwen 2 | qwen2 | ✅ | | Qwen 3 | qwen3 | ✅ | | Mamba | mamba | ✅ | ## Knowledge Distillation (KD) in NVIDIA Megatron-Bridge Framework Checkout the stand-alone distillation script in the [examples/megatron_bridge/](../megatron_bridge/README.md) for example scripts for KD with Megatron-Bridge which is generally more performant than the Hugging Face scripts. ## Knowledge Distillation (KD) in NVIDIA Megatron-LM Framework Checkout the Knowledge Distillation example in the [Megatron-LM repository](https://github.com/NVIDIA/Megatron-LM/tree/main/examples/post_training/modelopt). ## Knowledge Distillation (KD) for HuggingFace Models In this e2e example we finetune Llama-3.2 models on the [smol-smoltalk-Interaction-SFT](https://huggingface.co/datasets/ReactiveAI/smol-smoltalk-Interaction-SFT) dataset as a minimal example to demonstrate a simple way of integrating Model Optimizer's KD feature. We replace normal supervised finetuning (SFT) of a Llama-3.2-1B base model by distilling information from Llama-3.2-3B-Instruct which has already been instruction-finetuned. > [!NOTE] > We can fit the following in memory using [FSDP](https://huggingface.co/docs/accelerate/en/usage_guides/fsdp) enabled on 8x RTX 6000 (total ~400GB VRAM) ```bash accelerate launch --config-file ./accelerate_config/fsdp2.yaml \ main.py \ --teacher_name_or_path 'meta-llama/Llama-3.2-3B-Instruct' \ --student_name_or_path 'meta-llama/Llama-3.2-1B' \ --output_dir ./llama3.2-distill \ --max_length 2048 \ --per_device_train_batch_size 4 \ --per_device_eval_batch_size 8 \ --max_steps 200 \ --logging_steps 5 ``` ## Resources - 📅 [Roadmap](https://github.com/NVIDIA/Model-Optimizer/issues/1699) - 📖 [Documentation](https://nvidia.github.io/Model-Optimizer) - 🎯 [Benchmarks](../benchmark.md) - 💡 [Release Notes](https://nvidia.github.io/Model-Optimizer/reference/0_changelog.html) - 🐛 [File a bug](https://github.com/NVIDIA/Model-Optimizer/issues/new?template=1_bug_report.md) - ✨ [File a Feature Request](https://github.com/NVIDIA/Model-Optimizer/issues/new?template=2_feature_request.md)