← 文章 / 未分类
bytebytego 1小时前 · 2026-09-05 10:17:50 · 1 阅读

如何在不过度损害模型性能的前提下压缩语言模型

Datadog 的免费指南教你把 AI 开销、基础设施和模型性能整合到一个视图里,在成本上涨还没体现在云账单上之前,就能把它追溯到引发问题的架构变更。

你将学到:

  • 按 token、模型、提供商和团队拆分 AI 成本

  • 推理量激增或 API 开销超出预算时立刻收到告警

  • 把成本上涨直接关联到架构变更,几分钟内完成根因分析

获取指南


一个 700 亿参数的模型可能占用高达 140 GB 的空间,而一块不错的显卡只有 24 GB 显存,顶级的也不过 48 GB。

差距显而易见。磁盘空间很便宜,但高速内存既稀缺又昂贵。更何况,模型规模这几年膨胀了大约 100 倍,消费级显卡显存却只翻了一倍。这不是挤一挤就能塞进去的问题。

那这样的模型到底怎么跑起来?

最简单的办法是直接买能跑得动它的硬件,但价格高昂,而且消费级硬件基本无缘。

另一个办法是把模型压缩。但我们不想牺牲模型的智能。这就轮到一些技术出场了——它们能在原理上把模型变小,同时不让输出质量下降。

本文将涵盖:

  • 语言模型的智能从何而来?

  • 三种压缩模型的技巧

  • 如何通过降低精度来压缩模型?

  • 如何通过剪掉无用路径来压缩模型?

  • 如何通过行为模仿来压缩模型?

  • 压缩会损害模型的智能吗?

声明:本文基于公开来源的信息整理,文末附参考文献。如发现不准确之处,欢迎评论区指出。

语言模型的智能从何而来?

ChatGPT 这样的大型语言模型和普通软件截然不同——它们不靠 if-else 语句来决策下一步该做什么。

大型语言模型本质上是一堆被称为参数(或权重)的数字。这些权重构成了语言模型的智能基础。举例来说,700亿参数的模型意味着有 700 亿个数字。每个参数通常用 16 位存储,即两字节。两字节乘以 700 亿等于 140 GB,这基本上就是模型的大小。

权重被排列成矩阵。单个权重矩阵是一个网格,比如 4096 × 4096,相当于约 1670 万个数字。一个 700 亿参数的模型由数百个这样的矩阵堆叠而成,跨约 80 层。

当然,权重本身并不能完全解释模型的能力。多个组件协同工作才能让模型变得智能。例如,模型需要 Transformer 这样的架构来路由数据并执行注意力机制;还需要上下文窗口来承载提示和对话中生成的所有内容。

但架构只有几百行代码,提示可能只有几千字节。相比之下,权重构成了语言模型的主体。没有合适的权重,语言模型就无法正常运作。权重执行着一堆任务:

  • 存储语法、事实和推理捷径等模式。

  • 训练完成后,权重冻结成不可变的数值网络。

  • 决定一个模拟神经元对下一个神经元的影响力强弱。

运行模型意味着将输入依次通过各个权重矩阵,直到另一端输出下一个词。

这里需要记住一点:单个权重本身没有任何意义。如果你打开一个模型文件并查看第 N 个权重,可能会看到类似 0.0293 这样的数值。在这个数字的两侧,可能还有其他数字,如 -0.0117、0.004、-0.0862。单独来看,每个数字几乎毫无意义。模型的能力隐藏在各种权重之间的关系之中。这就像一张照片,每个像素共同构成可识别的内容。即使我们略微调整每个像素的亮度,仍然能辨认出图中的事物,因为信息并非存在于某个单一位置。

基于上述信息,不难推断出:要缩小模型,我们必须以某种方式处理这些权重。而这正是各类技术发挥作用的用武之地。不过,有几个要点能帮助我们更好地理解如何缩小模型:

  • 首先,并非所有权重都同等重要。大多数权重值接近零,对最终输出几乎没有影响;但少数权重值较大,产生的影响也更显著。

  • 其次,我们只能根据模型的行为来评判它,而不能依据其内部结构。

下面我们就来了解这些技术。


