进阶 unsloth.ai 2026-10-07 22:27:00 · 6 阅读

第21章 Unsloth 动态 4 位量化:大幅降低大模型显存占用

unsloth 下载 ☰ 下载 日志:Unsloth - 动态 4 位量化 2024 年 12 月 4 日 • 作者:Daniel & Michael 2024 年 12 月 4 日 • 作者:Daniel & Michael 你能将一个 20GB 的语言模型压缩到仅 5GB,且几乎不损失精度吗?这就需要量化技术登场。AWQ、Bitsandbytes、GPTQ 和 HQQ 等流行算法旨在压缩模型,但简单的量化往往会损害精度,导致模型无法使用。 我们很高兴介绍 Unsloth - 动态 4 位量化。该方法会在运行过程中动态决定不量化某些参数,并构建在 BitsandBytes 4 位基础之上。这种方法在仅比 BnB 4 位多占用 10% 以内 VRAM 的情况下,显著提升了精度。 2025 年 1 月更新:我们近期为微软 Phi-4 生成的动态量化模型是展示其有效性的绝佳案例。我们修复了 Phi-4 中的 bug,并将我们的动态 4 位量化模型提交到了 Hugging Face 的 OpenLLM 排行榜。我们的动态 4 位模型得分几乎与我们的 16 位版本持平,且远超标准 Bnb 4 位及微软官方的 16 位模型,特别是在 MMLU 指标上。 我们已在 Hugging Face 上传了使用此新方法量化的视觉模型(包括名为 “unsloth-bnb-4bit” 的 Llama 3.2 Vision)。诸如 Llama 3.1 (8B) 等文本模型也已上传。我们还提供了一个 Colab 笔记本,演示如何使用新的动态量化方法微调 Llama 3.2 (11B) Vision,点击此处查看。 下文测试显示,标准 4 位量化的表现甚至不如原始 16 位模型,而 Unsloth 的动态 4 位量化则提供了非常准确且可靠的结果。💔 量化可能损坏模型 Unsloth 默认使用金标准 Bitsandbytes 处理所有线性层。例如,全精度的 Llama 3.2 Vision (11B) 占用 20GB 内存,而使用 nf4 量化后仅需 6.5GB,减少了 68%。 再如,将 Qwen2 Vision (2B) 量化至 4 位会彻底破坏模型功能。经验法则建议:小模型仅使用 6 到 8 位量化,而 8B 及更大规模的模型则适用 4 位量化。
Qwen2-VL-2B-Instruct描述大小结果
16bit图片显示一列火车在铁轨上行驶。4.11GB✅
默认全部层 4bit 量化图片描绘了一个色彩鲜艳的海滨场景。1.36GB❌
Unsloth 量化图片显示一列火车在铁轨上行驶。1.81GB✅
举个例子,如果把所有层都量化到 4bit,模型会把上面的图片描述成“一个色彩鲜艳的海滨场景”,这显然是错的。而通过精心挑选、跳过部分参数的量化,模型就能恢复准确度,表现与全精度几乎一致,只多占 450MB 内存。全精度需要 4.11GB。

大多数视觉模型都带有线性投影层,如果把这些中间线性投影层的量化也全部关闭,会发现模型依然出错。
Qwen2 VL (2B) Instruct描述大小结果
关闭除线性层外全部量化图片描绘了晴朗天气下一个色彩鲜艳的海滨场景。4.11GB❌
Unsloth 量化图片显示一列火车在铁轨上行驶。1.81GB✅
从误差分析来看,Qwen2 VL 2B Instruct 在前几层存在较大的激活量化误差(左图),激活误差还有一个明显的尖峰,之后逐渐下降。同时还能看到有 1 个参数的权重量化误差很大。我们上传了动态 4bit 量化后的 Qwen2 VL 模型:Qwen 2.5 VL (2B) Instruct)、Qwen 2.5 VL (7B) Instruct。🦙 Llama 3.2 Vision 的细节Llama 3.2 11B Vision 对量化没那么敏感,所以目标是尽量逼近 16bit 精度。

Llama-3.2-Vision-11B-Instruct 描述:

