msprobe工具应用场景–网络训练溢出
现象
在动态图场景下,部分算子在错误的输入下可能会溢出。
思路
- msprobe进行溢出dump:使用msprobe进行溢出dump。
配置
- 用户脚本:
from msprobe.mindspore import PrecisionDebugger
debugger = PrecisionDebugger(config_path='./config.json')
# 在训练循环中启动工具
debugger.start()
# 训练循环体
...
# 结束工具
debugger.stop()
- 配置项:
-
MindSpore 场景:
- 动态图场景:支持 API 级别(
"L1"
)或 Cell 级别("L0"
)的溢出检测。 - 静态图场景:支持 Kernel 级别(
"L2"
)的溢出检测。
- 动态图场景:支持 API 级别(
-
MSAdapter 场景:
- 支持 API 级别(
"L1"
)或模块级别("L0"
)的溢出检测。
- 支持 API 级别(
-
task: 必须设置为
"overflow_check"
,表示启用溢出检测功能。 -
dump_path: 指定溢出数据的存储路径。
-
rank: 指定需要检测的设备 rank,留空则表示所有 rank。
-
step: 指定需要检测的训练步骤(iteration),留空则表示所有步骤。
-
level: 检测的粒度级别:
- MSAdapter、MindSpore 动态图: 支持
"L0"
(API 级别)或"L1"
(模块级别)。 - MindSpore 静态图: 必须设置为
"L2"
(kernel 级别),且模型编译优化等级(jit_level
)必须为"O2"
3。
- MSAdapter、MindSpore 动态图: 支持
-
overflow_check: 配置溢出检测的详细参数:
- overflow_nums: 最大溢出次数,表示第 N 次溢出后停止检测。默认为 1,设置为 -1 表示持续检测直到训练结束。
- check_mode(仅适用于 MindSpore 静态图场景): 溢出类型,可选
"aicore"
、"atomic"
或"all"
,默认为"all"
。
- 配置示例:
{ "task": "overflow_check", "dump_path": "/home/data_dump", "rank": [ ], "step": [ ], "level": "L0", "overflow_check": { "overflow_nums": -1 } }
性能
开启溢出dump,在不溢出的情况下,性能会膨胀2-3倍。如果发生溢出,性能影响则与溢出数据量有关
资源占用
- 磁盘:只保存溢出算子的输出,占用较少。
- 显存:理论上不会增加显存占用。
注意事项
- 路径设置:
- 确保
path
字段设置为绝对路径,避免因路径错误导致数据无法保存。 - 工具读写的路径(如
config_path
、dump_path
等)只能包含大小写字母、数字、下划线、斜杠、点和短横线。
- 数据采集范围
- 确保溢出检测的API或模块在
start
和stop
接口之间被调用,否则数据可能无法被采集。 - 如果API是通过直接导入(如
from torch import relu
)调用的,工具可能无法对其进行patch,导致数据缺失。
- 溢出数据的控制
- 可以通过配置
overflow_number
控制溢出dump的数据个数,当达到指定数值后,溢出数据将不再dump。
- 框架与版本限制
- 在MindSpore框架下,静态图场景的L2 Level数据采集需要MindSpore版本高于2.5.0,并且需要使用特定编包选项安装的whl包。
- 数据完整性与格式
- 在dump.json中,API或Module的统计信息可能出现
null
或None
值,常见原因包括输入输出为None、工具不支持某些数据类型,或Tensor的dtype为bool。 - 在动态图场景下,使用
mindspore.jit
装饰的部分会以静态图模式执行,此时的Kernel级数据采集方式与静态图场景相同。
- 工具性能与兼容性
- 使用
msprobe
工具可能会增加运行时的耗时,尤其是在初始化阶段。 - 工具在某些场景下可能会出现流同步失败或GlobalLock报错,这些问题可能需要修复工具版本或调整配置。
通过以上配置和注意事项,可以有效定位和解决动态图算子溢出问题。