AI开发平台MODELARTS-模型适配:动态分档模型转换(可选)

时间:2024-09-14 22:29:32

动态分档模型转换(可选)

如果迁移的模型有多个shape档位的需求,可以通过如下方式对模型进行分档转换。

动态分档是指将模型输入的某一维或者某几维设置为“动态”可变,但是需要提前设置可变维度的“档位”范围。即转换得到的模型能够在指定的动态轴上使用预设的几种shape(保证模型支持的shape),相比于静态shape更加灵活,且性能不会有劣化。

动态分档模型转换需要使用配置文件,指定输入格式为“ND”,并在config文件中配置ge.dynamicDims和input_shape使用,在input_shape中将输入shape的动态维度设为-1,并在ge.dynamicDims中指定动态维度的档位,更多配置项可以参考官方文档

  • 如果网络模型只有一个输入:每个档位的dim值与input_shape参数中的-1标识的参数依次对应,input_shape参数中有几个-1,则每档必须设置几个维度。
    以text_encoder模型为例,修改配置文件text_encoder.ini如下所示:
    # text_encoder.ini 
    
    [acl_build_options]
    input_format="ND"
    input_shape="input_ids:1,-1"
    ge.dynamicDims="77;33"

    使用上述配置文件转换得到的模型,支持的输入shape为(1,77)和(1,33)。

    然后使用converter lite执行模型转换,转换命令如下:

    converter_lite --modelFile=./onnx_models/text_encoder/model.onnx --fmk=ONNX --saveType=MINDIR --optimize=ascend_oriented --outputFile=./mindirs --configFile=./configs/text_encoder.ini
  • 如果网络模型有多个输入:档位的dim值与网络模型输入参数中的-1标识的参数依次对应,网络模型输入参数中有几个-1,则每档必须设置几个维度。
    以unet模型为例,该网络模型有三个输入,分别为“sample(1,4,64,64)”“timestep(1)”“encoder_hidden_states(1,77,768)”,修改unet.ini配置文件如下所示:
    # unet.ini 
    
    [acl_build_options]
    input_format="ND"
    input_shape="sample:-1,4,64,64;timestep:1;encoder_hidden_states:-1,77,768"
    ge.dynamicDims="1,1;2,2;3,3"

    转换得到的模型支持的输入dims组合档数分别为:

    图3 组合档数

    第0档:sample(1,4,64,64) + timestep(1) + encoder_hidden_states(1,77,768)

    第1档:sample(2,4,64,64) + timestep(1) + encoder_hidden_states(2,77,768)

    第2档:sample(3,4,64,64) + timestep(1) + encoder_hidden_states(3,77,768)

    然后使用converter lite执行模型转换,转换命令如下:

    converter_lite --modelFile=./onnx_models/unet/model.onnx --fmk=ONNX --saveType=MINDIR --optimize=ascend_oriented --outputFile=./mindirs --configFile=./configs/unet.ini
    • 最多支持100档配置,每一档通过英文逗号分隔。
    • 如果用户设置的dim数值过大或档位过多,可能会导致模型编译失败,此时建议用户减少档位或调低档位数值。
    • 如果用户设置了动态维度,实际推理时,使用的输入数据的shape需要与设置的档位相匹配。
support.huaweicloud.com/bestpractice-modelarts/modelarts_10_2004.html