昇腾社区首页
中文
注册

工具使用

基础使用方式

可以通过执行以下命令,启动msLeaks工具。

  • 用户不需要使用命令行指定参数
    msleaks [options] <prog_name> 
  • 用户需要使用命令行指定参数
    • 方式一(推荐使用此方式):user.sh为用户脚本
      msleaks [options] bash user.sh
    • 方式二
      msleaks [options] -- <prog_name> [prog_options]
    • 环境变量TASK_QUEUE_ENABLE可自行配置,具体配置可参见Ascend Extension for PyTorch 环境变量参考“TASK_QUEUE_ENABLE”章节。

      当TASK_QUEUE_ENABLE配置为2时,开启task_queue算子下发队列Level 2优化,此时会采集workspace内存。

    • msLeaks工具支持在开放态部署场景下采集内存数据,主要采集HAL类型的内存申请和释放事件,安装开放态部署场景,请参见
表1 命令行参数说明

参数

说明

options

命令行参数,详细参数参见表2

prog_name

用户脚本名称,请保证自定义脚本的安全性。

当开启Step间内存对比功能时不需要输入此参数。

prog_options

用户脚本参数,请保证自定义脚本参数的安全性。

当开启Step间内存对比功能时不需要输入此参数。

表2 参数说明

参数类别

参数

说明

是否必选

通用参数

--help, -h

输出msLeaks帮助信息。

--version, -v

输出msLeaks版本信息。

--steps

选择要采集内存信息的Step ID,须配置为实际Step范围内的整数,可配置1个或多个,当前最多支持配置5个。输入的Step ID以逗号(全角半角逗号均可)分割。如果不配置该参数,则默认采集所有Step的内存信息。

示例:--steps=1,2,3。

--device

采集的设备信息。可选项有npu、cpu和npu:{id},默认值为npu,取值不可为空,可同时选择多个,取值间以逗号(全角半角逗号均可)分隔,示例:--device=npu,cpu。

如果取值中同时包含npu和npu:{id},那么默认还是采集所有npu的内存信息,npu:{id}不生效。

  • npu:采集所有的npu内存信息。
  • cpu:采集cpu的内存信息。
  • npu:{id}:采集指定卡号的npu内存信息,其中id为指定的卡号,需输入有效id,取值范围为[0,31],可采集多个卡的内存信息,取值间以逗号(全角半角逗号均可)分隔,示例:--device=npu:2,npu:7。

--level

采集的算子信息。可选项有0和1,默认值为0,示例:--level=0。

  • 0:取值也可写为op,采集op算子的信息。
  • 1:取值也可写为kernel,采集kernel算子的信息。

--events

采集事件。可选项有alloc、free、launch和access,默认值为alloc,free,launch,取值间以逗号(全角半角逗号均可)分隔。示例:--events=alloc,free,launch。

  • alloc:采集内存申请事件。
  • free:采集内存释放事件。
  • launch:采集算子/kernel下发事件。
  • access:采集内存访问事件。当前仅支持采集ATB和Ascend Extension for PyTorch算子场景的内存访问事件。

需要注意的是,当设置--events=alloc时,默认会增加free,实际采集的为alloc和free;当设置--events=free时,默认会增加alloc,实际采集的为alloc和free;当设置--events=access时,默认会增加alloc和free,实际采集的为access、alloc和free。

--call-stack

采集调用栈。可选项有python和c,可同时选择,以逗号(全角半角逗号均可)分隔。可设置调用栈的采集深度,在选项后输入数字,选项与数字以英文冒号间隔,表示采集深度,取值范围为[0,1000],默认值为50,示例:--call-stack=python,--call-stack=c:20,python:10。

  • python:采集python调用栈。
  • c:采集c调用栈。

--collect-mode

内存采集方式。可选项有full和custom,默认值为full,取值仅支持选择其一,示例:--collect-mode=full。

  • full:全量采集,即用户脚本开始运行时,就开始采集内存信息,直到用户脚本运行结束;也可配合Python自定义采集接口控制采集范围。
  • custom:自定义采集,需配合Python自定义采集接口使用。

    当--collect-mode=custom,且使用Python自定义采集接口进行采集,可在Python自定义采集接口中设置自定义采集范围,采集设置范围内的内存信息。如果仅设置--collect-mode=custom,不使用Python自定义采集接口时,默认不采集任何数据。

--analysis

