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

如果迁移的模型有多个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需要与设置的档位相匹配。