算子编译与图编译
ge.aicoreNum
用于配置算子编译时使用的AI Core核数。
参数取值:"整数1|整数2",中间使用“|”分隔:
- 场景1:针对如下产品,整数1表示算子编译时使用的AI Core中的Cube Core核数,整数2表示算子编译时使用的AI Core中的Vector Core核数,整数1与整数2都需要大于0,小于等于AI处理器包含的最大Cube Core和Vector Core数量:
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品 /Atlas A3 推理系列产品 Atlas A2 训练系列产品 /Atlas A2 推理系列产品 - 场景2:针对如下产品,仅需配置整数1,配置格式为:"整数1|",配置整数2不会生效,表示算子编译时使用的AI Core核数:
Atlas 推理系列产品 Atlas 训练系列产品
使用约束:
- 针对参数值中的场景1:
- 针对参数值中的场景2:
- 如果配置该参数的同时启用了算子编译缓存功能(ge.op_compiler_cache_mode参数配置为“enable”或者“force”,默认为“enable”),此参数仅在首次编译时生效。若您想在非首次编译时生效该参数,需要清理编译磁盘的缓存。
其中,${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。以root用户安装为例,安装后文件默认存储路径为:/usr/local/Ascend/cann。<arch>表示具体操作系统架构,xxx请根据实际产品进行选择。
配置示例:
- 场景1配置示例:
{"ge.aicoreNum", "24|48"}; - 场景2配置示例
{"ge.aicoreNum", "10|"}; 或 {"ge.aicoreNum", "10"};
必选/可选:可选
生效级别:全局/session
了解AI Core、Cube Core、Vector Core的关系:
为便于理解AI Core、Cube Core、Vector Core的关系,此处先明确Core的定义,Core是指拥有独立Scalar计算单元的一个计算核,通常Scalar计算单元承担了一个计算核的SIMD(单指令多数据,Single Instruction Multiple Data)指令发射等功能,所以我们也通常也把这个Scalar计算单元称为核内的调度单元。不同产品上的AI数据处理核心单元不同,当前分为以下几类:
- 当AI数据处理核心单元是AI Core:
- 在AI Core内,Cube和Vector共用一个Scalar调度单元,例如
Atlas 训练系列产品 。
- 在AI Core内,Cube和Vector都有各自的Scalar调度单元,因此又被称为Cube Core、Vector Core。这时,一个Cube Core和一组Vector Core被定义为一个AI Core,AI Core数量通常是以多少个Cube Core为基准计算的,例如
Atlas A2 训练系列产品 /Atlas A2 推理系列产品 。
- 在AI Core内,Cube和Vector共用一个Scalar调度单元,例如
- 当AI数据处理核心单元是AI Core以及单独的Vector Core:AI Core和Vector Core都拥有独立的Scalar调度单元,例如
Atlas 推理系列产品 。
ge.AllowMultiGraphParallelCompile
用于使能同一个Session内多线程编译多张图。如果配置为"1",会禁止变量转换格式(参考ge.exec.variable_acc说明)。
参数取值:
- "0",默认值,同一个Session内一个线程编译多张图。
- "1",表示允许用户在一个Session内使用多个线程并发编译多张图。
使用约束:
- 如果配置为"1",不能同时配置ge.exec.variable_acc为"True",否则会校验报错。
- 如果配置为"1",资源类算子如果导致其他图重编译,立即报错。
配置示例:
{"ge.AllowMultiGraphParallelCompile", "1"};
必选/可选:可选
生效级别:全局/session
ge.graph_compiler_cache_dir
图编译磁盘缓存目录,和ge.graph_key配合使用,ge.graph_compiler_cache_dir和ge.graph_key同时配置非空时图编译磁盘缓存功能生效。
配置的缓存目录必须存在,否则会导致编译失败。
图发生变化后,原来的缓存文件不可用,用户需要手动删除缓存目录中的缓存文件或者修改ge.graph_key,重新编译生成缓存文件。
必选/可选:可选
生效级别:session
ge.graph_key
图唯一标识,取值只包含大小写字母(A-Z,a-z)、数字(0-9)、下划线(_)、中划线(-)并且长度不超过128。
必选/可选:可选
生效级别:graph
ge.op_compiler_cache_mode
用于配置算子编译磁盘缓存模式。
参数取值:
- enable:(默认值)表示启用算子编译缓存。启用后可以避免针对相同编译参数及算子参数的算子重复编译,从而提升编译速度。
- force:启用算子编译缓存功能,区别于enable模式,force模式下会强制刷新缓存,即先删除已有缓存,再重新编译并加入缓存。比如当用户的python变更、依赖库变更、算子调优后知识库变更等,需要先指定为force用于先清理已有的缓存,后续再修改为enable模式,以避免每次编译时都强制刷新缓存。
- disable:表示禁用算子编译缓存,算子重新编译。
使用约束:
- 如果要自行指定算子编译磁盘缓存的路径,则需要与ge.op_compiler_cache_dir配合使用。
- 由于force选项会先删除已有缓存,所以不建议在程序并行编译时设置,否则可能会导致其他模型使用的缓存内容被清除而导致失败。
- 建议模型最终发布时设置编译缓存选项为disable或者force。
- 如果算子调优后知识库变更,则需要先通过设置为force来清空缓存,然后再设置为enable重新进行编译,否则无法应用新的调优知识库,从而导致调优应用执行失败。
- 调试开关打开的场景下:
- ge.opDebugLevel非0值:会忽略ge.op_compiler_cache_mode参数的配置,不启用算子编译缓存功能,算子全部重新编译。
- op_debug_config配置非空时,且未配置op_debug_list字段,会忽略ge.op_compiler_cache_mode参数的配置,不启用算子编译缓存功能,算子全部重新编译。
- op_debug_config配置非空时,且配置文件中配置了op_debug_list字段:
- 列表中的算子,忽略ge.op_compiler_cache_mode参数的配置继续重新编译。
- 列表外的算子,如果ge.op_compiler_cache_mode参数配置为enable或force,则启用缓存功能;若配置为disable,则不启用缓存功能,仍旧重新编译。
- 启用算子编译缓存功能时,可以通过配置文件(算子编译完成后,会在ge.op_compiler_cache_dir参数指定路径下自动生成op_cache.ini文件)、环境变量两种方式来设置缓存文件夹的磁盘空间大小:
- 通过配置文件op_cache.ini设置
若op_cache.ini文件不存在,则需要手动创建。打开该文件,增加如下信息:
#配置文件格式,必须包含,自动生成的文件中默认包括如下信息,手动创建时,需要输入 [op_compiler_cache] #限制某个芯片下缓存文件夹的磁盘空间的大小,默认值为500,取值需为整数,单位为MB max_op_cache_size=500 #设置需要保留缓存的空间大小比例,取值范围:[1,100],默认值为50,单位为百分比;例如取值为80表示缓存空间不足时,删除缓存文件,保留80%缓存空间 remain_cache_size_ratio=50
- 上述文件中的max_op_cache_size和remain_cache_size_ratio参数取值都有效时,op_cache.ini文件才会生效。
- 当编译缓存文件大小超过“max_op_cache_size”的设置值,且超过半小时缓存文件未被访问时,缓存文件就会老化(算子编译时,不会因为编译缓存文件大小超过设置值而中断,所以当“max_op_cache_size”设置过小时,会出现实际编译缓存文件大小超过此设置值的情况)。
- 若需要关闭编译缓存老化功能,可将“max_op_cache_size”设置为“-1”,此时访问算子缓存时不会更新访问时间,算子编译缓存不会老化,磁盘空间使用默认大小500MB。
- 若多个使用者使用相同的缓存路径,建议使用配置文件的方式进行设置,该场景下op_cache.ini文件会影响所有使用者。
- 通过环境变量设置
该场景下,开发者可以通过环境变量ASCEND_MAX_OP_CACHE_SIZE来限制某个芯片下缓存文件夹的磁盘空间的大小,当编译缓存空间大小达到ASCEND_MAX_OP_CACHE_SIZE设置的取值,且超过半个小时缓存文件未被访问时,缓存文件就会老化。可通过环境变量ASCEND_REMAIN_CACHE_SIZE_RATIO设置需要保留缓存的空间大小比例。
配置示例如下:
# ASCEND_MAX_OP_CACHE_SIZE环境变量默认值为500,取值需为整数,单位为MB export ASCEND_MAX_OP_CACHE_SIZE=500 # ASCEND_REMAIN_CACHE_SIZE_RATIO环境变量取值范围:[1,100],默认值为50,单位为百分比;例如取值为80表示缓存空间不足时,删除缓存文件,保留80%缓存空间 export ASCEND_REMAIN_CACHE_SIZE_RATIO=50
- 通过环境变量配置,只对当前用户生效。
- 若需要关闭编译缓存老化功能,可将环境变量“ASCEND_MAX_OP_CACHE_SIZE”设置为“-1”,此时访问算子缓存时不会更新访问时间,算子编译缓存不会老化,磁盘空间使用默认大小500MB。
若同时配置了op_cache.ini文件和环境变量,则优先读取op_cache.ini文件中的配置项,若op_cache.ini文件和环境变量都未设置,则读取系统默认值:默认磁盘空间大小500MB,默认保留缓存空间的50%。
- 通过配置文件op_cache.ini设置
配置示例:
{"ge.op_compiler_cache_mode", "enable"};
必选/可选:可选
生效级别:全局/session/graph
ge.op_compiler_cache_dir
用于配置算子编译磁盘缓存的目录。
参数值格式:路径支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)、中文字符。
默认值:$HOME/atc_data
- 如果参数指定的路径存在且有效,则在指定的路径下自动创建子目录kernel_cache;如果指定的路径不存在但路径有效,则先自动创建目录,然后在该路径下自动创建子目录kernel_cache。
- 用户请不要在默认缓存目录下存放其他自有内容,自有内容在软件包安装或升级时会同默认缓存目录一并被删除。
- 通过该参数指定的非默认缓存目录无法删除(软件包安装或升级时不会被删除)。
- 算子编译磁盘缓存路径,除ge.op_compiler_cache_dir参数设置的方式外,还可以配置环境变量ASCEND_CACHE_PATH,几种方式优先级为:配置参数“ge.op_compiler_cache_dir”>环境变量ASCEND_CACHE_PATH>默认存储路径。
必选/可选:可选
生效级别:全局/session/graph
ge.optimizationSwitch
算子编译时,融合规则(Pass)的控制开关。
该参数与ge.fusionSwitchFile的区别是:ge.fusionSwitchFile仅能关闭图融合和UB融合的规则,并且需要单独配置JSON文件,而该参数适用于所有规则,通过参数就能指定融合规则,不需要再单独设置JSON文件。如果两个参数都配置,且配置了同一个融合规则,则以ge.optimizationSwitch参数配置的为准。
参数取值:"Passname1:on;Passname2:off",可以拼接多个key-value键值对,key为Pass名称,value为on(表示开)或off(表示关),不支持大小写模式匹配,多组配置使用英文分号分隔。可配置的融合规则请参见融合规则列表。
配置示例:
{"ge.optimizationSwitch", "Passname1:on;Passname2:off"};
必选/可选:可选
生效级别:全局/session/graph
ge.topoSortingMode
对算子进行图模式编译时,可选择的不同的图遍历模式。主要面向在线推理场景。
参数取值:
- 0:BFS,Breadth First Search,广度优先遍历策略。
- 1:(默认值)DFS,Depth First Search,深度优先遍历策略。
- 2:RDFS,Reverse DFS,反向深度优先遍历策略。
- 3:StableRDFS,稳定拓扑序策略,针对图里已有的算子,不会改变其计算顺序;针对图里新增的算子,使用RDFS遍历策略。
配置示例:
{"ge.topoSortingMode", "1"};
必选/可选:可选
生效级别:全局/session/graph