构建并规模化成功的 AI Agent 战略(赞助)

将 Agent 部署到生产环境只是容易的部分。真正让大多数企业 AI 项目停滞不前的,是确保它们可靠、可治理,并能随时间不断迭代改进。

顶尖团队是如何做到的?他们采用一种 Agent 运营模式(AOM),这是一套循序渐进的框架,用于对齐人员、流程和技术,使企业级 Agent 在规模化过程中持续优化。

在 LangChain 的最新指南中,你将学到:

  • 为什么 AI Agent 不像传统软件那样容易崩溃

  • 覆盖 Agent 全生命周期的工程栈

  • 从“构建并部署”转向“运营并持续改进”

了解更多


三种压缩模型的技巧

压缩模型的方法,核心思路不外乎两个:用更少的比特存储权重,或者干脆减少权重的数量。主要有三种技巧:

  • 降低每个权重的存储精度(量化,Quantization):权重全部保留,只是用更粗糙的方式描述每一个。比如原来占两个字节,现在只占半个字节。

  • 删除无用的权重(剪枝,Pruning):找出那些对结果毫无贡献的权重,直接删掉。

  • 训练一个小模型来模仿大模型(知识蒸馏,Knowledge Distillation):原模型不动,而是训练一个新的、更小的模型,让它表现得和原模型差不多。

回到前面照片的类比:量化就像用一台分辨率稍低的便宜相机拍照;剪枝更像是把照片四周那些不增加任何信息量的空白边缘裁掉;蒸馏则好比花钱请一位画技高超的画家,把照片按四分之一大小临摹一份。

这些技巧的一大优点是可以叠加使用。比如,一个模型可以先由发布它的实验室做蒸馏,再由某个研究团队做剪枝,最后由用户在部署到自己的机器之前做量化。换句话说,通过叠加这些手段,高端大语言模型也能跑在普通的消费级硬件上。

下面我们逐一深入了解这些技巧。

通过降低存储精度来压缩模型

第一种压缩模型的办法是减少每个权重存储的细节,这就是所谓的量化。

假设某个权重的值是 0.02934517。这个数字占了不少空间,可在一个 700 亿参数的模型里,它不过是普普通通的一个权重。把它存成 0.02934517 还是 0.029,对模型输出几乎没有影响。换句话说,大量存储空间花在了那些可能根本不重要的精度上。

量化就是砍掉这些多余精度的技术。

量化过程在模型正式发布前就已开始。训练期间,模型权重通常以 32 位(4 字节)浮点数存储,即 FP32 格式。由于训练涉及对每个权重进行数百万次微小调整,因此需要高精度。但当模型分发时,精度通常会降至 16 位浮点格式,即 FP16 或 BF16。

不过,我们还可以进一步降低精度。要理解如何实现这一点,首先需要弄清楚浮点数的构成方式。

浮点数将比特位分为三部分:符号位、指数位和尾数位。FP32 分配 1 位给符号,8 位给指数,23 位给尾数。而 BF16 则保留所有指数位,仅将尾数缩减为 7 位。这与 FP32 的范围基本相同,但精度较低。值得注意的是,BF16 与 FP16 略有不同:FP16 仅分配 5 位给指数,而为尾数保留了更多比特位。在实际应用中,BF16 已基本取代 FP16。

整数之间的差异则更为显著。一个 8 位整数是 -128 到 127 之间的整数,而 4 位整数则是 -8 到 7 之间的整数。整数没有指数和比例尺。换句话说,将浮点数转换为整数不仅会导致精度损失,还会消除每个权重的比例尺。

现在让我们看看完整的量化过程:

1 - 范围映射

第一步是找出数据集中的最小值和最大值,并将总跨度划分为固定数量的步长。

需要澄清的是,“数据集”并非指整个模型,而是一小簇相邻权重。我们称之为“块”(block),理想情况下应尽可能小。

例如,考虑以下八个权重:0.021、-0.017、0.004、-0.048、0.011、0.033、-0.006、0.070。它们的范围从 -0.048 到 0.070,绝对值最大的是 0.070。若以 4 位作为目标

原始来源: bytebytego

评论 (0)