内存检测

内存检测是针对用户程序运行时的一种异常检测,该工具可以检测并报告算子运行中对外部存储(Global Memory)和内部存储(Local Memory)的越界及未对齐等内存访问异常。

msSanitizer工具不支持对加速库(Ascend Transformer Boost)的算子仓进行内存检测。

支持的内存异常类型

内存检测能够检测并报告诸如内存非法读写、多核踩踏、非对齐访问、内存泄漏、非法释放及分配内存未使用等异常操作,如下表所示。
表1 内存异常类型

异常名

描述

位置

支持地址空间

非法读写

由于访问了未分配的内存导致的异常。

kernel、host

GM、UB、L0{A,B,C}、L1

多核踩踏

AI Core核心访问了重叠的内存导致的踩踏问题。

kernel

GM

非对齐访问

DMA(负责在Global Memory和Local Memory之间搬运数据)搬运的地址与内存的最小访问粒度未对齐导致的异常。

kernel

GM、UB、L0{A,B,C}、L1

非法释放

对未分配或已释放的地址进行释放导致的异常。

host

GM

内存泄漏

申请内存使用后未释放,导致程序在运行过程中内存占用持续增加的异常。

host

GM

分配内存未使用

对内存分配后未使用导致的异常。

kernel、host

GM

启用内存检测

运行msSanitizer工具时,默认启用内存检测功能(memcheck)。其中,application为用户程序。

  • 当用户程序运行完成后,界面将会打印异常报告,异常的具体含义请参见内存异常报告解析
  • 当用户使用PyTorch等框架接入算子时,框架内部可能会通过内存池管理GM内存,而内存池通常会一次性分配大量GM内存,并在运行过程中复用。此时,若用户对算子进行检测并记录GM上所有内存分配和释放的信息,会因为内存池的内存管理方式导致检测信息不准确。因此检测工具提供了手动上报GM内存分配信息的接口,方便用户在算子调用时手动上报该算子应当使用的GM内存范围,详细接口介绍请参见SanitizerReportMallocSanitizerReportFree
  • msSanitizer工具也支持对Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件的AllReduce、AllGather、ReduceScatter、AlltoAll接口及Atlas A3 训练系列产品/Atlas A3 推理系列产品的AllGather、ReduceScatter、AlltoAllV接口进行非法读写的检测,具体介绍请参见Hccl中的“ 高阶API > Hccl > Hccl”章节。
  • msSanitizer工具也支持对通算融合类算子的非法读写检测。

内存异常报告解析

内存检测异常报告会输出多种不同类型的异常信息,以下将对一些简单的异常信息示例进行说明,帮助用户解读异常报告中的信息。