# somas_tool **Repository Path**: reku1997/somas_tool ## Basic Information - **Project Name**: somas_tool - **Description**: mindspore somas 分析工具 - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-03-22 - **Last Updated**: 2024-03-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MindSpore SOMAS内存分析工具 ## 本工具为非官方工具 ## 简易使用说明 1. 在脚本中将save_graphs设置为True获取SOMAS跟Taskinfo的日志文件 ```python context.set_context(save_graphs=3) ``` 2. 执行脚本,获取日志文件`*_somas_tensor_offset_*.ir`,文件的开头为设备名称(Ascend, GPU, CPU) 如在 Ascend 设备上: ```bash python MemAnalyzer.py -s Ascend_somas_tensor_offset_1.ir ``` 执行完脚本后会产生以下文件: ```bash . ├── graph_nodes.csv ├── graph_parameters.csv ├── graph_tensors.csv ├── MemoryAnalyze.log ├── Ascend_somas_tensor_offset_1.ir ├── StatisticInfo ├── StatisticInfo\\InUseMemory.png ├── StatisticInfo\\MaxAddress_Cast-op2674_mem_frame.csv ├── StatisticInfo\\MaxAliveMemory_RealDiv-op1387_mem_frame.csv ├── StatisticInfo\\overview.txt ├── StatisticInfo\\TotalMemory.png └── task_info_graph_1.ir ``` 3. 检查脚本处理日志`MemoryAnalyze.log` 4. 结合处理结果分析问题(主要看graph_tensors.csv,看生命周期跨度最长的、使用内存最大的tensor) ## 参数介绍 |参数名称|必选|参数介绍|功能介绍| |---|---|---|---| |-h, --help|N|帮助说明|| |-s, --somas_info_file|Y|SOMAS日志文件,somas_*.ir均可|获取SOMAS的建模信息,还原图信息,根据执行序生成节点和Tensor的生命周期| |-t,--task_info_file|N|TaskInfo文件,task_info*.ir|获取生成task时最终使用的地址| |-cn, --check_node_name|N|节点名称|1. 对指定节点的输入Tensor、输出Tensor进行检查 2.过滤出执行到此节点时的有效Tensor列表| |-ct, --check_tensor_id|N|Tensor ID|1.过滤出使用了当前Tensor为输入或输出的节点列表 2.过滤出与此Tensor有内存重叠的Tensor列表| |-ca, --check_address|N|地址|过滤出使用到此地址的Tensor列表| |-car, --check_address_range|N|地址范围|过滤出使用到此范围内地址的Tensor列表| ## 经典使用场景 ### 精度问题 如果网络/用例有精度问题,可以先通过此工具对内存地址进行校验 ```bash python MemAnalyzer.py -s Ascend_somas_tensor_offset_1.ir -t task_info_graph_1.ir ``` 运行后注意检查日志文件`MemoryAnalyze.log`,看看是否有报错打印,同时检查是否有类似`CheckTensor_ERROR_Tensor11_overwrite_tensors.csv`的文件产生,如果有,请联系我进一步分析 ### 某个节点异常 如果发现某个节点异常,需要排查内存分配信息,可以使用以下命令检查此节点,导出相关信息进一步分析 ``` python MemAnalyzer.py -s Ascend_somas_tensor_offset_1.ir -t task_info_graph_1.ir -cn FusedMulApplyMomentum-op3558 ``` ### 某个Tensor异常 如果发现某个节点异常,需要排查内存分配信息,可以使用以下命令检查此Tensor,导出相关信息进一步分析 ``` python MemAnalyzer.py -s Ascend_somas_tensor_offset_1.ir -t task_info_graph_1.ir -ct 62 ``` ### 某个/某段地址内存异常 如果通过数据比对,发现某个地址的内存被踩/有异常值/nan,可以检查使用此地址的Tensor,分析其生命周期,判断复用是否正确: ``` python MemAnalyzer.py -s Ascend_somas_tensor_offset_1.ir -t task_info_graph_1.ir -ca 0x108830de2a00 -car 0x108830de2a20-0x108830de4a20 ``` ### OutOfMemory 如果内存不够,需要分析网络结构优化内存,可以先执行以下命令 ```bash python MemAnalyzer.py -s Ascend_somas_tensor_offset_1.ir -t task_info_graph_1.ir ``` 然后分析`StatisticInfo\\overview.txt`文件了解内存占用情况,可以通过`StatisticInfo\\InUseMemory.png`了解内存的变化趋势,进而进一步对最大点内存布局`StatisticInfo\\MaxAliveMemory_RealDiv-op1387_mem_frame.csv`进一步分析,了解是否可以通过调整执行序等方法降低最大点的内存 也可以直接通过`Excel`工具对`graph_nodes.csv`和`graph_tensors.csv`进行分析 ## 结果文件列表 |结果文件|说明| |---|---| |以下为默认产生的日志|-s Ascend_somas_tensor_offset_1.ir| |Ascend_somas_tensor_offset_1.ir|输入的SOMAS日志文件| |task_info_graph_1.ir|输入的TaskInfo日志文件| |MemoryAnalyze.log|处理日志| |graph_nodes.csv|图中所有节点信息| |graph_parameters.csv|图中所有Parameter信息| |graph_tensors.csv|图中所有Tensor信息| |StatisticInfo|当前图的统计信息| |StatisticInfo\\InUseMemory.png|图中有效内存大小变化趋势图| |StatisticInfo\\MaxAddress_Cast-op2674_mem_frame.csv|地址偏移最大的节点的有效Tensor内存布局| |StatisticInfo\\MaxAliveMemory_RealDiv-op1387_mem_frame.csv|有效内存最大时的节点的有效Tensor内存布局| |StatisticInfo\\overview.txt|图内存统计信息| |StatisticInfo\\TotalMemory.png|图中累计内存大小变化趋势图| | | | |以下为-cn参数产生的日志|-cn FusedMulApplyMomentum-op3558| |FusedMulApplyMomentum-op3558|FusedMulApplyMomentum-op3558节点相关信息| |FusedMulApplyMomentum-op3558\\FusedMulApplyMomentum-op3558_mem_frame.csv|op3558运行时有效Tensor列表| |FusedMulApplyMomentum-op3558\\Input0_Tensor5_relate_nodes.csv|op3558第一个输入Tensor5的相关节点列表| |FusedMulApplyMomentum-op3558\\Input0_Tensor5_relate_tensors.csv|op3558第一个输入Tensor5的相关Tensor列表| |FusedMulApplyMomentum-op3558\\Input1_Tensor870_relate_nodes.csv|op3558第二个输入Tensor870的相关节点列表| |FusedMulApplyMomentum-op3558\\Input1_Tensor870_relate_tensors.csv|op3558第二个输入Tensor870的相关Tensor列表| |FusedMulApplyMomentum-op3558\\Output0_Tensor897_relate_nodes.csv|op3558第一个输出Tensor897的相关节点列表| |FusedMulApplyMomentum-op3558\\Output0_Tensor897_relate_tensors.csv|op3558第一个输出Tensor897的相关Tensor列表| |FusedMulApplyMomentum-op3558\\Output1_Tensor898_relate_nodes.csv|op3558第二个输出Tensor898的相关节点列表| |FusedMulApplyMomentum-op3558\\Output1_Tensor898_relate_tensors.csv|op3558第二个输出Tensor898的相关Tensor列表| | | | |以下为-ct参数产生的日志|-ct 62| |CheckTensor_Tensor62_relate_nodes.csv|使用Tensor62为输入或输出的节点| |CheckTensor_Tensor62_relate_tensors.csv|与Tensor62使用的内存有地址重叠的Tensor列表| | | | |以下为-ca参数产生的日志|-ca 0x108830de2a00| |CheckAddress_0x108830de2a00_tensors_list.csv|使用了0x108830de2a00地址的Tensor列表| | | | |以下为-car参数产生的日志|-car 0x108830de2a20-0x108830de4a20| |CheckAddressRange_0x108830de2a20-0x108830de4a20_tensors_list.csv|使用了在0x108830de2a20-0x108830de4a20范围内地址的Tensor列表| ## 结果文件说明 ### graph_nodes.csv | 列号 | 标题 | 说明 | | ---- | ---------------- | ------------------------ | | A | | 节点名称 | | B | Index | 节点序号,执行序 | | C | OpId | OP序号 | | D | Stream | 所在流ID | | E | Tensors | 使用到的输入输出节点列表 | | F | Parameters | 使用到的Parameter列表 | | G | Inputs | 输入Tensor或Paramter信息 | | H | Outputs | 输出Tensor信息 | | I | Workspaces | Workspace Tensor信息 | | J | AliveTensorsSize | 有效Tensor大小 | | K | TotalTensorSize | 累计Tensor大小 | | L | InUseMemory | 有效内存大小 | | M | TotalMemory | 累计内存大小 | ### graph_parameters.csv | 列号 | 标题 | 说明 | | ---- | -------------- | --------------------- | | A | | 序号 | | B | SourceNodeName | 源节点名 | | C | OutputIndex | 源节点的输出Index | | D | StartAddr | 起始地址 | | E | StartAddrHex | 十六进制起始地址 | | F | Size | 大小 | | G | EndAddr | 结束地址 | | H | EndAddrHex | 十六进制结束地址 | | I | Destinations | 使用此Patameter的节点 | ### graph_tensors.csv | 列号 | 标题 | 说明 | | ---- | ------------------ | -------------------------- | | A | | Tensor Id | | B | SourceNodeId | 源节点ID | | C | SourceNodeName | 源节点名 | | D | OutputIndex | 源节点的输出Index | | E | SourceStream | 源节点所在流ID | | F | StartAddr | 起始地址 | | G | StartAddrHex | 十六进制起始地址 | | H | Size | 内存大小 | | I | AlignSize | 512对齐后大小 | | J | EndAddr | 结束地址 | | K | EndAddrHex | 十六进制结束地址 | | L | LifeStart | 生命周期起点 | | M | LifeEnd | 生命周期终点 | | N | LifeLong | 全生命周期有效 | | O | TensorType | Tensor类型 | | P | TaskStartAddr | Task起始地址 | | Q | TaskStartAddrHex | Task十六进制起始地址 | | R | TaskSize | Task内存大小 | | S | TaskEndAddr | Task结束地址 | | T | TaskEndAddrHex | Task十六进制结束地址 | | U | DestinationStreams | 使用此Tensor的节点所在的流 | | V | Destinations | 使用此Tensor的节点 | ### StatisticInfo\\overview.txt |结果文件|说明| |---|---| |MindSpore VM HBM Address Range 0x108800000000 - 0x109000000000 | MindSpore VM后端可以使用的HBM内存的地址范围| |Task Tensor Address: Min 0x108800000000, Max 0x108f7b4d7e04|Task中Tensor的地址范围| |SOMAS Tensor Address: Min 0x108800000000,Max 0x10885ac0c000, Total Size 1.418GB|SOMAS分配的Tensor地址范围、大小| |Parameter & ValueNode : Min 0x108f70000000, Max 0x108f7b4d7c04, Total Size 0.1766GB|Parameter和ValueNode的地址范围、大小| |Graph Total Input Static Memory Size 0.1763GB (189329174)|静态内存大小| |Max In Use Memory Node RealDiv-op1387, index 251, Alive Tensor Size 1.406GB (1509209088), In Use Memory size: 1.582GB (1698538262)|复用后内存最大时刻信息| |Max Total Use Memory Size 3.448GB (3702115094)|复用前内存总和| |Max Total Tensor Memory Size 3.272GB (3512785920)|复用前所有Tensor内存总和| |Max Addr without LifeLong Tensor: Node Cast-op2674, Node Id 244, Output Index 0, End Address 0x108859443200|复用后地址最大偏移信息| |Memory Reuse Ratio 57.04%|复用效率| ### InUseMemory.png 有效内存大小变化趋势图 1. In Use Memory: 复用后所需的内存大小,包括静态内存 2. Alive Tensor Size: 复用后所需的Tensor内存大小,不包含静态内存 ### TotalMemory.png 1. Total Memory: 复用前所需的内存大小,包括静态内存 2. Total Tensor Size: 复用后所需的Tensor内存大小,不包含静态内存 ### *_mem_frame.csv 参考`graph_tensors.csv` ### *_tensors_list.csv 参考`graph_tensors.csv` ### *_relate_nodes.csv 参考`graph_tensors.csv`