msMemScope工具基于采集的内存数据,提供泄漏、对比、监测、拆解,以及低效识别等分析能力,帮助开发者快速诊断和优化内存问题。
内存问题主要包括内存泄漏、踩踏、内存碎片,可能导致内存过多等问题,msMemScope工具支持内存泄漏问题的定位。
- 在使用内存分析功能时,如果需要设置--events参数,请确保--events参数中包含alloc和free。
- 在使用内存分析功能时,请勿设置--steps参数。
- 内存泄漏分析的离线方式目前仅支持HAL内存泄漏分析。
- 内存泄漏分析暂不支持场景:VLLM-Ascend。
内存泄漏分析能力支持在线和离线两种方式。
在线方式
在进行内存分析时,需配合使用mstx打点功能进行问题定位,mstx打点详情参考《》。
使用msMemScope工具启动用户程序,Application为用户程序。
[object Object]执行完成后,会出现如下两种回显信息。
如果出现如的回显信息,表示存在内存泄漏问题。回显信息中分别展示了每张卡内存泄漏的汇总信息,包括泄漏发生的Step数、关联的kernel、地址以及泄漏大小等信息。
图 1 memory leak[object Object][object Object]
如果出现如的回显信息,表示存在内存波动。回显信息中展示了单个Step内的内存波动(用最小和最大的内存池分配占用比值定义)以及最小的内存池分配占用,同时给出最小比值和最大比值作为参考,用户可根据该值判断是否存在内存泄漏风险。
[object Object]
图 2 memory fluctuation [object Object][object Object]
离线方式
msMemScope支持对指定范围内的内存事件进行离线泄漏分析。使用mstx标识好泄漏分析的范围后,可以使用该功能对落盘文件进行分析。
对需要检测泄漏的范围进行mstx的mark打点。mstx打点详情参考《》。
[object Object]
执行以下命令,使用msMemScope工具启动用户程序,获取落盘csv文件,Application为用户程序。
[object Object]执行以下命令,调用Python接口,对输出文件中的csv文件进行离线泄漏分析。
[object Object]其中参数信息如下:
- input_path:csv文件所在路径,需使用绝对路径。
- mstx_info:mark打点使用的mstx文本信息,用于标识泄漏分析的范围。
- start_index:内存泄漏分析开始的打点位置编号,即从第几个符合条件的mstx打点位置开始分析。
图 3 offline leakage analysis [object Object][object Object]
如果训练和推理的参数设置一致,但是CANN和Ascend Extension for PyTorch或MindSpore框架的版本不配套,训练推理任务的两个不同Step的内存使用可能存在差异,会造成内存占用过多,甚至OOM的问题。msMemScope工具可帮助进行内存对比分析,从而有效定位内存相关问题。
使用本对比功能之前,需要先采集两个不同Step的数据。
使用环境变量关闭task_queue算子下发队列优化。
[object Object]执行以下命令,使用msMemScope工具采集指定Step的内存数据,需要采集两个不同Step的数据。建议每次只采集一个Step的数据,两个不同Step的数据采集完成后,用来进行Step间内存对比分析。
[object Object]其中参数信息如下:
执行以下命令,对比采集到的两个Step的内存使用差异。
[object Object]其中--compare和--input参数必须一起使用,单个使用无效,同时--input输入的两个文件路径需要逗号(全角半角逗号均可)隔开,--level也可选为op。
Step间对比生成的结果目录如下。
[object Object]
Step间内存问题可通过输出文件查询定位,输出文件详解可参见《》。
大模型场景下,单卡的计算任务十分复杂,如果内存踩踏一旦发生,定位非常困难。msMemScope工具支持通过Python接口在算子执行前后监测指定内存块,根据内存块数据的变化,定位算子间内存踩踏的范围或具体位置。
- 内存块监测功能仅支持Aten单算子和ATB算子,且可以通过--level指定op维度和kernel维度的内存块监测。
- Ascend Extension for PyTorch场景下,kernel算子的监测仅支持调用Python接口的方式,暂不支持watch命令行方式。调用Python接口的监测方式请参见。
- 需控制内存监测算子的范围和内存块大小,避免由于设置过大,导致的dump数据耗时增加,以及磁盘空间占用过多的问题。
- 内存块监测功能暂不支持场景:VLLM-Ascend,原因为VLLM-Ascend不支持设置
[object Object]环境变量。
执行以下命令,关闭多任务下发。
[object Object]执行以下命令,开启内存块监测。
[object Object]表 1 参数说明
[object Object]undefined
[object Object][object Object]在用户的可执行脚本中,调用Python接口指定被监测的Tensor。
增加Python的watcher模块的接口,其中watch接口表示开始监测该内存块,remove接口表示取消监测该内存块。内存块监测有两种开启方式,示例代码中的参数说明可参见。
[object Object]
方式一:直接输入Tensor
示例脚本如下:
[object Object]方式二:输入内存块的地址和长度
示例脚本如下:
[object Object]
表 2 开启内存块监测的参数说明 [object Object][object Object]
[object Object]undefined
命令执行完成后,内存块监测生成的结果目录如下。
[object Object]
内存块监测功能输出的文件为bin文件或csv文件。
- bin文件记录的是Tensor的详细落盘结果。
- csv文件仅记录了Tensor对应的哈希值。
msMemScope工具通过增加Python接口,支持用户自行对代码段做描述。
使用示例中的方式一和方式二,最多可添加3个不重复的标签。
内存拆解功能可通过两种方式开启,方式一为本节的自动开启,方式二为一键分析功能开启,具体操作可参见。内存拆解支持以下应用场景。
[object Object]undefined
在msMemScope工具中,增加Python接口,使用describe标记一个Tensor、一个函数或一段代码,共有三种使用方式。
方式一:通过装饰器修饰某个函数,函数内所有内存申请事件的owner属性都会打上标签test1。
[object Object]方式二:通过with语句,对代码块做标记,代码块内所有内存申请事件的owner属性都会打上标签test2。
代码示例1:
[object Object]代码示例2:
[object Object]方式三:标记Tensor,该Tensor对应的内存申请事件的owner属性会添加用户指定的标记。
[object Object]
低效内存识别的结果会保存在memscope_dump_{timestamp}.csv文件中,具体信息可参见《》。
在训练推理模型时,可能存在部分内存块申请后没有立即使用,或者使用结束后未及时释放等情况,从而导致内存使用增高的现象,对于内存来说,这种现象是低效的。
低效内存(Inefficient Memory)是指在模型运行过程中,Device侧有关内存申请、释放以及访问操作的时机不合理的某个Tensor对象。
msMemScope工具针对op算子粒度支持过早申请(Early Allocation)、过迟释放(Late Deallocation)、临时闲置(Temporary Idleness)三种低效内存的识别,具体说明如所示。
表 1 低效内存说明 [object Object][object Object]
msMemScope工具仅支持识别ATB LLM和Ascend Extension for PyTorch单算子场景的低效内存。
执行以下命令,开启低效内存识别功能。其中Application为用户脚本。
低效内存识别也可离线进行分析,可通过接口自定义设置,具体操作可参见《》。
低效内存识别的结果会保存在memscope_dump_{timestamp}.csv文件中,具体信息可参见《》。
msMemScope工具支持在当前主流训练或推理场景下,一键开启内存拆解或内存快照功能。
一键分析功能可快速开启内存拆解或内存快照采集,其注意事项可具体参见和的内容。
一键分析功能包含两个接口。
init_framework_hooks(framework,version,component,type):
该接口用于初始化分析补丁。参数说明参见下表。
[object Object]undefined
cleanup_framework_hooks()
该接口用于清除之前所有已应用的补丁函数。
在vLLM推理框架下,使用一键分析功能开启内存拆解。
导入msMemScope工具,需先设置config,后通过
[object Object]接口清空历史记录接口,使用[object Object]接口配置需要一键分析的框架类型、版本、组件和功能。使用示例如下:
[object Object]设置
[object Object]和[object Object],采集数据。采集完成后,落盘数据中会包含内存拆解的字段[object Object]。