梯度检查点是通过只保存部分中间激活值、反向时重算前向来节省显存的技术,能降低40%~60%显存但增加15%~30%训练时间,要求模块前向可重入且无副作用。梯度检查点是什么,为什么能省显存梯度检查点(torch.utils.checkpoint.checkpoint)不是"不存梯度",而是"不存中间激活值"。反向传播时需要前向计算的中间结果来算梯度,常规训练会把所有层的输出全存着,显存占用和网络深度线性增长;而检查点只存部分层的输入,反向时临时重跑对应前向------用时间换空间。典型节省比例:ResNet-50 训练 batch size 可从 16 提到 32,ViT-L 类模型显存常降 40%~60%。但注意:它只对**前向可重入、无副作用**的模块有效,比如不能包裹含 nn.Dropout(训练态随机行为不可复现)或修改全局状态的自定义层。怎么加 checkpoint,最简安全写法别直接套整个模型,先从单个 nn.Sequential 或自定义 forward 块开始。PyTorch 官方推荐方式是用 checkpoint.checkpoint 包裹函数调用,而不是用装饰器(后者容易隐式捕获非 tensor 参数)。必须确保被包裹函数只接收 Tensor 参数,且不依赖闭包变量(如 self.training)若模块含 training 切换逻辑(如 Dropout),改用 checkpoint.checkpoint_sequential 或手动拆分 + torch.no_grad() 重算示例:对 Transformer 层列表做检查点from torch.utils.checkpoint import checkpointdef custom_forward(x, layer): return layer(x)# 替换原循环:x = layer(x)x = checkpoint(custom_forward, x, layer)常见报错和绕过方法RuntimeError: Trying to backward through the graph a second time:说明 checkpoint 内部用了被复用的 Tensor(比如共享 embedding),或者你在检查点外又对同一张量调了 backward()。根本原因是计算图被意外保留。 VWO 一个A/B测试工具
相关推荐
笃行3506 小时前
数据库性能优化的五处内核改造,KingbaseES 配了四件诊断工具非优秀程序员8 小时前
第02章 杭电的英语老师与一台服务器|《互联网产品恩仇录》用户9562562542913 小时前
跟做:Firecrawl 单页转 Markdown 再丢进沙箱总结SelectDB13 小时前
SelectDB 是哪个公司的?是国产数据库吗?一篇讲清飞轮科技与 Apache Doris 的关系威哥爱编程13 小时前
模拟面试智能体开发实战 02:回答等半分钟,谁还愿意练?把服务端和流式输出搭起来这个DBA有点耶13 小时前
库内计算推理:一条SQL背后的算子融合,和外挂方案差了几次网络往返威哥爱编程13 小时前
模拟面试智能体开发实战 01:面试挂了都不知道挂在哪?用 Python 给自己造一个随叫随到的 AI 面试官2601_9679801114 小时前
Python行情API量化 02:顺序拉 20 要 2 秒?并发批量把时间压到 0.5 秒伞伞悦读14 小时前
【第81期】特征缩放怎么选:标准化、MinMax 与 Robust 的原理、泄漏对照和完整实验新*14 小时前
从一段 WebSocket 代码聊开:bytes 不是 zlib、binaryType 决定一切,15MB 大消息的零拷贝优化