MSLite离线转换常见配置项(ACL)
支持的shape类型
固定shape
输入输出的shape是固定的。
[acl_init_options]
input_shape="sample:2,4,64,64;timestep:1;encoder_hidden_states:2,77,768"
动态分档
多个固定shape的组合。
# 如下配置表示该模型有3个输入,
# 其中第一个输入的第3、4轴是动态的;-1,-1表示可选档位组合;ge.dynamicDims 设置的是5个档位。
[acl_build_options]
input_format="ND"
input_shape="sample:2,4,-1,-1;timestep:1;encoder_hidden_states:2,77,768"
ge.dynamicDims="64,64;128,128;64,96;96,96;96,128"
纯动态
输入输出的shape是不固定的。
# 如下配置表示该模型有3个输入,其中第一个输入的第3、4轴是纯动态的,取值可以是任意值。
[acl_build_options]
input_shape="sample:2,4,-1,-1;timestep:1;encoder_hidden_states:2,77,768"
不同精度模式设置
参数取值:force_fp16(默认值)、force_fp32、must_keep_origin_dtype、allow_mix_precision_bf16、allow_mix_precision/allow_mix_precision_fp16
使能fp32
系统内部都会根据矩阵类算子或矢量类算子,来选择不同的处理方式。
如果网络模型中存在部分算子实现不支持float32,比如某算子仅支持float16类型,则该参数不生效,仍然使用支持的float16;如果该算子不支持float32,且又配置了黑名单(precision_reduce = false),则会使用float32的AI CPU算子;如果AI CPU算子也不支持,则执行报错。
[acl_init_options]
ge.exec.precision_mode=force_fp32
保持原图精度。
- 如果原图中某算子精度为float16,AI Core中该算子的实现不支持float16、仅支持float32和bfloat16,则系统内部会自动采用高精度float32。
- 如果原图中某算子精度为float16,AI Core中该算子的实现不支持float16、仅支持bfloat16,则会使用float16的AI CPU算子;如果AI CPU算子也不支持,则执行报错。
- 如果原图中某算子精度为float32,AI Core中该算子的实现不支持float32类型、仅支持float16类型,则会使用float32的AI CPU算子;如果AI CPU算子也不支持,则执行报错。
[acl_init_options]
ge.exec.precision_mode=must_keep_origin_dtype
使能BF16
针对原始模型中float32数据类型的算子,按照内置的优化策略,自动将部分float32的算子降低精度到bfloat16,从而在精度损失很小的情况下提升系统性能并减少内存使用;如果算子不支持bfloat16和float32,则使用AI CPU算子进行计算;如果AI CPU算子也不支持,则执行报错。
# 表示使用混合精度bfloat16和float32数据类型来处理神经网络的过程。
[acl_init_options]
ge.exec.precision_mode=allow_mix_precision_bf16
混合精度
针对网络模型中float32数据类型的算子,按照内置的优化策略,自动将部分float32的算子降低精度到float16,从而在精度损失很小的情况下提升系统性能并减少内存使用。
# 表示使用混合精度float16和float32数据类型来处理神经网络的过程。allow_mix_precision效果等同allow_mix_precision_fp16。
[acl_build_options]
ge.exec.precision_mode=allow_mix_precision_fp16
ge.exec.modify_mixlist="./op_fp32.json"
op_fp32.json内容为profiling中的具体算子,black-list表示走fp32的算子,例如:
{
"black-list": {
"to-add": [
"Add",
"SplitVD",
"ConcatD",
"Mul"
]
}
}
开启确定性计算
默认情况下,不开启确定性计算,算子在相同的硬件和输入下,多次执行的结果可能不同。开启确定性计算功能时,算子在相同的硬件和输入下,多次执行将产生相同的输出。
参数取值:
- 0:(默认值)不开启确定性计算。
- 1:开启确定性计算。
[acl_init_options]
ge.deterministic=1
设置算子是高精度实现模式
表示网络模型中算子采用高精度实现模式。
[acl_init_options]
ge.exec.precision_mode=must_keep_origin_dtype
ge.opSelectImplmode=high_precision_for_all
设置算子是高性能实现模式
表示网络模型中算子采用高性能实现模式。以gatherV2算子为例。
[acl_build_options]
ge.exec.op_precision_mode="./op_precision.ini"
其中op_precision.ini的内容如下
[ByOpType]
GatherV2=high_performance
上述是按照算子类型进行设置高性能,也可以按照算子名称设置,用法参考:aclgrphBuildModel支持的配置参数-数据类型-Ascend Graph API-图开发接口-CANN社区版8.1.RC1.alpha002开发文档-昇腾社区
融合pass开关设置
使能融合算子
如下为使能所有融合算子
[ascend_context]
plugin_custom_ops=All
也可以通过如下方式使能单个融合算子,或者不同的融合算子的组合使能
[ascend_context]
plugin_custom_ops=FlashAttention,GeGluV2,LayerNormV3,GroupNormSilu,AddLayerNormV3
[ascend_context]
op_attrs=FlashAttention:inner_precise:0 # Atlas 300I上FA算子的近似计算,可以提升性能
op_attrs=FlashAttention:seq_threshold:1024 # 限制融合算子的最小的seq lenth
op_attrs=FlashAttention:input_layout:BNSD_BSND # 设置融合算子的format
融合pass使能
模型出现精度问题,可以尝试通过开关融合pass提高模型精度。fusion.json文件中SoftmaxFusionPass等融合pass可以通过模型转换产生的fusion_result.json文件查看,也可以通过查看ge图结合profiling的op_summary_xxxx.csv表格找出融合pass。
[acl_init_options]
ge.fusionSwitchFile=./fusion.json
fusion.json
文件的设置如下所示,设置融合策略,如下设置是关闭所有融合(在转换模型时使用);
{
"Switch":{
"GraphFusion":{
"ALL":"off"
},
"UBFusion":{
"ALL":"off"
}
}
}
一键式关闭融合规则的同时,可以开启部分融合规则:
{
"Switch":{
"GraphFusion":{
"ALL":"off",
"SoftmaxFusionPass":"on"
},
"UBFusion":{
"ALL":"off",
"TbePool2dQuantFusionPass":"on"
}
}
}
一键式开启融合规则的同时,可以关闭部分融合规则:
{
"Switch":{
"GraphFusion":{
"ALL":"on",
"SoftmaxFusionPass":"off"
},
"UBFusion":{
"ALL":"on",
"FusionVirtualOpSetSwitch":"off"
}
}
}
关闭单个融合规则:
"Switch":{
"GraphFusion":{
},
"UBFusion":{
"AutomaticUbFusion":"off"
}
}
}
更加详细的使用方式可以在Ascend官网搜索“fusion_switch_file”查询。
BatchNormalization 走BNInfer (默认走BNInferenceD会有精度问题)
[acl_init_options]
ge.fusionSwitchFile="fusion_switch.config"
fusion_switch.config:
{
"Switch":{
"GraphFusion":{
"BatchNormBnInferOnlyFusionPass":"on"
}
}
}
显/内存分析优化
关闭内存复用
参数取值:
- 1:关闭内存复用。
- 0:(默认值)开启内存复用。
[acl_init_options]
ge.exec.disableReuseMemory=1
内存清理策略
是否集中清理网络中所有memset算子(含有memset属性的算子都是memset算子)占用的内存。
参数取值:
- 0:(默认值)集中清理。
- 1:单独清理,对网络中每一个memset算子进行单独清理。当网络中memset算子内存过大时建议使用此种清理方式,对降低使用内存有明显效果,但可能会导致一定的性能损耗。
[acl_init_options]
ge.exec.atomicCleanPolicy=1
MSLite在线加载常见配置项(GE)
支持的shape类型
固定shape
[ge_graph_options]
ge.inputShape=context:1,77,768;timesteps:1;x:1,8,192,192
动态分档
GE流程动态分档的配置项中,ge.inputShape
需要对模型的输入名称进行首字母排序。例如模型的输入为x:1,8,-1,-1;timesteps:1;context:1,77,-1
,在配置文件中,需按照如下方式填写:
[ge_graph_options]
ge.inputShape=context:1,77,-1;timesteps:1;x:1,8,-1,-1
ge.dynamicDims=768,192,192;768,192,176;1024,192,192;1024,192,176
ge.dynamicNodeType=1
其中ge.dynamicDims
中填写的分档值需要与ge.inputShape
的-1逐一对应,即首字母排序后的顺序对应。
纯动态
[ge_graph_options]
ge.inputShape=context:1,77,-1;timesteps:1;x:1,8,-1,-1
不同精度模式设置
精度模式
精度模式,常用的几个精度模式如下:
force_fp32/cube_fp16in_fp32out:配置为force_fp32或cube_fp16in_fp32out,效果等同,系统内部都会根据矩阵类算子或矢量类算子,来选择不同的处理方式。cube_fp16in_fp32out为新版本中新增的,对于矩阵计算类算子,该选项语义更清晰。
force_fp16:表示网络模型中算子支持float16和float32时,强制选择float16。
must_keep_origin_dtype:保持原图精度。
allow_mix_precision/allow_mix_precision_fp16:配置为allow_mix_precision或allow_mix_precision_fp16,效果等同,均表示使用混合精度float16和float32数据类型来处理神经网络的过程。
allow_mix_precision_bf16,表示使用混合精度bfloat16和float32数据类型来处理神经网络的过程。
更多的信息可以在昇腾官网搜索关键字“–precision_mode”
[ge_session_options]
ge.exec.precision_mode=must_keep_origin_dtype
显/内存分析优化
内存清理策略
是否集中清理网络中所有atomic算子占用的内存。
参数取值:
0:集中清理,默认为0。
1:单独清理,对网络中每一个atomic算子进行单独清理。当网络中atomic算子内存过大时建议使用此种清理方式,对降低使用内存有明显效果,但可能会导致一定的性能损耗。
[ge_session_options]
ge.exec.atomicCleanPolicy=1
内存静态分配方式
网络运行是否使用内存静态分配方式。
参数取值:
0:动态分配内存,即按照实际大小动态分配,不支持内存扩展。默认为0。
2:动态扩展内存,训练与在线推理场景下,可以通过此取值实现同一session中多张图之间的内存复用,即以最大图所需内存进行分配。例如,假设当前执行图所需内存超过前一张图的内存时,按照当前内存大小增量扩展内存。该场景下仅静态shape支持内存动态扩展。
3:仅动态shape支持内存动态扩展,解决内存动态分配时的碎片问题,降低动态shape网络内存占用。
4:静态shape和动态shape同时支持内存动态扩展。
为兼容历史版本配置,配置为“1”的场景下,系统会按照“2”动态扩展内存的方式进行处理。
[ge_session_options]
ge.exec.staticMemoryPolicy=2
算子编译
缓存设置
在执行模型推理时会搜索ge.graph_compiler_cache_dir目录下是否有缓存,若存在则直接读取,若不存在则生成缓存。ge.graph_key表示唯一标识符,用于区分不同的缓存。
[ge_session_options]
ge.graph_compiler_cache_dir=./ge_cache/
ge.graph_key=lighting
CCE收集
算子编译debug功能开关。参数取值为1表示开启算子debug功能,在当前执行路径生成kernel_meta文件夹,并在该文件夹下生成*.o(算子二进制文件)、*.json文件(算子描述文件)和TBE指令映射文件(算子cce文件*.cce和python-cce映射文件*_loc.json),用于后续分析AICore Error问题。
[acl_build_options]
ge.opDebugLevel=1
修改算子编译保存路径
export ACL_OP_COMPILER_CACHE_DIR=/home/XXX
其他
权重外置
若网络中的weight占用内存较大,且模型加载环境内存受限时,建议通过此配置项将网络中Const/Constant节点的权重外置,同时将节点类型转换为FileConstant类型,防止由于内存不足导致模型编译加载出错。
[ge_session_options]
ge.externalWeight=1
format设置
如果formatMode=1,则是走ND format;如果formatMode=0,NZ格式的matmul将会使用,模型中会插入transdata算子。并不是所有算子都支持这两种格式,取决于在具体的数据格式(fp16、fp32、bf16等等)下,CANN的算子支持哪种排布格式的计算,有的算子可能只支持BF16的ND farmat格式计算。
[ge_session_options]
ge.exec.formatMode=1