梯度检查点是通过只保存部分中间激活值、反向时重算前向来节省显存的技术,能降低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测试工具
相关推荐
充钱大佬8 小时前
Python测试基础教程小二·10 小时前
RAG + 向量数据库实战:ChromaDB / Milvus / FAISS 选型与性能横评矜持的左手10 小时前
电子小白的枕边书:电子学(The Art of Electronics)吴声子夜歌10 小时前
Redis 5.x——布隆过滤器初心丨哈士奇11 小时前
Python 四大基础容器|列表篇蓝天下的守望者11 小时前
svt_apb_if里的宏定义问题明理的信封11 小时前
AI 基础设施的“去 Python 化“:Rust 与 C# 的两条替代路径上海云盾-小余11 小时前
网站频繁遭遇 SQL 注入溯源与原生漏洞修复全流程总结数据库小学妹11 小时前
国家区域医疗中心国产化改造实战:数据库选型、跨院区数据互通与踩坑经验