同一个模型,为什么换一个 batch size 就快了,显存明明没满却跑不动,吞吐提高了但用户等得更久?模型落到程序和硬件上,这些问题就会出现。
效率与系统研究怎样在有限硬件、时间和成本里完成训练或推理。一个模型的公式没有变,运行速度也可能差很多:数据搬运、算子实现、显存分配、请求调度和多卡通信,都会决定 GPU 能不能持续干活,以及用户要等多久。
这条线与模型方法紧密相连。更长的上下文会增加缓存,更多并发请求会改变内存压力,降低精度可能影响任务质量。读系统论文时,把优化对象和测试负载一起看:它省的是哪块内存、减少了什么等待,换一种任务时收益又会怎样变化。
主要任务- 让原本显存装不下的模型或训练状态能够分布到多张卡上。
- 减少计算中的内存搬运与重复工作,提高已有硬件的利用率。
- 在模型质量、响应速度、并发量和服务成本之间找到可测量的取舍。
先测清瓶颈,再选优化;显存更省、吞吐更高和单个用户等得更少,分别是不同的结果。
模型怎样节省计算与存储- 01权重量化
- 02KV 缓存
- 03连续批处理
- 04流水并行
发展路线与代表工作
- 2020
ZeRO:分担训练时重复保存的状态
从多卡数据并行中的冗余入手,分片存储优化器状态、梯度和参数。
- 2022
FlashAttention:改变计算的搬运方式
保持精确注意力的数学目标,用分块计算减少 GPU 不同内存层级间的读写。
- 2023
SmoothQuant:让低精度计算更可用
处理难量化的激活异常值,为权重与激活的 INT8 推理创造条件。
- 2023
PagedAttention:管理动态增长的 KV cache
将缓存按块组织,减少服务中的碎片和重复,容纳更多并发请求。
关键概念
- 吞吐与延迟
- 吞吐是在一段时间内完成多少工作;延迟是一个请求等待多久。增大 batch 可能改善前者,却让排队更久。
- Prefill / Decode
- Prefill 处理输入上下文;decode 逐步生成输出。两阶段的计算与访存特点不同,不能只报一个笼统速度。
- KV cache
- 保存已处理 token 在各层注意力中的 key 和 value,避免生成时重复计算;它随上下文和并发请求占用显存。
- 量化
- 用较低精度表示权重或激活,减少存储与某些计算成本。能否加速还取决于硬件和实际算子的支持。
计算、访存与执行开销
从 Horace He:Making Deep Learning go Brrrr认识计算、内存和执行开销。然后选自己的一个小程序,记录输入、硬件、运行方式与耗时,再看具体瓶颈。
想补系统全貌,用 Machine Learning Systems 按问题查;量化、压缩与高效计算可以接 MIT 6.5940(2024)。
延迟、吞吐、显存与质量
交互服务可能在意首字延迟和尾延迟,离线批处理可能在意吞吐,部署还会受显存与成本约束。优化前把这些条件写下来,同时保留任务质量的评价。
可以先测不同输入长度或 batch size 下的表现,再查 PyTorch Performance Tuning Guide中的相关建议。一次改动之后,用相同负载重测。
分布式训练与推理
How To Scale Your Model可以继续认识分布式计算与硬件约束。等你有一个具体瓶颈,再沿通信、并行、内存与算力往下读。
这里也很适合检验自己怎样使用 AI:它可以帮你写测试脚本,但你要能讲清测试测的是什么、优化影响了谁。接和 AI 一起做事。
系统案例、课程与研究团队
可以对照Purshow 的系统笔记、效率与系统资料和MIT HAN Lab 等团队,看看模型设计与部署约束怎样联系。
代表论文
四篇对应训练状态、算子访存、数值精度和在线缓存。先辨认各自的瓶颈,再读性能图中的负载条件。
入门练习
卡在某一步?把过程带到 AMA 一起聊 ↗