Monitor训练状态轻量化监测工具,能够在较低性能损耗下收集和记录模型训练过程中的激活值、权重梯度、优化器状态和通信算子的中间值,实时呈现训练状态。
安装
约束
- PyTorch场景:torch不低于2.1
- MindSpore场景:mindspore不低于2.4.10,仅支持MindSpore动态图,支持MSAdapter套件
根据需求监测相应对象。比如在loss上扬,grad norm正常的异常训练过程中,优先考虑监测模型前向过程;在grad norm异常的训练过程中,监测权重和激活值的梯度。 推荐使用方式:权重梯度的监测性能损耗小(20B dense模型全量权重梯度监测,时间增加<1%,内存增加<1%),可以长期开启。激活值监测性能损耗大,在必要时开启或者仅监测部分。
请在当前目录下创建一个[object Object]文件(配置文件各个字段具体信息请查看),此处以最常见的权重梯度采集为例:
在实际训练代码中找到模型、优化器定义完成后、训练开始前的位置,加入工具使能代码,不同场景使能方式如下:
- Pytorch使能方式:
deepspeed与accelerate、transformers同时使用时,optimizer传值方式为[object Object],若未使用deepspeed,单独使用accelerate、transformers,optimizer传值方式为[object Object]。
同时使用deepspeed和accelerate时,工具使能位置参考如下:
同时使用deepspeed和transformers时,工具使能位置参考如下:
- MindSpore使能方式:
若框架为FSDP1,请先保证model包裹FSDP时设置use_orig_params=True。
下表中字段为训练状态轻量化监测工具的完整功能点:
- 该功能可开启权重监测,工具配置示例:
[object Object]中指定module包含的所有权重都会被监测。[object Object]为空时,默认监测全部module。
设置[object Object]为true,表示开启权重监测功能,默认值为false。
- 该功能可开启权重梯度监测,监测聚合前后的权重梯度,工具配置示例:
[object Object]中指定module包含的所有权重都会被监测。[object Object]为空时,默认监测全部module。
设置[object Object](weight grad, noted as [object Object]) 为true,表示开启权重梯度监测功能,默认值为false。
- 该功能可开启激活值监测,工具配置示例:
[object Object]为true表示监测全量module激活值,若需要对指定模块设置监测对象,在[object Object]中进行配置,配置方式参考 。
设置[object Object]为true表示开启激活值监测功能,默认值为false。
注意:[object Object]和[object Object]均为true时,触发warning,前反向均不采集;默认值均为false时,前反向均采集。
- 该功能可开启优化器状态监测,工具配置示例:
[object Object]中指定module包含的所有权重都会被监测。[object Object]为空时,默认监测全部module。
设置[object Object]为true表示开启优化器状态监测功能(1st moment noted as [object Object], 2nd moment noted as [object Object]),默认值为false。
本工具针对分布式计算框架megatron和deepspeed框架做了适配,暂不支持其他框架。
- 该功能可采集module堆栈详细信息,工具配置示例:
开启 [object Object] 后会采集监测的第一个 step 的所有 module 的堆栈信息,输出格式仅支持 csv 。
工具支持对指定nn.Module进行状态监测,在配置文件的[object Object]字段中指定,[object Object]格式为{module_name: {}}。
module_name可以通过nn.Module的接口named_modules()获取。
工具提供可选项[object Object]打印模型结构,帮助配置targets。工具会在在第一个step后打印结构并停止训练进程,每张卡上的模型结构默认保存在[object Object], 其中{rank}为对应的卡号。
输出样例:
对于module对象,通常关心前向/反向传播的输入和输出:
- 前向的输入(input)
- 前向的输出(output)
- 反向的输入,表示前向输出的梯度(output_grad)
- 反向的输出,表示前向输入的梯度(input_grad)
targets字段指定监测对象示例如下:
对于parameter对象,通常会关注其在一个训练迭代中的梯度(weight grad)、adam类优化器中的动量(1st moment, 2nd moment)。 parameter归属于某一module,可以通过指定module_name来监测包含在这一module中的所有parameter。
param_name可以通过nn.Module的接口[object Object]获取。
工具提供简便的全量module对象监测方式。
- 该功能可开启模型状态的高阶监测,工具配置示例:
当配置梯度监测任务时,工具默认[object Object]粒度进行梯度监测。当需要监测[object Object]粒度梯度信息时,在配置文件中配置[object Object]为[object Object],配置示例如下:
应用范围
- 仅支持采集聚合前梯度,在梯度累积场景下,聚合后梯度已无法区分
[object Object]数据。 - PyTorch场景下,Megatron和DeepSpeed训练框架下均支持,FSDP训练框架下暂不支持。
- MindSpore场景下均支持。
工具的异常告警功能旨在自动判断训练过程中的异常现象,用户可通过在配置文件中配置alert字段来指定告警规则,并在训练过程中根据该规则及时打印告警信息。
异常告警规则
当前支持的异常告警规则如下:
除此之外,我们在alert中支持dump配置项,如果打开"[object Object]"选项,则会将异常信息落盘到目录[object Object]。
- 历史均值偏离告警案例如下:
- nan值/极大值告警案例如下:
注:当配置多条异常告警规则时,优先告警第一条,如以下配置时每一层会优先报AnomalyNan的告警(一般不建议配置多条规则):
异常提示说明
训练过程中,检测到异常后打印提示信息,并将异常信息按照rank分组写入json文件,文件路径默认为[object Object],异常信息示例如下:
其中call_{xxx}中的xxx为API的执行调用顺序,为后续异常事件排序做准备。
异常事件排序
当模型训练过程中出现较多异常数据,需要对异常事件排序。工具提供topk的异常排序能力,按照api的执行顺序进行排序,便于定界首次异常点。异常分析命令示例:
异常事件分析结束,将topk事件写入文件[object Object]。异常分析支持以下参数配置:
将csv数据转换为tensorboard格式数据。
参数详细介绍请参见的“csv输出件转tensorboard输出件”
动态启停模式:支持用户在训练过程中随时启动/更新监测。
用户可在训练开始前通过配置环境变量[object Object]来确认进入动态启停模式,该模式下需要配合config.json文件中的[object Object]字段来使用。
在动态启停模式下,启动和停止分别由如下控制:
- 启动:
- 首次监测:查看config.json文件中
[object Object]字段,若为[object Object]则在下一步开启监测。 - 非首次监测:查看config.json文件时间戳,若时间戳更新且config.json文件中
[object Object]字段为[object Object]则在下一步开启监测。
- 首次监测:查看config.json文件中
- 停止:
到达
[object Object]之后自动停止并修改config.json文件中[object Object]字段为[object Object],可再通过上述操作重启。
注意事项::
- 默认监测启动皆统一在配置初始化或查询到更新后的下一步,即第n步挂载hook将在第n+1步启动采集,如需采集第0步数据请使用静态模式。
- config.json中途修改错误时,若此时不在监测则不生效,若在监测则用原配置继续。
- 达到
[object Object]之后程序会自动将该值置为[object Object],待下次修改为[object Object]时重启。
支持的使用场景说明如下:
- 统计量
可以在训练过程中修改
[object Object]实例的[object Object]属性, 调整监测的统计量。
- 训练过程中开关激活值监测 激活值监测的性能损耗较大, 推荐仅在必要时开启, 比如发现loss出现尖刺, 根据loss的异常开启激活值监测.
通过环境变量[object Object]设置monitor输出路径,默认为[object Object]。
通过可选配置项[object Object]指定,当前支持[object Object], [object Object], [object Object]。其中[object Object]为默认缺省值。
tensorboard 监测结果写入tensorboard的event文件,启动tensorboard查看。
激活值监测任务的tag为{vpp_stage}:{module_name}.{input or output}:{micro_step}/{rank}/{task}_{ops} 其他监测任务的tag为{vpp_stage}:{param_name}/{rank}/{task}_{ops}[object Object]之后,运行以下SSH命令来建立端口转发,可以在本地通过
[object Object]访问tensorboard:[object Object]csv 监测结果写入csv文件中,可以通过
[object Object]字段设置小数位数。
表头为 vpp_stage | name | step | micro_step(optional) | *ops |。 仅在激活值监测的输出文件中包含micro_step。 激活值监测的name为[object Object], 其他任务的name为[object Object]。api 监测结果不落盘,在训练过程中可以通过
[object Object]、[object Object]等接口获取,使用方式参考 。
提供csv输出件合并功能,在配置json文件中设置[object Object],表示每个csv文件存储多个step的监测数据。默认值为1,表示每个csv文件记录一个step的监测数据。
如下图所示为梯度监测结果示例,配置[object Object]为5,连续监测10个step,每个csv文件记录了5个step的梯度数据。其中[object Object]为step0至step4共计5个step的聚合后梯度数据,[object Object]为step0至step4共计5个step的聚合前梯度数据。
- monitor工具初始化
- 模型挂载monitor工具
- csv输出件转tensorboard输出件
- 在模型任意位置获取当前参数梯度统计量
具体使用方式如下:
- 在模型任意位置获取当前参数激活值统计量
具体使用方式如下:
- 老版接口说明, 将在2026年废弃:
具体接口变更说明如下:
下面详细解释各个字段: