开发者
下载
[object Object][object Object]

msMemScope工具基于采集的内存数据,提供泄漏、对比、监测、拆解,以及低效识别等分析能力,帮助开发者快速诊断和优化内存问题。

[object Object]undefined
[object Object]

msMemScope工具的安装,请参见《》。

[object Object][object Object]

内存问题主要包括内存泄漏、踩踏、内存碎片,可能导致内存过多等问题,msMemScope工具支持内存泄漏问题的定位。

[object Object]
  • 在使用内存分析功能时,如果需要设置--events参数,请确保--events参数中包含alloc和free。
  • 在使用内存分析功能时,请勿设置--steps参数。
  • 内存泄漏分析的离线方式目前仅支持HAL内存泄漏分析。
  • 内存泄漏分析暂不支持场景:VLLM-Ascend。
[object Object]

内存泄漏分析能力支持在线和离线两种方式。

在线方式

在进行内存分析时,需配合使用mstx打点功能进行问题定位,mstx打点详情参考《》。

  1. 使用msMemScope工具启动用户程序,Application为用户程序。

    [object Object]
  2. 执行完成后,会出现如下两种回显信息。

    • 如果出现如的回显信息,表示存在内存泄漏问题。回显信息中分别展示了每张卡内存泄漏的汇总信息,包括泄漏发生的Step数、关联的kernel、地址以及泄漏大小等信息。

      图 1 memory leak[object Object][object Object]

    • 如果出现如的回显信息,表示存在内存波动。回显信息中展示了单个Step内的内存波动(用最小和最大的内存池分配占用比值定义)以及最小的内存池分配占用,同时给出最小比值和最大比值作为参考,用户可根据该值判断是否存在内存泄漏风险。

      [object Object]

      图 2 memory fluctuation [object Object][object Object]

离线方式

msMemScope支持对指定范围内的内存事件进行离线泄漏分析。使用mstx标识好泄漏分析的范围后,可以使用该功能对落盘文件进行分析。

  1. 对需要检测泄漏的范围进行mstx的mark打点。mstx打点详情参考《》。

    [object Object]
  2. 执行以下命令,使用msMemScope工具启动用户程序,获取落盘csv文件,Application为用户程序。

    [object Object]
  3. 执行以下命令,调用Python接口,对输出文件中的csv文件进行离线泄漏分析。

    [object Object]

    其中参数信息如下:

    • input_path:csv文件所在路径,需使用绝对路径。
    • mstx_info:mark打点使用的mstx文本信息,用于标识泄漏分析的范围。
    • start_index:内存泄漏分析开始的打点位置编号,即从第几个符合条件的mstx打点位置开始分析。

    如果出现的回显信息,表示存在内存泄漏问题。

    图 3 offline leakage analysis [object Object][object Object]

[object Object][object Object]

如果训练和推理的参数设置一致,但是CANN和Ascend Extension for PyTorch或MindSpore框架的版本不配套,训练推理任务的两个不同Step的内存使用可能存在差异,会造成内存占用过多,甚至OOM的问题。msMemScope工具可帮助进行内存对比分析,从而有效定位内存相关问题。

[object Object]

使用本对比功能之前,需要先采集两个不同Step的数据。

[object Object]
  1. 使用环境变量关闭task_queue算子下发队列优化。

    [object Object]
  2. 在训练推理代码中添加mstx打点代码,可参考

  3. 执行以下命令,使用msMemScope工具采集指定Step的内存数据,需要采集两个不同Step的数据。建议每次只采集一个Step的数据,两个不同Step的数据采集完成后,用来进行Step间内存对比分析。

    [object Object]

    其中参数信息如下:

    • options:命令行参数,具体信息可参见
    • Application:用户程序。
    • steps:指定的Step编号。
  4. 执行以下命令,对比采集到的两个Step的内存使用差异。

    [object Object]

    其中--compare和--input参数必须一起使用,单个使用无效,同时--input输入的两个文件路径需要逗号(全角半角逗号均可)隔开,--level也可选为op。

  5. Step间对比生成的结果目录如下。

    [object Object]
[object Object]

Step间内存问题可通过输出文件查询定位,输出文件详解可参见《》。

[object Object][object Object]

大模型场景下,单卡的计算任务十分复杂,如果内存踩踏一旦发生,定位非常困难。msMemScope工具支持通过Python接口在算子执行前后监测指定内存块,根据内存块数据的变化,定位算子间内存踩踏的范围或具体位置。

