AI开发平台MODELARTS-模型适配:静态shape模型转换

时间:2024-04-30 18:09:30

静态shape模型转换

转换静态shape模型需要在模型转换阶段固定模型的输入shape,也就是说每个输入shape是唯一的。静态shape转换主要包括两种场景:

  • 第一种是待转换onnx模型的输入本身已经是静态shape,此时不需要在转换时指定输入shape也能够正常转换为和onnx模型输入shape一致的mindir模型。
  • 第二种是待转换onnx模型的输入是动态shape(导出onnx模型时指定了dynamic_axes参数),此时需要在转换时明确指定输入的shape。

转换时指定输入shape可以在命令行中指定,也可以通过配置文件的形式进行指定。

  • 在命令行中指定输入shape。

    命令行可以直接通过--inputShape参数指定输入的shape,格式为“input_name:input_shape”,如果有多个输入,需要使用“;”隔开,比如“input1_name:input1_shape;input2_name:input2_shape”。

    converter_lite --modelFile=./text_encoder/model.onnx --fmk=ONNX --saveType=MINDIR --optimize=ascend_oriented --outputFile=./text_encoder --inputShape="input_ids:1,77"
  • 在配置文件中指定输入shape。

    配置文件中通过“[ascend_context]”配置项指定input_shape,格式与命令行一致,多个输入,需要使用“;”隔开;然后在命令行中通过--configFile指定对应的配置文件路径即可。

    # text_encoder.ini 
    
    [ascend_context]
    input_shape=input_ids:[1,77]

    转换命令如下:

    converter_lite --modelFile=./text_encoder/model.onnx --fmk=ONNX --saveType=MINDIR --optimize=ascend_oriented --outputFile=./text_encoder --configFile=./text_encoder.ini

    在使用converter_lite工具转换时,默认是将所有算子转换为fp16,如果想要将固定shape的模型精度修改为fp32进行转换,需要在配置文件中指定算子的精度模式为precision_mode,配置文件的写法如下(更多精度模式请参考precision_mode):

    # text_encoder.ini 
    [ascend_context]
    input_shape=input_ids:[1,77]
    precision_mode=enforce_fp32

对于本次AIGC迁移,为了方便对多个模型进行转换,可以通过批量模型转换脚本自动完成所有模型的转换。

  1. 执行以下命令创建并进入static_shape_convert目录。

    mkdir -p /home_host/work/static_shape_convert 
    cd /home_host/work/static_shape_convert

  2. 在static_shape_convert目录下新建converter_onnx2mindir.sh文件并复制下面内容。其中,onnx_dir表示onnx模型的目录,mindir_dir指定要生成的mindir模型的保存目录。

    # converter_onnx2mindir.sh
    # 设置onnx模型和mindir模型目录
    onnx_dir=/home_host/work/runwayml/onnx_models
    mindir_dir=./mindir_models
    
    # 指定配置文件路径
    config_dir=/home_host/work/modelarts-ascend/examples/AIGC/stable_diffusion/configs
    
    echo "================begin converter_lite====================="
    
    sub_cmd='--fmk=ONNX --optimize=ascend_oriented --saveType=MINDIR'
    mkdir -p $mindir_dir
    # rm缓存,慎改
    atc_data_dir=/root/atc_data/
    # 通用转换方法
    common_converter_model() {
        model_name=$1
        echo "start to convert $model_name"
        rm -rf $atc_data_dir
        converter_lite --modelFile="$onnx_dir/$model_name/model.onnx" \
                       --outputFile="$mindir_dir/$model_name" \
                       --configFile="$config_dir/$model_name.ini" \
                       $sub_cmd
        printf "end converter_lite\n"
    }
    common_converter_model "text_encoder"
    common_converter_model "unet"
    common_converter_model "vae_encoder"
    common_converter_model "vae_decoder"
    common_converter_model "safety_checker"
    
    echo "================converter_lite over====================="

    转换结果如下,其中safety_checker模型转换成功了,但中间有ERROR日志,这个属于常量折叠失败,不影响结果。

    图2 转换结果

support.huaweicloud.com/bestpractice-modelarts/modelarts_10_2004.html