高效机器学习与 AI 基础设施
在我的经验里,大多数效率问题,都源于一个悄悄不再成立的假设。这篇文章跟着一个模型从设计走到上线,看看我们的每项工作分别推翻了哪个假设。
提到效率,大家通常会想到一种交换:牺牲一点效果,省下一些算力或显存。但我见过的更大收益,往往来自另一个地方。一个方法之所以失效或浪费资源,常常是因为它依赖的某个假设,在当初设计时没问题,现在却不成立了。比如:分词器可以在扩大模型之前就定下来;网络的每个部分对压缩的承受能力都一样;缓存里每个 token 都同样重要;等待同步不花成本;GPU 不会坏;最强的老师教得最好。
找出那个不成立的假设,往往是最难的一步;判断对了,解决办法通常很简单。这篇文章按模型的“一生”来组织,看每个假设藏在哪个阶段。其中第二部分的量化工作获得了 ACL 2022 杰出论文奖。
本页内容:设计 · 压缩 · 记忆 · 计算与服务 · 迁移 · 几点体会 · 还没解决的问题
1. 设计:分词器不能随便定
扩展定律告诉我们,增加参数和数据时损失会怎样变化,但它通常不考虑词表。结果在实际中就能看到:规模差不多的模型,词表大小却相差很大。在 Scaling Laws with Vocabulary(NeurIPS)里,我们把词表大小当作一个独立的扩展维度来研究:把词表参数和网络其他部分分开;用字符而不是 token 来衡量数据量,这样不同分词器之间才能公平比较;并使用一个不受词表大小影响的损失。我们用三种互相独立的方法估计最合适的词表大小,分别基于 IsoFLOPs 分析、求导和直接拟合损失,结论完全一致:大多数模型的词表都偏小了。
为什么会存在一个最合适的大小?关键在于取舍。词表越大,同样的文本切出来的 token 越少,能直接表示的概念也越多;但算力有限时,那些不常见的 token 根本练不好。随着算力增加,天平会往大词表倾斜,不过词表的增长应该比模型其他部分慢一些。数据量也很关键:数据少的时候,小一点的词表能避免把罕见 token 学偏;数据远多于“刚好够用”的量时,大一点的词表更划算,只是要记得词表变大也会让推理更贵。我很喜欢这样理解:在算力固定的情况下,最好的词表,就是能让模型读到最多文本的那一个。词表太小,同样的内容要花更多 token;词表太大,算力又都耗在了嵌入层和输出层上。交互式计算器可以直接帮你算出一个可用的数字。
2. 压缩:模型的各个部分并不一样
对 BERT 这类编码器很好用的量化方法,用到 GPT 这类生成模型上就不灵了,而且有一阵子大家都说不清为什么。在 Compression of Generative Pre-trained Language Models via Quantization(ACL 2022 杰出论文)中,我们找到了两个原因。一是在低精度下,词嵌入会挤成一团、变得几乎一样,生成模型在挑下一个 token 时,就分不清这些选项了。二是不同模块的权重分布差别很大,一套量化设置没法同时照顾到所有模块。解决办法顺着诊断就出来了:用 token 级的对比蒸馏,让每个 token 的表示既贴近全精度模型,又和其他 token 区分开;用按模块的动态缩放,给每个模块单独设定范围。结构化剪枝把同样的思路用在“删减”上,让模型自己学出哪些部分可以去掉。
在视觉语言模型里,这种不均匀更加明显,因为图像和文字承载信息的方式差别很大。UPop 在视觉和语言两部分里一起寻找更小的网络,让模型自己学出每部分该剪多少,而不是靠我们拍脑袋定,并且一边搜索一边重新训练。CrossGET 则在模型运行时合并重复的 token,用一种模态的信息来指导另一种模态里哪些 token 该合并。
3. 记忆:不是每个 token 都要记,但要留后路
做长上下文推理时,KV 缓存要存下前面每个 token 的键和值,很快就会占掉大部分显存。平均地删减很浪费,因为不同层的情况不一样。D2O 根据每一层注意力集中的程度,给它分配不同的缓存额度;对于删掉的 token,如果和保留下来的很像,还可以把它找回来或合并进去,整个过程都不需要微调。UNComp 从信息量的角度看这个问题:用矩阵熵衡量不确定性,找出可以压缩的部分;同样的分析,还能指出哪些注意力头和层负责“查找”信息。
扩散语言模型有自己的麻烦:每一步去噪都要把整段提示重新读一遍。Prefilling-dLLM 不需要重新训练,它把提示分块缓存一次,之后只用和问题相关的块和 token。一个小细节起了很大作用:在每一块开头放一个序列起始 token(BOS),让注意力有个稳定的“落脚点”。有了它,稀疏的做法甚至能比完整的注意力效果更好。
4. 计算与服务:花在等待上的成本,比计算本身更高
规模一大,瓶颈通常是等待,最大的风险通常是丢失状态。推理时扩展就是前一种情况的典型例子:它通过在生成时多花算力来提升答案质量,常见做法是小模型先写草稿、大模型来检查。我们在 ATTS 里仔细看了时间都花在哪儿,发现主要成本是同步等待,而不是计算本身。ATTS 把同步检查改成异步推理,并用边运行边校准的保形预测(conformal prediction),把草稿被拒绝的比例控制在统计上可靠的范围内。它可以同时往两个方向扩展:想得更长,以及并行尝试更多。
部署服务也有一个藏起来的假设:GPU 不会坏。在多卡张量并行里,坏掉一张卡就可能让整个服务停掉。AnchorTP 把权重和 KV 缓存放在一个独立的进程里,推理进程崩溃了它也还在;然后把模型重新分配到剩下的 GPU 上,并规划出恢复服务所需的最少数据搬运。
训练智能体的基础设施。在用 真实 harness 里的 RL 训练智能体时,这两条经验表现得更加明显。在 Lego-RL 里,一次训练尝试几乎全部时间都是智能体在干活:在沙箱里读文件、改代码、跑测试。每次尝试时间长、长短差别也很大,同步训练的一批总得等最慢的那个;异步调度则让空出来的位置马上开始新的尝试。如果训练途中权重更新了,部分 rollout 会先暂停生成、加载新权重,再接着缓存的内容在同一台机器上继续,长时间的尝试就不会白费。启动沙箱的时间主要花在构建镜像上,所以预先构建好任务镜像、挂载智能体运行环境、按需拉取镜像,省掉了大部分等待。有一处我们是有意选了更慢的做法:每个镜像里都内置了评分工具,因为能复现的奖励,比快一点拿到的奖励更有价值。说到底,智能体 RL 很大程度上是一个效率和稳定性的问题。
5. 迁移:最强的老师不一定教得最好
知识蒸馏效果最好的时候,是信号正好适合学生去学,而不是老师越强越好。拿前向 KL 和反向 KL 的选择来说,常见的说法是一个只盯着老师最主要的答案,另一个会尽量覆盖所有可能的答案。我们发现,在大模型蒸馏里这两种现象其实都没有出现,两者的最优解是一样的。真正的区别出现在训练早期:前向 KL 更关注老师最常给出的那些 token,反向 KL 更关注不常见的那些。自适应 KL 就是按这个规律给两者分配权重。PerSyn 的出发点是“更强的模型不一定是更好的老师”:在生成数据之前,先为每个问题挑出最适合这个学生的老师,而不是让所有老师都答一遍、事后再筛选。
智能体训练从另一个方向得出了同样的结论:来自较弱智能体、脚踏实地的轨迹,比更强模型直接给出的答案教得更好;而黑盒老师给出的文字反馈,不用暴露老师内部的概率,也能指导学生。
几点体会
- 先找出那个不成立的假设,再动手优化。这里的每个结果,都是从追问“现有方法为什么不行”开始的,而不是直接去试一个更快的版本。原因一旦弄清楚,解决办法往往很简单。
- 不均匀才是常态。层与层、模块与模块、图像与文字、token 与 token、老师与老师,都各不相同。按层、按模块、按模态、按问题分别分配资源,在压缩、缓存和蒸馏里一次次见效。
- 给自己留条后路。删掉的 token 还能找回来、崩溃后状态还在、权重更新时尝试不中断,正是这些设计让大胆的优化变得安全。
- 规模越大,等待越是真正的成本。无论是推理时扩展、部署服务还是智能体训练,最大的收益都来自减少等待,而不是算得更快。
- 效率决定了模型能学会什么。算力不够、练不好的罕见 token,学生消化不了的老师输出,都说明效率不只是成本问题,它还决定了模型到底能学会什么。
还没解决的问题
- 如果把推理成本、多语言数据和代码都考虑进来,词表该怎么选?
- 对智能体来说,上下文里大部分是工具输出而不是普通文字,长上下文的记忆应该留下什么?
- 在智能体 RL 里,大部分时间花在“做事”而不是算梯度上,还能再快多少?
- 部署服务里的容错思路,能不能让长时间的训练也同样稳定?
相关论文(12 篇)
-
Prefilling-dLLM: Predictive Prefilling for Long-Context Inference in Diffusion Language Models
Jing Xiong, Qi Han, Shansan Gong, Yunta Hsieh, Boyuan Zheng, Chengyue Wu, Chaofan Tao, Chenyang Zhao, Ngai Wong
Prefilling-dLLM无需额外训练,通过分块预填充缓存前缀KV表示,再选择与查询相关的文本块及块内关键token,并在去噪解码中复用稀疏缓存,从而降低扩散语言模型长上下文推理中的重复计算。
-
ATTS: Asynchronous Test-Time Scaling via Conformal Prediction
Jing Xiong, Qiujiang Chen, Fanghua Ye, Zhongwei Wan, Chuanyang Zheng, Chenyang Zhao, Hui Shen, Alexander Hanbo Li, Chaofan Tao, Haochen Tan, Haoli Bai, Lifeng Shang, Lingpeng Kong, Ngai Wong
ATTS是一种基于一致性预测的异步测试时扩展方法,减少同步开销,在尽可能最小化准确率损失的情况下加速扩展。
-
UNCOMP: Can Matrix Entropy Uncover Sparsity? - A Compressor Design from an Uncertainty-Aware Perspective
Jing Xiong, Jianghan Shen, Fanghua Ye, Chaofan Tao, Zhongwei Wan, Jianqiao Lu, Xun Wu, Chuanyang Zheng, Zhijiang Guo, Min Yang, Lingpeng Kong, Ngai Wong
UNComp使用不确定性(通过截断矩阵熵)来发现KV缓存的稀疏性,并对长上下文推理进行自适应压缩,大幅缩小缓存同时提升吞吐量。
-
Find Your Optimal Teacher: Personalized Data Synthesis via Router-Guided Multi-Teacher Distillation
Hengyuan Zhang, Shiping Yang, Xiao Liang, Chenming Shang, Yuxuan Jiang, Chaofan Tao, Jing Xiong, Hayden Kwok-Hay So, Ruobing Xie, Angel X Chang, Ngai Wong
PerSyn采用"先路由后生成"策略,通过考虑学生学习能力和教师质量的路由器为每个提示分配最佳教师,提高合成数据蒸馏效率。
-
AnchorTP: Resilient LLM Inference with State-Preserving Elastic Tensor Parallelism
Wendong Xu, Chujie Chen, He Xiao, Kuan Li, Jing Xiong, Chen Zhang, Wenyong Zhou, Chaofan Tao, Yang Bai, Bei Yu, Ngai Wong
AnchorTP提供状态保持的弹性张量并行,通过GPU常驻守护进程和带宽感知的迁移规划,实现单GPU故障场景的快速恢复。
-
Scaling Laws with Vocabulary: Larger Models Deserve Larger Vocabularies
Chaofan Tao, Qian Liu, Longxu Dou, Niklas Muennighoff, Zhongwei Wan, Ping Luo, Min Lin, Ngai Wong
推导了计算最优的词表规模扩展规律,证明更大模型需要更大词表,在相同计算量下提升下游任务准确率。
-
Dynamic Discriminative Operations for Efficient Long-Context Inference of Large Language Models
Zhongwei Wan, Xinjian Wu, Yu Zhang, Yi Xin, Chaofan Tao, Zhihong Zhu, Xin Wang, Siqi Luo, Jing Xiong, Longyue Wang, Mi Zhang
D2O在层和token级别动态压缩KV缓存,通过分配和召回/合并补偿,无需微调即可节省内存并提升长上下文吞吐量。
-
CrossGET: Cross-Guided Ensemble of Tokens for Accelerating Vision-Language Transformers
Dachuan Shi, Chaofan Tao, Anyi Rao, Zhendong Yang, Chun Yuan, Jiaqi Wang
CrossGET通过跨模态匹配和集成token,使用相似token匹配和合并加速视觉-语言Transformer,在最小准确率损失下减少计算量。
-
Rethinking Kullback-Leibler Divergence in Knowledge Distillation for Large Language Models
Taiqiang Wu, Chaofan Tao, Jiahao Wang, Runming Yang, Zhe Zhao, Ngai Wong
研究表明在充分训练下,前向和反向KL在大语言模型蒸馏中表现相似,但早期分别关注分布头部和尾部;自适应KL结合两种蒸馏方式的优势,以提升模型的生成质量和多样性。
-
Structured Pruning for Efficient Generative Pre-trained Language Models
Chaofan Tao, Lu Hou, Haoli Bai, Jiansheng Wei, Xin Jiang, Qun Liu, Ping Luo, Ngai Wong
提出对生成式预训练语言模型多个组件的结构化剪枝,使用可学习掩码和稀疏训练提取尺寸灵活的子网络,实现显著加速。
-
Compression of Generative Pre-trained Language Models via Quantization
Chaofan Tao, Lu Hou, Wei Zhang, Lifeng Shang, Xin Jiang, Qun Liu, Ping Luo, Ngai Wong
将量化方法适配到生成式预训练语言模型(e.g. GPT-2, BART),通过token级对比蒸馏解决嵌入同质化问题,并用模块级动态缩放实现接近全精度的13-14倍压缩。
-
UPop: Unified and Progressive Pruning for Compressing Vision-Language Transformers
Dachuan Shi, Chaofan Tao, Ying Jin, Zhendong Yang, Chun Yuan, Jiaqi Wang
UPop是一个统一的渐进式剪枝框架,在连续空间中搜索多模态子网络并逐步重训练,实现视觉-语言Transformer的高压缩率。
相关页面:智能体编程、推理与评测