高效训练、推理与 AI 工程¶
这一页解决什么
把算法变成可重复、可测量、能部署的系统。这是你的主场:嵌入式和边缘部署经验可以直接迁移到资源预算、性能分析和量化;GPU 训练和推理运行时按实际缺口补齐。P0 工程与复现必修,P1 压缩与性能。
知识地图¶
| 层次 | 主题 | 需要理解什么 |
|---|---|---|
| P0 | 工程与复现 | 数据版本、随机种子、配置、依赖、checkpoint、实验记录 |
| P1 | 性能与训练效率 | profiling、混合精度、batch、梯度累积、数据加载与内存 |
| P1 | 模型压缩 | 量化、蒸馏、剪枝与稀疏;质量与实际速度分开验证 |
| P2 | 大模型系统 | 高效注意力、KV cache、批处理、并行与通信 |
| P2 | 部署与生命周期 | ONNX 与运行时、边缘设备、监控、漂移、回归评估 |
核心机制¶
可复现:固定随机种子、记录代码版本、依赖、配置和数据版本。没有这些,"改了一个超参效果变好"无法确认。
性能分析:先测再优化。区分数据加载、前向、反向和优化器步;GPU 计时要同步,前几次迭代是预热不计入。很多训练其实瓶颈在数据加载。
混合精度:前向和反向用 FP16 / BF16,主权重保留 FP32。BF16 指数位与 FP32 相同,不容易溢出,现代 GPU 首选;FP16 需要损失缩放。
量化:把权重(和激活)从浮点换成 INT8 或更低位宽,模型变小、带宽需求降低。训练后量化(PTQ)用校准数据定缩放因子;量化感知训练(QAT)在训练中模拟量化误差。逐通道量化比逐张量更准。
蒸馏:让小模型模仿大模型的软输出(概率分布),比只学硬标签信息更多。
剪枝:去掉不重要的权重。非结构化剪枝压缩率高但硬件难加速;结构化剪枝(去掉通道、注意力头)才能真正提速。
计算受限 vs. 内存受限:判断一个算子快慢要看算术强度(每读一字节做多少运算)。很多层受内存带宽限制,FLOPs 降低不一定带来时延下降——这和你在 MCU 上优化算子是同一个道理。
部署:导出 ONNX,再交给 TensorRT、ONNX Runtime 等运行时做算子融合和量化;端侧还要看内存峰值、算子支持和功耗。
精选资源¶
跟随实验 · AI-6 · 一个可解释的性能实验¶
- 复用 F1、AI-2 或 F4 中已跑通的模型,不新增任务。
- 固定设备、输入与精度;区分加载、预热、前向和数据处理。
- 按设备要求同步计时,重复测量,记录时延分布与峰值内存。
- 只改 batch、精度或一个优化,重新检查质量与实际资源。
验收:报告环境、测量范围、重复次数与质量限制;理论 FLOPs 或参数量不能直接当成部署时延。
自测¶
GPU 上用 time.time() 测前向时延有什么问题?
GPU 是异步执行的,不同步就计时只测到了"提交任务"的时间;要先 torch.cuda.synchronize(),并排除预热迭代。
BF16 和 FP16 怎么选?
BF16 动态范围与 FP32 相同,训练稳定、不需要损失缩放,硬件支持时优先;FP16 精度位多但容易溢出,需要损失缩放。
非结构化剪枝掉 50% 权重,为什么推理不一定变快?
稀疏的权重仍以稠密矩阵存储和计算,除非硬件或运行时支持特定的稀疏格式;结构化剪枝才能直接减少计算。