启用相关内存分析功能。默认值为leaks,如果--analysis参数的取值为空,则不启用任何分析功能;可多选,取值间以逗号(全角半角逗号均可)分隔,示例:--analysis=leaks,decompose。

  • leaks:识别内存泄漏事件。
  • inefficient:识别低效内存,仅当--events=access,malloc,free,launch时,支持识别ATB LLM和Ascend Extension for PyTorch单算子场景的低效内存。
  • decompose:开启内存拆解功能。

需要注意的是,当设置--analysis=leaks或--analysis=decompose时,默认会打开--events的alloc和free,即--events=alloc,free。

--data-format

输出的文件格式。可选项有db和csv,根据需求选择一种格式,取值不可为空,默认值为csv,示例:--data-format=db。

当结果件为db格式时,可使用MindStudio Insight工具展示,请参见MindStudio Insight工具用户指南》中的“内存调优”章节

  • db:db格式文件,请确保已安装sqlite依赖。

    执行sqlite3 --version检查是否安装sqlite依赖,如果未安装,可执行sudo apt-get install sqlite3 libsqlite3-dev命令安装。

  • csv:csv格式文件。

--watch

内存块监测。可选项有start,out{id},end和full-content,其中end为必选,可多选,取值间以逗号(全角半角逗号均可)分隔。参数设置格式为:--watch=start:out{id},end,full-content,示例:--watch=op0,op1,full-content。

  • start:可选,字符串形式,表示一个算子,不同框架下格式不同。当需要设置out{id}时,start为必选。
  • out{id}:可选,表示算子的第几个output。
  • end:必选,字符串形式,表示一个算子,不同框架下格式不同。
  • full-content:可选,如果选择该值,表示落盘完整的Tensor数据,如果不选,则落盘Tensor对应的哈希值。

--output

指定输出件落盘路径,路径最大输入长度为4096。默认的落盘目录为“leaksDumpResults”。

示例:--output=/home/projects/output。

--log-level

指定输出日志的级别,可选值有info、warn、error。默认值为warn。

内存对比参数

--compare

开启Step间内存数据对比功能。

--input

对比文件所在的绝对目录,需输入基线文件和对比文件的目录,以逗号(全角半角逗号均可)分隔,仅在compare功能开启时有效,路径最大输入长度为4096。

示例:--input=/home/projects/input1,/home/projects/input2。

  • 当--events=launch,需要采集Aten算子下发与访问事件时,此时需要满足Ascend Extension for PyTorch框架中的PyTorch版本大于或等于2.3.1,才可使用该功能。
  • 当--analysis参数取值包含decompose时,leaks_dump_{timestamp}.csv结果件中Attr参数中会包含显存类别和组件名称。
  • 当--analysis参数取值包含decompose时,会开启内存分解功能,当前支持对Ascend Extension for PyTorch框架、MindSpore框架和ATB算子框架的内存池进行分类,但是暂不支持对MindSpore框架和ATB算子框架的内存池进行细分类。在Ascend Extension for PyTorch框架下,可支持对aten、weight、gradient、optimizer_state进行细分类,其中weight、gradient、optimizer_state仅限于PyTorch的训练场景(即调用optimizer.step()接口的场景),aten是aten算子中申请的内存,需要同时满足PyTorch版本大于或等于2.3.1,--level参数取值中包含0,--events参数取值中包含alloc,free,access。
  • 当参数--level=1,且使用Hugging Face的tokenizers库时,可能会遇到“当前发生进程fork,并行被禁用”的告警提示。这个告警信息本身不会影响功能,可以选择忽略。如果希望避免这类告警,可执行export TOKENIZERS_PARALLELISM=false来关闭并行的行为。
  • 当--collect-mode=custom,且使用Python自定义采集接口进行采集数据时,Step内内存分析功能不可用,内存块监测、拆解和低效内存识别功能只对采集范围内的数据可用。

配合mstx打点使用

mstx提供了基础打点能力,结合此能力,msLeaks工具可以进行Step内内存分析和Host侧内存采集,同时msLeaks工具能够在可视化trace中标记打点位置,便于用户定位问题代码行。对于C脚本和Python脚本,mstx打点方式略有不同,可参考性能调优工具用户指南中的mstx API参考章节内容。

开启msLeaks工具的Host侧内存采集功能后,输出的leaks_dump_{timestamp}.csv结果件中会存在大量Host侧malloc free记录,cpu_trace_{timestamp}.json结果件中也会存在Host侧内存相关信息。