[object Object]
  • 内存块监测功能仅支持Aten单算子和ATB算子,且可以通过--level指定op维度和kernel维度的内存块监测。
  • Ascend Extension for PyTorch场景下,kernel算子的监测仅支持调用Python接口的方式,暂不支持watch命令行方式。调用Python接口的监测方式请参见
  • 需控制内存监测算子的范围和内存块大小,避免由于设置过大,导致的dump数据耗时增加,以及磁盘空间占用过多的问题。
  • 内存块监测功能暂不支持场景:VLLM-Ascend,原因为VLLM-Ascend不支持设置[object Object]环境变量。
[object Object]
  1. 执行以下命令,关闭多任务下发。

    [object Object]
  2. 执行以下命令,开启内存块监测。

    [object Object]

    表 1 参数说明

    [object Object]undefined
  3. [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
  4. 命令执行完成后,内存块监测生成的结果目录如下。

    [object Object]
[object Object]

内存块监测功能输出的文件为bin文件或csv文件。

  • bin文件记录的是Tensor的详细落盘结果。
  • csv文件仅记录了Tensor对应的哈希值。
[object Object][object Object]

msMemScope工具通过增加Python接口,支持用户自行对代码段做描述。

[object Object]
  • 使用示例中的方式一和方式二,最多可添加3个不重复的标签。

  • 内存拆解功能可通过两种方式开启,方式一为本节的自动开启,方式二为一键分析功能开启,具体操作可参见。内存拆解支持以下应用场景。

    [object Object]undefined
[object Object]

在msMemScope工具中,增加Python接口,使用describe标记一个Tensor、一个函数或一段代码,共有三种使用方式。

  • 方式一:通过装饰器修饰某个函数,函数内所有内存申请事件的owner属性都会打上标签test1。

    [object Object]
  • 方式二:通过with语句,对代码块做标记,代码块内所有内存申请事件的owner属性都会打上标签test2。

    代码示例1:

    [object Object]

    代码示例2:

    [object Object]
  • 方式三:标记Tensor,该Tensor对应的内存申请事件的owner属性会添加用户指定的标记。

    [object Object]
[object Object]

低效内存识别的结果会保存在memscope_dump_{timestamp}.csv文件中,具体信息可参见《》。

[object Object][object Object]

在训练推理模型时,可能存在部分内存块申请后没有立即使用,或者使用结束后未及时释放等情况,从而导致内存使用增高的现象,对于内存来说,这种现象是低效的。

低效内存(Inefficient Memory)是指在模型运行过程中,Device侧有关内存申请、释放以及访问操作的时机不合理的某个Tensor对象。

msMemScope工具针对op算子粒度支持过早申请(Early Allocation)、过迟释放(Late Deallocation)、临时闲置(Temporary Idleness)三种低效内存的识别,具体说明如所示。

表 1 低效内存说明 [object Object][object Object]

[object Object]undefined
[object Object]

msMemScope工具仅支持识别ATB LLM和Ascend Extension for PyTorch单算子场景的低效内存。

[object Object]

执行以下命令,开启低效内存识别功能。其中Application为用户脚本。

[object Object]

低效内存识别也可离线进行分析,可通过接口自定义设置,具体操作可参见《》。

[object Object]

低效内存识别的结果会保存在memscope_dump_{timestamp}.csv文件中,具体信息可参见《》。

[object Object][object Object]

msMemScope工具支持在当前主流训练或推理场景下,一键开启内存拆解或内存快照功能。

[object Object]

一键分析功能可快速开启内存拆解或内存快照采集,其注意事项可具体参见的内容。

[object Object]

一键分析功能包含两个接口。

  • init_framework_hooks(framework,version,component,type):

    该接口用于初始化分析补丁。参数说明参见下表。

    [object Object]undefined
  • cleanup_framework_hooks()

    该接口用于清除之前所有已应用的补丁函数。

[object Object]

在vLLM推理框架下,使用一键分析功能开启内存拆解。

  1. 导入msMemScope工具,需先设置config,后通过[object Object]接口清空历史记录接口,使用[object Object]接口配置需要一键分析的框架类型、版本、组件和功能。

    使用示例如下:

    [object Object]
  2. 设置[object Object][object Object],采集数据。采集完成后,落盘数据中会包含内存拆解的字段[object Object]

[object Object]

一键分析仅支持开启内存拆解和内存快照功能,具体的输出信息请分别参见