# imas **Repository Path**: stevenaw/imas ## Basic Information - **Project Name**: imas - **Description**: No description available - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2024-05-28 - **Last Updated**: 2026-01-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # imas # 概述 IMAS:Intelligent memory analysis system(理想还是要有的),是昇腾CANN平台图模式下的GE模块的内存维测工具(非官方工具)。关于图模式及GE内存复用技术可以参考 [昇腾社区文档-图模式使用介绍](https://hiascend.com/document/redirect/CannCommunityGraphguide)和[GE内存复用技术](https://www.hiascend.com/zh/developer/techArticles/202407005-1)。 主要功能有查看GE为每个图分配的总内存大小,查看GE为每个算子分配的内存大小和偏移量及GE内存分配算法的复用率。 # 使用方法: ```shell #首次下载后,使用该命令编译生成可执行文件 ./make_imas ``` ## 功能一: 生成内存报告 ```shell #生成内存报告,支持静态图内存分配和rt2.0的动态图内存分配报告, test.log为模型生成和加载阶段日志,Info级别 ./imas report test.log #如果有多个日志文件,如plog目录下的日志文件,使用如下格式: ./imas report /root/ascend/log/debug/plog/plog* #在mem_report目录下会生成4个csv文件及一个json文件,csv下载到windows下可以用excel打开分析,json文件可以使用perfetto打开 ge@ge-PUBZ-WXXXX:~/code/imas$ ll mem_report/ 总用量 20 drwxrwxr-x 2 ge ge 4096 7月 7 21:57 ./ drwxrwxr-x 7 ge ge 4096 7月 7 21:57 ../ -rw-rw-r-- 1 ge ge 8013 7月 7 21:57 imas_graph_perfetto.json #可使用perfetto打开,可视化展示静态图内存 -rw-rw-r-- 1 ge ge 0 7月 7 21:57 imas_mem_addr.csv #内存地址报告 -rw-rw-r-- 1 ge ge 3953 7月 7 21:57 imas_mem_graph.csv #静态图内存复用报告 -rw-rw-r-- 1 ge ge 0 7月 7 21:57 imas_mem_pool.csv #动态图内存复用报告 -rw-rw-r-- 1 ge ge 0 7月 7 21:57 imas_mem_variable.csv #变量内存复用报告 ``` - `Info级别日志开启方式` - `export ASCEND_GLOBAL_LOG_LEVEL=1; 如果是atc场景,需要加参数 --log=info` - `export ASCEND_HOST_LOG_FILE_NUM=1000 修改日志最大文件数,默认文件个数是10,容易被冲掉`。 ## 功能二: 查看内存总大小 ```shell #查看内存总大小,包括静态图、内存池、从rts实际申请内存大小 ./imas total test.log Process_1311101,graph_1,memtype,2,memory_size,17376768(16.57M),reuse rate:0% detail[total:17375424(16.57M) after_reuse:17376768(16.57M) theory_min:17376768(16.57M) no_reuse:17376768(16.57M) atomic:0 continuous:0 streams:1] Process_1311101,graph_2,memtype,2,memory_size,21698048(20.69M),reuse rate:83.74% detail[total:133424128(127.24M) after_reuse:21698048(20.69M) theory_min:18466816(17.61M) no_reuse:2425344(2.31M) atomic:0 continuous:0 streams:1] Process_21913,allocator_id,ge_2,reuse rate,89.02% total,3652818576(3.40G),after_reuse,401145856(382.56M),theory_min,249876160(238.30M) Process_21913,allocator_id,ge_5,reuse rate,0.00% total,8192(8.00K),after_reuse,196608(192.00K),theory_min,1536(1.50K) Process_21913,allocator_id,ge_7,reuse rate,60.89% total,116798624(111.39M),after_reuse,45678592(43.56M),theory_min,44129280(42.08M) Process_21913,allocator_id,ge_9,reuse rate,0.00% total,2048(2.00K),after_reuse,196608(192.00K),theory_min,1536(1.50K) Process_21913,allocator_id,rts_1,reuse rate,0.00% total,447217664(426.50M) ,after_reuse,447217664(426.50M) ,theory_min,447217664(426.50M) Process_21913 Malloc memory from device: total 669604872(638.58M) #从驱动申请的总内存大小(下面是细分不同组件申请的内存大小) |-APP 28311712(27.00M) #APP申请的总内存大小,一般是PTA申请 |-GE 650928328(620.77M) #GE申请的总内存大小(下面是细分GE内部不同类型内存大小) |-GE-MemoryPool 447217664(426.50M) #GE内存池部分申请内存大小 |-GE-StaticGraph 21698048(20.69M) #GE纯静态图申请内存大小 |-GE-Variable 140126720(133.64M) #GE变量部分申请内存大小 |-GE-Weights 4719616(4.50M) #GE权重数据申请内存大小 #graph_ge_default_20220419203053_NPU_121为图的名字和编号 #memtype为内存类型 #memory_size为该图编译完成后计算出来的内存总大小 #reuse rate为内存复用率 #total为不做内存复用时内存总大小 #after_reuse为内存复用处理后总内存大小 #theory_min为内存复用理论最小值(用于评价内存复用率) #no_reuse为设置成不能复用的内存总大小 #atomic为需要清零的内存总大小(不能复用) #streams为stream个数(用于评价内存复用率,越多越不利于复用) #allocator_id内存池的ID,ge内存池内存从rts内存池申请,rts内存池内存从驱动申请。 ``` # 内存报告字段解释 打开imas_mem_graph.csv,筛选出要分析的graph。 ```angular2html Process_16196,g1,optype,HcomAllReduce,name_hcom_1_output_0_offset to ,0,streamid,0,memory_type,2,size,13312,realsize,13312,noalignsize,13312,life time begin,2,life time end,4294967294,child:r:c:z:s,0:0:0:0:1,isref,0,batch,,scope,-1, Process_16196 --进程号16196 g1 --图的名字 optype,HcomAllReduce --算子类型为HcomAllReduce name_hcom_1_output_0_offset to ,0 表示hcom_1的第0个输出逻辑地址为0 streamid,0 --该节点的流id为0,(有的写了两个stream id,比如streamid,1--3,表示原始流id是1,但是和流3上的节点有串行关系,设置为3了) size,13312, --GE分配的block的内存大小,一般是512字节对齐。 realsize,13312 --算子要求的内存大,一般是把noalignsize向32字节对齐,然后再加32字节的大小。 noalignsize,13312, --根据shape和data type计算出来的内存大小 life time begin,2, --生命周期起点,(有的为3--5,使用小的) life time end,4294967294, --生命周期终点,如果不能和后面的节点复用,会设置为4294967294。(有的为345--4294967294,使用大的) child:r:c:z:s,0:1:0:0:0, --child:block层级,r:是否允许复用,c:是否为连续内存,z:是否为零拷贝内存,s:是否是相同stream(相邻两个算子是否在同一个stream) block层级为从0开始的正数,0表示父block,1表示是0的子block,2表示是1的子block。 关于block层级可以参考[GE内存复用技术](https://www.hiascend.com/zh/developer/techArticles/202407005-1) isref,0, --是不是输出引用输入 batch,, --一般场景是空字符串,动态分档场景下是一个有效的字符串 scope,-1 --一般为-1,不用关注。 ``` # perfetto可视化imas_mem_graph.csv 打开[https://ui.perfetto.dev](https://ui.perfetto.dev),加载mem_report/imas_graph_perfetto.json文件,w/s/a/d快捷键可以放大/缩小/左移/右移。 exsample/mem_report目录下有一个imas_graph_perfetto.json,可以尝试以下 ![显示界面及图汇总信息说明](images/display_comment.png) ![节点输出内存信息说明](images/node_out_comment.png)