下方以Python脚本示例,展示mstx结合msLeaks工具的使用方式。

  • Step内内存分析
    请在训练推理脚本内的Step开始和结束处进行标记,并使用固化信息“step start”标识Step开始,示例如下:
    1
    2
    3
    4
    5
    6
    import mstx
    for epoch in range(15): 
        id = mstx.range_start("step start", None) # 标识Step开始并开启Step内内存分析功能
        ....
        ....
        mstx.range_end(id)  # 标识Step结束
    
  • Host侧内存采集

    由于采集整个进程的Host侧内存,会出现落盘文件数据量大、难以解析的情况,因此我们选择通过标识来开启和关闭采集,在所需的Host侧内存操作的代码段前后添加mstx打点,并使用固化信息“report host memory info start”,示例如下:

    1
    2
    3
    4
    5
    import mstx
    id = mstx.range_start("report host memory info start", None)
    ...
    ...
    mstx.range_end(id)  # 标识停止采集Host侧内存操作
    
    • 需控制Host侧内存采集的代码长度,避免采集过多数据,以减少内存数据采集的时间并简化后续分析。
    • 在需要的用户程序前可添加PYTHONMALLOC=malloc。

      PYTHONMALLOC=malloc是Python的环境变量,表示不采用Python的默认内存分配器,所有的内存分配均使用malloc,该配置对小内存申请有一定影响。

结果件说明

msLeaks工具进行内存分析后,输出的结果件如表3

表3 结果件说明

结果件名称

说明

leaks_dump_{timestamp}.csv

使用Step内内存分析功能时,输出内存信息结果文件,并默认保存在leaksDumpResults/dump目录下,具体详情信息可参见•leaks_dump_{timestamp}.csv文件

{device}_trace_{timestamp}.json

使用Step内内存分析功能时,输出可视化内存信息结果文件,并默认保存在leaksDumpResults/trace目录下,具体详情信息可参见•{device}_trace_{timestamp}.json

memory_compare_{timestamp}.csv

使用Step间内存对比功能时,输出内存对比信息结果文件,记录的是基线内存信息、对比内存信息和对比后的内存差异信息,结果件默认保存在leaksDumpResults/compare目录下,具体详情信息可参见•memory_compare_{timestamp}.csv文件

leaks_dump_{timestamp}.db

