极客说|Unsloth 的全微调之路:从 Adapter 到 Full Fine-tuning
「极客说」 是一档专注 AI 时代开发者分享的专栏,我们邀请来自微软以及技术社区专家,带来最前沿的技术干货与实践经验。在这里,您将看到深度教程、最佳实践和创新解决方案。关注「极客说」,与行业顶尖专家一起探索科技的无限可能!
本文完整的测试代码位置https://github.com/xinyuwei-david/david-share/tree/master/Deep-Learning/Unsloth-Full-SFT
GitHub repohttps://github.com/xinyuwei-david/david-share.git
大语言模型(LLM)最近发展得非常快,一动就是好几亿甚至上百亿的参数,让很多 AI 工程师在微调这些大模型时犯了难。Unsloth 这个框架,原本主要是靠支持 LoRA、QLoRA 等 Adapter 微调而出名,重点就是省内存、训练快。现在它又更进一步,支持了全参数微调(Full Fine-tuning),也就是说,单卡环境就能搞定大规模模型的完整训练。接下来我想聊一聊 Unsloth 全微调的背景、它用到的关键技术,以及在实际工程中怎么把它用好。
从 LoRA/QLoRA 到 Full Fine-tuning:Unsloth 的进化历程
初期聚焦
LoRA & QLoRA 早期的 Unsloth 仅支持基于 LoRA/QLoRA 的适配器微调(Adapter Fine-tuning)。它通过动态量化、稀疏优化、梯度检查点等技术手段,大幅减少显存占用,让工程师能在单卡或少卡环境下,对 LLM 进行有效训练。
为什么最初只支持 Adapter 微调?
-
实惠的硬件门槛:Adapter 微调只需更新部分额外参数,不必动用整套模型,从而有效减少 GPU 显存需求和训练开销。
-
高性价比:对于大部分应用场景来说,使用 LoRA/QLoRA 得到的微调效果已足以解决“任务定制”需求,而且成本远低于全量微调。
-
工程实现相对简单:无须管理全部模型权重的更新和保存,只需管理 LoRA 等附加层的参数即可。
全参数微调走上日程 随着用户对微调需求的精细化、对模型性能的极致追求,以及在更大规模的 LLM 上进行高保真的领域适配需求日益增长,Unsloth 社区在 2024 ~ 2025 年间逐步加入了对 full fine-tuning 的支持,使得你无需额外插入Adapter,也能直接训练整个模型的全部参数。
Unsloth 全微调:关键技术解析
梯度检查点(Gradient Checkpointing)
-
在单 GPU 进行全微调时,重新计算部分前向激活以节省显存成为了必然需求。
-
PyTorch 本身提供了 checkpoint 工具,但 Unsloth 在此基础上做了更深入的工程优化,大幅降低部分场景下的额外重算开销。
激活值卸载(Activation Offloading)
当显存不足时,将部分激活值转存到 CPU 内存。Unsloth 会智能地在训练过程中安排卸载与回传时机,确保在最“恰当”的时刻介入,从而减小对训练速度的冲击。
优化器状态分页(Optimizer Paging)
-
在大模型训练中,单卡不仅需要存储模型本身的参数,还要存储优化器状态,这也是显存占用的一大来源。
-
通过 8-bit 甚至更低精度的优化器(如 paged_adamw_8bit),即能把部分优化器状态分页至 CPU,释放 GPU 显存,进一步帮助单卡支持更大规模的模型。
工程上的部署实例与硬件选择
以常用的 H100 94GB,H200 141GB, AMD MI300X 192 为例:
- Unsloth 已默认开启多种优化机制(包括梯度检查点与分页式优化器),一般情况下无需额外配置。
-
全参数微调时显存压力高于 LoRA/QLoRA 等适配器方法,特别需注意的是:
-
若单卡 GPU 显存不足(低于80GB),请务必维持分页优化器(Paged Optimizer)默认开启的状态。
-
适当减小 batch size 通常会减少激活值卸载频率,从而获得整体更高的训练速度。
-
-
实际微调过程建议进行小规模实验验证,逐步调整相关超参数(batch size、序列长度等),结合自身的硬件配置和应用场景找到最佳性能与内存占用平衡点。
为什么不直接自己实现这些内存优化?
-
维护难度高:手动在代码层面开发 offload、checkpoints 等逻辑,面对不同版本的 PyTorch / CUDA / 驱动,以及不同模型结构,调试复杂度极高,且易产生潜在内存泄露、兼容性问题。
-
社区打磨与更新:Unsloth 在社区中已有大量真实使用场景与案例,经过了版本迭代与优化,加之官方维护的更新日志(release notes),更易确保长久可用与持续优化。
-
专注业务逻辑:使用 Unsloth 可将时间投入到数据集清洗、任务工程化、下游效果评估,而不是消耗在重复开发类似的底层内存管理功能上。
最佳实践:如何平衡内存占用与训练效率
保持小 Batch Size(1~2 常见)
-
过大的 batch size 会导致 Unsloth 频繁进行激活值卸载,反而拖慢训练速度。
-
在单 GPU 场景中,小 batch + 累积梯度(gradient_accumulation_steps) 通常更优。
分阶段调试
-
先用小模型、短序列长度跑通流程,观察 GPU 负载与日志,用以确认 offloading 时机与显存开销。
-
一旦找到稳定训练配置,再逐步扩展到更大模型或更长序列。
充分启用 paged optimizer
对于全参数微调而言,优化器状态空间非常可观,将其分页至 CPU,可以显著降低 GPU 显存峰值占用。
资料推荐
智能 GitHub Copilot 副驾驶® 提示和技巧https://info.microsoft.com/GC-DevOps-CNTNT-FY25-08Aug-23-Smart-GitHub-Copilot-Tips-and-Tricks-SRGCM12801_LP01-Registration---Form-in-Body.htmlhttps://info.microsoft.com/GC-DevOps-CNTNT-FY25-08Aug-23-Smart-GitHub-Copilot-Tips-and-Tricks-SRGCM12801_LP01-Registration---Form-in-Body.html
Azure OpenAI 生成式人工智能白皮书https://info.microsoft.com/GC-AzureAI-CNTNT-FY25-08Aug-21-Azure-OpenAI-Generative-Artificial-Intelligence-White-Paper-SRGCM12789_LP01-Registration---Form-in-Body.htmlhttps://info.microsoft.com/GC-AzureAI-CNTNT-FY25-08Aug-21-Azure-OpenAI-Generative-Artificial-Intelligence-White-Paper-SRGCM12789_LP01-Registration---Form-in-Body.html
利用 AI 和 DevOps 重新定义开发人员体验https://info.microsoft.com/ww-landing-redefining-the-developer-experience.html?lcid=ZH-CNhttps://info.microsoft.com/ww-landing-redefining-the-developer-experience.html?lcid=ZH-CN
SAP on Microsoft Cloudhttps://info.microsoft.com/GC-SAP-CNTNT-FY25-08Aug-27-SAP-on-Microsoft-Cloud-SRGCM12804_LP01-Registration---Form-in-Body.htmlhttps://info.microsoft.com/GC-SAP-CNTNT-FY25-08Aug-27-SAP-on-Microsoft-Cloud-SRGCM12804_LP01-Registration---Form-in-Body.html