MindSpore Lite推理支持的常见配置项及使用方式说明

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