db格式的内存信息结果文件,可使用MindStudio Insight工具展示,展示结果及具体操作请参见MindStudio Insight工具用户指南》中的“内存调优”章节

  • leaks_dump_{timestamp}.csv文件
    Step内内存分析的结果文件字段解释如表4所示。
    表4 leaks_dump_{timestamp}.csv文件字段及含义

    字段

    说明

    ID

    事件ID。

    Event

    msLeaks记录的事件类型,包括以下几种类型:

    • SYSTEM:系统级事件
    • MALLOC:内存申请
    • FREE:内存释放
    • ACCESS:内存访问
    • OP_LAUNCH:算子执行
    • KERNEL_LAUNCH:kernel执行
    • MSTX:打点

    Event Type

    事件子类型。

    • 当Event为SYSTEM时,Event Type包含ACL_INIT和ACL_FINI。
    • 当Event为MALLOC或FREE时,Event Type包含HALPTAMindSpore、ATB、HOST和PTA_WORKSPACE。
    • 当Event为ACCESS时,Event Type包含READWRITEUNKNOWN
    • 当Event为OP_LAUNCH时,Event Type包含ATEN_STARTATEN_END、ATB_START和ATB_END
    • 当Event为KERNEL_LAUNCH时,Event Type包含KERNEL_LAUNCHKERNEL_START和KERNEL_END
    • 当Event为MSTX时,Event Type包含MarkRange_startRange_end

    Name

    与Event值有关,当Event值为以下值时,Name代表不同的含义。当Event值为其余值时,Name的值为N/A。

    • ACCESS:Name为引发访问的算子名/ID。
    • OP_LAUNCH:Name为算子名称。
    • KERNEL_LAUNCH:Name为kernel名称。
    • MSTX:Name为自定义打点名称

    Timestamp(ns)

    事件发生的时间。

    Process Id

    进程号。

    Thread Id

    线程号。

    Device Id

    设备信息。

    Ptr

    内存地址,可以作为标识内存块的id值,一个内存块的生命周期是同一个ptr的malloc到下一次free。

    Attr

    事件特有属性,每个事件类型有各自的属性项。具体展示信息如下所示:

    • 当Event为MALLOC或FREE时,会展示以下参数信息:
      • allocation_id:相同的allocation_id属于对同一块内存的操作。
      • addr:地址。
      • size:本次申请或者释放的内存大小。
      • owner:内存块所有者,多级分类时格式为{A}@{B}@{C}.....,仅当Event为MALLOC时,存在此参数。
      • total:内存池总大小,仅当Event Type为PTA、MindSpore或ATB时,存在此参数。
      • used:内存池总计二次分配大小,仅当Event Type为PTA、MindSpore或ATB时,存在此参数。
      • inefficient:表示是否为低效内存,值表示低效类别,其中early_allocation表示过早申请,late_deallocation表示过迟释放,temporary_idleness表示临时闲置。仅当Event为MALLOC,Event Type为PTA或ATB时,存在此参数。
    • 当Event为ACCESS时,会展示以下参数信息:
      • dtype:Tensor的dtype。
      • shape:Tensor的shape。
      • size:Tensor的size。
      • format:Tensor的format。
      • type:访问内存池类型,例如ATB。
      • allocation_id:相同的allocation_id属于对同一块内存的操作,仅当Event Type为PTA时,存在此参数。
    • 当Event为OP_LAUNCH,Event Type为ATB_START或ATB_END时,会展示以下参数信息:
      • path:算子在模型中的位置,例如“0_1967120/0/0_GraphOperation/0_ElewiseOperation”,其中包含pid、所属模块名和算子名。
      • workspace ptr:workspace内存起始地址。
      • workspace size:workspace内存大小。
    • 当Event为KERNEL_LAUNCH时,会展示以下参数信息:
      • path:kernel在模型中的位置,例如“0_1967120/1/0_GraphOperation/1_ElewiseOperation/0_AddF16Kernel/before”,其中包含pid、所属算子和kernel名,仅当Event Type为KERNEL_START或KERNEL_END时,存在此参数。
      • streamId:stream编号。
      • taskId:任务编号。

    Call Stack(Python)

    Python调用栈信息(可选)。

    Call Stack(C)

    C调用栈信息(可选)。

  • {device}_trace_{timestamp}.json文件

    可视化内存信息结果件包含两种json文件,分别为cpu_trace_{timestamp}.json(Host侧可视化结果件)和npux_trace_{timestamp}.json(device侧可视化结果件),其中x代表的是device id,例如npu0_trace_{timestamp}.json。

    当--device=cpu时,开启采集cpu内存信息功能,才会生成cpu_trace_{timestamp}.json文件。

    文件可通过Chrome trace(chrome://tracing/)或Perfetto(Perfetto UI)等可视化工具展示,如图1所示。

    图1 Host侧可视化信息
    图2 Device侧可视化信息
    Host侧和Device侧可视化信息详情如表5,可视化文件和mstx打点信息可以辅助进行内存问题定位和问题代码行确定。
    表5 可视化信息详解

    文件

    名称

    说明

    Host侧

    Process PID

    kernelLaunch打点信息。名称中的PID代表的是进程号。

    memory size

    cpu上内存信息。当开启Host侧内存采集功能后,会采集到该参数。

    pin memory size

    hal侧申请的host锁页内存。

    Device侧

    Process PID

    kernelLaunch打点信息。名称中的PID代表的是进程号。

    {Framework Name} allocated memory size

    对应框架的内存池allocated信息。

    {Framework Name} reserved memory size

    对应框架的内存池reserved信息。

    Thread TID

    各Step的持续时间。名称中的TID代表的是线程号。

    mstx 0

    mstx打点信息。

    Thread 0

    长时间未释放Step间的内存信息。

  • memory_compare_{timestamp}.csv文件

    Step间内存对比的结果文件字段解释如表6所示。

    表6 memory_compare_{timestamp}.csv文件字段说明

    字段

    说明

    Event

    msLeaks记录的对比事件类型,包括OP_LAUNCH和KERNEL_LAUNCH两种类型。

    Name

    kernel的名称。

    Device Id

    设备类型、卡号。

    Base

    input输入的第一个文件路径中的数据。

    Compare

    input输入的第二个文件路径中的数据。

    Allocated Memory(byte)

    kernel调用前后的内存变化。

    如果为N/A表示不存在该kernel的调用。

    Diff Memory(byte)

    Base和Compare的内存相对变化。

    • 当数值为0时,表示该kernel调用所引起的内存变化没有差异。
    • 当数值不为0时,表示该kernel调用所引起的内存变化存在差异。