描述内容 大小 结果
16bit 图片展示了一幅宁静的场景,一条木质长椅坐落在水边,一群鸟儿停在椅背上。这幅图似乎旨在捕捉自然中一个宁静的时刻。 19.87GB ✅
默认 4bit 全层 图片展示了一幅宁静的场景,一条浅色木质长椅坐落在水边,椅背上排着一只只小鸟。长椅采用横条板设计,斜向对着水面。 6.54GB 🆗 未提及图片用途
Unsloth 量化 图片展示了一幅宁静的场景,一条木质长椅坐落在水边,椅背上排着一只只小鸟。这幅图似乎旨在捕捉自然中一个宁静的时刻。 7.23GB ✅ 恢复了图片用途描述

有趣的是,4bit 量化会删除关于图片用途的描述。Unsloth 的动态量化占用内存稍多,但能重新找回对图片用途的描述!Llama 的误差分布图也很有意思。视觉编码器并没有出现极大的误差,只有一个较大的尖峰。权重量化误差的发现也很关键:除了第一层,其他所有层的交叉注意力输出投影层都不应被量化。


我们为 Llama 3.2 (11B) 视觉模型动态 4bit 量化后的结果包括:Llama 3.2 (11B) Vision Instruct、Llama 3.2 (11B) Vision Base 以及 Pixtral (12B) Vision。Pixtral 的分析过程最为引人入胜!其权重量化误差相对温和,但同样存在一个较大的尖峰。激活值误差则非常有趣:发现整个视觉编码器都不应量化为 4bit,否则会引发巨大的差异。

最有趣的是,虽然使用我们的动态量化方法能显著提升模型表现,但它仍奇怪地无法完全达到 16bit 全精度的水平。如果我们放宽约束,捕获所有“劣质”模块,模型便能恢复全部能力!


如下方所示,4bit 版本的输出尚可,但 16bit 版本对 X 光片的分析明显更深入。动态量化比纯 4bit 多占用 400MB,却真的能像高比特模型那样开始解析 X 光片。如果再多用 3.5GB(这已经相当多了),我们就能完全还原 16bit 的精度表现! 我们对比了 8bit 方案,它比 4bit 多用 1GB,有趣的是效果与 4bit 非常接近,说明 8bit 似乎优势不明显。不过这一点还需要进一步验证。 Pixtral-12B 描述:该图像是一张儿童口腔牙科 X 光片,展示了牙齿排列及颌骨结构。X 光片凸显了几个关键特征: 1. 向上的箭头:这些箭头指向下颌上方区域,很可能标示未萌出或阻生的牙齿——也就是还没长出牙龈、被埋在表面之下的牙齿。 26.32GB ✅ Default 4bit all layers 这是一张儿童口腔的牙科X光片,用箭头标出了几颗牙齿。图中显示了不同类型牙齿的位置:乳牙、继承牙(成人牙)和恒牙。乳牙已经脱落,继承牙正在萌出,恒牙还没长出来。 7.83GB 🆗 没提到箭头的含义,分析不够深入。 Unsloth quant 这是一张儿童口腔的X光片,用箭头标出了几颗牙齿。图中显示了乳牙和恒牙的排列情况。箭头指向的几颗牙齿可能需要关注,或许需要拔除或其他牙科治疗。 8.42GB 🆗 好多了——对X光片做了更详细的分析。 8bit quant 这是一张儿童口腔的牙科X光片,用箭头标出了特定区域。X光片显示了儿童牙齿的排列和颌骨的发育情况。箭头可能标示了需要注意的区域,比如牙齿排列不齐、蛀牙或其他牙齿问题。 13.1GB 🆗 也比完整 4bit 好——对X光片做了分析。 🦙 Llama 3.2 (90B) Vision Instruct在 Llama 最大的视觉模型上,确实能看到一些波动,但并不明显。11B 模型出现的 cross attention 现象在这里要弱得多。💕 感谢阅读!一如既往地感谢所有使用和分享 Unsloth 的朋友,我们非常感激。也特别感谢 David 的支持!🙏

欢迎加入我们的 Reddit 页面和 Discord 服务器寻求帮助,或表达你的支持!也可以在 Twitter 上关注我们,订阅我们的 newsletter。Daniel & Michael Han 🦥
2024年12月4日多模态微调免费开始使用 加入我们的 Discord

评论 (0)