技术指南

梯度检查点

梯度检查点(也称为激活检查点)是一种节省内存的技巧,它在前向传播期间丢弃大多数中间激活,并在反向传播期间动态重新计算它们。

概述

梯度检查点(也称为激活检查点)是一种节省内存的技巧,它在前向传播期间丢弃大多数中间激活,并在反向传播期间动态重新计算它们。它可以让您通过用额外的计算换取更低的内存使用来训练更深、更大的网络。

梯度检查点是一个技术构建块,会大规模影响模型质量、基础设施成本、延迟和可靠性。

深入探讨

训练神经网络通常会在前向传播过程中存储每一层的激活,因为反向传播需要它们来计算梯度。对于深度模型来说,这些激活支配着记忆。相反,梯度检查点仅在一组稀疏的“检查点”层上保存激活,并丢弃其余部分。当反向传播到达激活被删除的区域时,它会重新运行该段的前向计算以重新生成所需的内容,然后继续。大约每个 N 平方根层都放置检查点,激活内存从 N 阶下降到 N 平方根阶,而计算量仅增加大约一次额外的前向传递(大约慢 20-30%)。这使得在同一 GPU 上适应更大的批量大小或更深的转换器成为可能。

技术洞察

该技术利用了时间与内存的权衡。存储所有激活速度很快,但很耗内存;相对于耗尽内存的成本,在现代加速器上重新计算它们的成本很低。像 PyTorch (torch.utils.checkpoint) 这样的框架包装了一个模块,因此它的前向输出被保存,但其内部结构在后向过程中被重新计算。选择检查点放置很重要:大约 sqrt(N) 段的均匀间距可以最大限度地减少总内存,同时仅添加一个额外的前向计算整体。

掌握梯度检查点

梯度检查点(也称为激活检查点)是一种节省内存的技巧,它在前向传播期间丢弃大多数中间激活,并在反向传播期间动态重新计算它们。它可以让您通过用额外的计算换取更低的内存使用来训练更深、更大的网络。梯度检查点是一个技术构建块,会大规模影响模型质量、基础设施成本、延迟和可靠性。为了建立深入的理解,请将梯度检查点视为一种操作模型,而不是单个功能:定义期望的结果,澄清假设,并将系统可以可靠地完成的任务与仍需要专家判断的任务分开。

在实践中,强大的团队使用梯度检查点根据可靠性和成本优化架构、数据和基础设施选择。他们记录明确的成功标准,根据实际数据和工作流程进行测试,并根据观察到的失败模式而不是一次性基准测试胜利进行迭代。这就是理论理解转变为跨产品、政策和运营的持久能力的地方。

多年来,架构决策决定着性能和运营成本。与此同时,优化一个基准测试可以隐藏更广泛的系统弱点。最具弹性的方法是将实验速度与治理规则结合起来:运行试点、捕获证据、发布决策日志,并随着模型行为、用户期望和监管要求的发展不断更新保障措施。

战略影响

多年来,架构决策决定着性能和运营成本。

多年来,架构决策决定着性能和运营成本。在高质量部署中,这会转化为可衡量的操作规则、所有权边界和定期审查仪式,以便团队可以增强信心,而不是扩大模糊性。

技术教育帮助团队选择正确的堆栈,而不仅仅是最新的堆栈。

技术教育帮助团队选择正确的堆栈,而不仅仅是最新的堆栈。在高质量部署中,这会转化为可衡量的操作规则、所有权边界和定期审查仪式,以便团队可以增强信心,而不是扩大模糊性。

更好的工程选择可以减少生产中的可靠性事故。

更好的工程选择可以减少生产中的可靠性事故。在高质量部署中,这会转化为可衡量的操作规则、所有权边界和定期审查仪式,以便团队可以增强信心,而不是扩大模糊性。

梯度检查点的未来

梯度检查点现在是大型模型训练的标准,并且越来越自动化,库会为您选择最佳检查点位置。它与 FSDP、混合精度和卸载自然配合,以提高模型尺寸。期望“选择性”检查点仅重新计算廉价的操作,同时缓存昂贵的操作(如注意力矩阵),加上 PyTorch 的 torch.compile 等工具中的编译器驱动方法,自动决定保存哪些内容与重新计算以获得最佳速度内存平衡。

现实世界的实施

通过丢弃和重新计算层激活,在单个 GPU 上训练具有更大批量大小的深度转换器。

在高分辨率图像上微调视觉模型,否则激活图会溢出 GPU 内存。

拥抱 Face Transformers 启用gradient_checkpointing=True,以在微调期间适应十亿参数模型。

将检查点与 FSDP 相结合,使参数和激活都保持较小,从而能够训练非常大的语言模型。

实施模式

梯度检查点实践

通过丢弃和重新计算层激活,在单个 GPU 上训练具有更大批量大小的深度转换器。

通过丢弃和重新计算层激活,在单个 GPU 上训练具有更大批量大小的深度变压器 团队在预先定义质量阈值、为边缘情况保留人工升级路径并随着时间的推移跟踪生产力增益和错误成本时,通常会获得更好的结果。

梯度检查点实践

在高分辨率图像上微调视觉模型,否则激活图会溢出 GPU 内存。

在高分辨率图像上微调视觉模型,否则激活图会溢出 GPU 内存 当团队预先定义质量阈值、为边缘情况保留人工升级路径并随着时间的推移跟踪生产力增益和错误成本时,通常会获得更好的结果。

梯度检查点实践

拥抱 Face Transformers 启用gradient_checkpointing=True,以在微调期间适应十亿参数模型。

拥抱 Face Transformer,启用梯度检查点=True,以在微调过程中适应十亿个参数的模型当团队预先定义质量阈值、为边缘情况保留人工升级路径并随着时间的推移跟踪生产力增益和错误成本时,通常会获得更好的结果。

梯度检查点实践

将检查点与 FSDP 相结合,使参数和激活都保持较小,从而能够训练非常大的语言模型。

将检查点与 FSDP 相结合,使参数和激活都保持较小,从而能够训练非常大的语言模型。当团队预先定义质量阈值、为边缘情况保留人工升级路径并随着时间的推移跟踪生产力增益和错误成本时,通常会获得更好的结果。

风险与防护栏

!

优化一项基准测试可以隐藏更广泛的系统弱点。

!

基础设施和维护成本常常被低估。

!

随着系统变得更加复杂,安全性和可观察性差距可能会扩大。

实施路线图

1

在实施之前定义延迟、质量和成本目标。

在实施之前定义延迟、质量和成本目标。将每个步骤视为证据门:如果不满足标准,则暂停推出,缩小差距,然后再扩大使用。

2

在实际负载和数据条件下进行基准测试。

在实际负载和数据条件下进行基准测试。将每个步骤视为证据门:如果不满足标准,则暂停推出,缩小差距,然后再扩大使用。

3

仪器监控错误、漂移和用户影响。

仪器监控错误、漂移和用户影响。将每个步骤视为证据门:如果不满足标准,则暂停推出,缩小差距,然后再扩大使用。

4

在扩展之前准备回滚和事件响应路径。

在扩展之前准备回滚和事件响应路径。将每个步骤视为证据门:如果不满足标准,则暂停推出,缩小差距,然后再扩大使用。

不断探索