文档首页 > > 用户指南> 模型转换>

模型转换

模型转换

分享
更新时间:2020/08/03 GMT+08:00

本章节以Caffe框架的resnet50网络模型为例进行讲解。

模型转换入口

  • 可以通过如下两种方式进入模型转换界面。
    • 在菜单栏选择Tools > Model Converter
    • 在菜单栏选择View > Toolbar,菜单栏下方会出现一行工具栏,选择

    转换详情请参见转换步骤

  • 用户也可以通过如下方式使用atc命令行进行模型转换:
    1. 单击Mind Studio界面下方的Terminal窗口。
    2. 参见《ATC工具使用指导》中的“约束及参数说明”章节了解相关参数作用然后参见“转换样例”章节,设置环境变量。
    3. 参见转换样例章节,执行atc命令进行模型转换。

转换前提

进行模型转换前,使用Mind Studio安装用户,将所转换模型的模型文件以及权重文件上传到Mind Studio安装服务器

转换步骤

  1. 打开模型转换页面,在“Choose Model”页签中上传模型文件和权重文件,如图1所示。

    图1 上传模型文件

    参数解释如表1所示。

    表1 Choose Model界面参数配置

    参数

    说明

    Model File

    模型文件。必填。

    有两种选择方式:

    • 单击右侧的文件夹图标,在后台服务器路径选择需要转化的模型对应的*.prototxt文件,并上传。
    • 在参数后面的输入框中自行输入*.prototxt文件在后台服务器的路径,包括*.prototxt文件。

    Weight File

    权重文件。当原始框架是Caffe时,该参数存在且必填:
    • 如果模型文件和权重文件存在于后台服务器同一目录下,且名称和模型文件名称相同,则选择模型文件后,权重文件会自动填充。
    • 如果模型文件和权重文件存在于后台服务器不同目录下,或者在同一目录下,但名称和模型文件名称不相同:
      • 用户手动上传权重文件,单击右侧的文件夹图标,在后台服务器路径选择模型文件对应的*.caffemodel权重文件,上传即可。
      • 在参数后面的输入框中自行输入*.caffemodel权重文件在后台服务器的路径,包括*.caffemodel权重文件。

    Model Name

    模型文件名称,必填。选择模型文件后,该参数会自动填充,用户可以根据需要自行修改名称,要求如下:

    只支持a-z、A-Z、0-9、下划线以及短划线的组合,最多支持40个字符。

    如果模型转换的输出路径已经存在相同名称模型文件,单击“Next”后会提示覆盖原有文件或重命名当前Model Name的信息,用户根据实际情况选择。

    Target SoC Version

    模型转换时指定芯片版本,默认为Ascend310。

    • Ascend310:推理芯片。
    • Ascend910:训练芯片。

    Advanced Options

    高级特性选项,可选,最多支持输入2048个字符。

    • Close Calibration Related Fusion Pass:是否关闭融合功能。
      • 勾选表示关闭融合功能。
      • 不勾选表示开启。默认不勾选。

      如果使用模型小型化工具量化后的模型通过模型转换得到.om离线模型,然后进行精度比对,则需要关闭该开关。勾选后,模型转换完毕,在生成om模型的同级目录下,会生成fusion_switch.cfg配置文件,该文件记录哪些功能被关闭。

    • Arguments:扩展转换参数。模型转换界面不支持配置,但是ATC工具支持的参数,均可通过此选项进行扩展。

      勾选该参数后,在下方编辑框中输入ATC工具可用的参数,用户根据实际情况进行填写,多个参数使用空格分隔。详细参数请参见《ATC工具使用指导》 > 约束及参数说明章节,例如:--log=info。

      如果界面已经有模型转换支持的参数,例如图5页签中的指定模型输出数据类型参数“Output Type”,对应ATC工具中的--output_type参数,则在Arguments再次配置“--output_type”为其他数值,则图5页签中“Output Type”参数指定的数据类型不生效。

    Load Configuration

    导入上次模型转换成功的配置文件。

    如果用户模型转换成功,则在$HOME/modelzoo/${Model Name}/device/路径会生成${Model Name}_config.json配置文件,该文件记录用户模型转换时所选择的配置信息,包括所用模型路径、模型名称、输入输出配置,数据预处理配置等,下次重新转换模型时,通过单击“Load Configuration”选择相应路径下的配置文件,则相应的配置信息会自动填充,用户自行决定是否沿用上次配置还是修改配置后重新进行模型转换。

    单击右侧的按钮,弹出生成模型网络结构图进度条,之后会弹出该模型的原始网络结构图,如图2所示。

    图2 模型网络结构
    • 查看算子信息

      单击某层算子,该层算子会出现绿色选中框,右上角区域会展示该选中框所有的算子,单击可以展开所有算子信息,包括算子名称,算子类型以及算子的参数信息等,单击折叠所有的算子信息;用户也可以逐层单击相关算子左侧的展开按钮,查看参数的详细信息。展示的信息同*.prototxt文件中该层算子的信息。

    • 查看算子输出维度和shape信息

      图2所示界面展示了每一层算子输出的维度和shape信息,如每一层算子连接线中间的NCHW以及1,3,224,224、1,64,112,112等信息。

      如果用户选择的模型中包括不支持的算子,则单击右侧的按钮,Mind Studio界面“Output”窗口会显示failed日志,提示哪些算子不支持并提示shape信息无法获取等信息,在弹出的网络结构图中该算子呈现红色,该场景下无法获取算子的输出维度和shape信息。

    • 搜索算子

      图2单击右侧“Op Search”,在界面右下方会弹出搜索区域,如图3所示。

      搜索区域中给出了该模型所用到的所有算子,您可以在搜索区域对话框中输入算子名称,下方搜索区域会列出相关的算子,选择其中一个算子,左侧网络拓扑结构中相应算子会显示绿色选中框,右上方会展示该选中框所包括的所有算子信息。单击搜索区域中的“Cancel”退出搜索页面。

      图3 模型可视化界面的搜索功能
    • 搜索算子内部信息

      选中某层算子,单击右上方的展开按钮,右侧区域框会展示该层所包括所有算子的信息,然后单击或在右侧区域使用“Ctrl+F”快捷键,弹出图4所示搜索界面,其中:

      • Case sensitive:大小写敏感。
      • Wrap Search:循环搜索。
      • Backward:反向搜索。

      用户在输入框中输入想要查询的信息,比如算子的输入输出、属性等信息,然后在图4界面中勾选搜索特性,单击“Find”进行查找,如果匹配到相关信息,则右侧区域框中相关信息会高亮显示,否则会提示“Value not found”。单击“Close”退出搜索。

      图4 搜索算子内部信息

    单击“OK”退出编辑。

  2. 单击“Next”,进入“Configure Input and Output”配置输入输出页签,如图5所示。

    图5 配置输入输出信息

    参数说明如表2所示。

    表2 节点配置参数

    参数

    说明

    Input Type

    模型输入数据类型。

    • FP32,如果设置了“Input Type”“FP32”,并且同时打开数据预处理功能,则该参数指定的数据类型不生效。
    • FP16,默认为FP16。如果设置了“Input Type”“FP16”,则不能同时开启数据预处理功能。

    Input Format

    输入数据格式。

    • 当原始框架是Caffe时,Input Format默认值是NCHW,不支持修改。
    • 当原始框架是Tensorflow时,Input Format默认是NHWC,用户可以根据需要修改为NCHW格式。

    Input Node: data

    输入数据。

    下方四个输入框分别代表输入数据的N(模型一次处理的图片个数),C(Channel,例如彩色RGB图像的Channel数为3),H(Height),W(Width)。

    若开启AIPP功能,则此处的H,W取值即为AIPP输出数据的高和宽。

    Input Node会自动解析对应模型文件中input_param的参数并填充相应的N、C、H、W;如果无法解析,需要用户根据实际.prototxt文件中的“input: "data"”对应的参数填写。如果模型有多个输入,模型转换界面还会出现另外的参数,例如Input Node:im_info,该参数的取值需要根据.prototxt文件中input: "im_info"对应的参数填写。

    Output Type

    模型输出数据类型。“Output Nodes”参数中不指定输出节点信息,该参数才出现。

    • FP32,默认为FP32。
    • FP16
    • UINT8

    模型转换完毕,在对应的*.om模型文件中,上述数据类型分别以DT_FLOAT、DT_FLOAT16、DT_UINT8值呈现。

    Output Nodes

    指定输出节点信息。

    单击“Select”在弹出的网络拓扑结构中,选中某层算子,右击选择Select,该层变成蓝色,单击“OK”后,在“Output Nodes”参数下面会看到标记层的算子,右击选择Deselect取消选中。

    • Op Name:标记层的算子名称。
    • Data Type:算子输出的数据类型,包括FP32、UINT8、FP16,通过该参数用户可以设置单个算子的输出数据类型。如果此处设置了单个算子的输出数据类型,则“Output Type”参数指定的模型的输出数据类型不生效,该参数不可见。

    “Output Nodes”参数下方Select层的算子,默认为全部选中,用户可以自行选择将不需要输出的算子去勾选,只有选中的算子才会作为模型的输出。本章节以选中所有算子为例进行说明。

    某些情况下,用户想要查看某层算子参数是否合适,则需要将该层算子的参数输出,即可以通过单击“Select”按钮,在弹出网络拓扑结构中将所需层的算子标记为Select,然后在“Output Nodes”参数下方选中想要输出的算子,模型转换后,在相应.om模型文件可以看到该算子的输出直接作为模型的输出。详细信息请参见2

    说明:
    • 如果不标记某层算子或标记后Output Nodes节点下方不选中某个算子,则模型的输出默认为最后一层的算子信息。
    • 如果标记某层算子,并且标记后Output Nodes节点下方选中某个或多个算子,则模型输出为Output Nodes节点下方选中的算子。
    • 如果模型转换过程中该算子被融合掉,则该算子不能作为输出节点。
    • 如果用户选择的模型中包括不支持的算子,则单击“Select”后,Mind Studio界面“Output”窗口会显示failed日志,提示哪些算子不支持并提示shape信息无法获取等信息,在弹出的网络结构图中该算子呈现红色,该场景下无法获取算子的输出维度和shape信息。

  3. 单击“Next”,进入“Configure Data Preprocessing”配置数据预处理界面。

    数据预处理是昇腾AI处理器提供的硬件图像预处理模块,包括色域转换,图像归一化(减均值/乘系数)和抠图(指定抠图起始点,抠出神经网络需要大小的图片)等功能。

    单击“Data Preprocessing”右侧的开关,打开数据预处理功能,如图6所示。如果不涉及预处理,则不用开启预处理开关, 直接进入4。参数说明如表3所示。

    图6 数据预处理界面
    表3 数据预处理配置参数

    参数

    说明

    Input Node: (data)

    节点配置开关,如果有多个节点,可以控制每个节点的开关情况。

    Input Image Format

    输入图片格式。包括如下选项:

    YUV420 sp、YVU420 sp、YUV422 sp、YVU422 sp、YUV400、RGB package、BGR package、ARGB package、RGBA package、ABGR package、BGRA package。

    • 若取值为YUV420 sp、YVU420 sp、YUV422 sp、YVU422 sp,则右侧会出现输入数据类型选项:

      BT.601(Video Range)、BT.601(Full Range)、BT.709(Video Range)、BT.709(Full Range)

      不同的类型,对应不同的色域转换配置(色域转换,用于将输入的图片格式,转换为模型需要的格式,具体色域转换系数会在模型转换完成后生成在insert_op.cfg配置文件中)其中:

      • BT.601是标准清晰度视频的格式,定义于SDTV标准中
      • BT.709是标准化高清晰度视频的格式,定义于HDTV标准中。

      两种标准又分为NARROW(Video Range)和WIDE(Full Range),其中:

      NARROW取值范围为:;WIDE取值范围为:,关于如何判断输入数据的标准,请参见使用AIPP色域转换模型时如何判断视频流的格式标准

    • 若取值为YUV400,不支持色域转换。
    • 若取值为RGB package、BGR package、ARGB package、RGBA package、ABGR package、BGRA package,则不会出现右侧的输入数据类型选项,根据输出(Model Image Format)参数的取值不同,模型转换完成后,数据预处理配置文件insert_op.cfg中如下参数的取值不同:
      • 若取值为BGR package,输出为RGB;或取值为RGB package,输出为BGR:
        #色域转换前,R通道与B通道交换开关/U通道与V通道交换开关
        rbuv_swap_switch : true
      • 若取值为BGR package,输出为BGR;或取值为RGB package,输出为RGB:
        #色域转换前,R通道与B通道交换开关/U通道与V通道交换开关
        rbuv_swap_switch : false
      • 若取值为ARGB package,输出为RGBA;或取值为ABGR package,输出为BGRA:
        #色域转换前,R通道与B通道交换开关/U通道与V通道交换开关
        rbuv_swap_switch : false     
        #色域转换前,RGBA->ARGB, YUVA->AYUV交换开关
        ax_swap_switch : true
      • 若取值为ARGB package,输出为BGRA;或取值为ABGR package,输出为RGBA:
        rbuv_swap_switch : true 
        ax_swap_switch : true
      • 若取值为RGBA package,输出为RGBA;或取值为BGRA package,输出为BGRA:
        rbuv_swap_switch : false 
        ax_swap_switch : false
      • 若取值为RGBA package,输出为BGRA;或取值为BGRA package,输出为RGBA:
        rbuv_swap_switch : true 
        ax_swap_switch : false
      说明:

      模型转换完毕后,在对应的*.om模型文件中,上述输入图片格式参数分别以1、1、9、9、4、3、3、7、7、7、7枚举值呈现。

    Input Image Resolution

    原始图片大小。

    如果Input Image Format取值为YUV420 sp,要求原始图片的宽和高取值是偶数。

    Model Image Format

    模型处理图片格式。

    输入图片格式不同,模型处理图片格式不同,具体格式如下:

    • 若Input Image Format取值为YUV420 sp、YVU420 sp、YUV422 sp、YVU422 sp、RGB package、BGR package,则Model Image Format取值为RGB、BGR。
    • 若Input Image Format取值为YUV400,则Model Image Format取值只能为GRAY。
    • 若Input Image Format取值为ARGB package、RGBA package、ABGR package、BGRA package,则Model Image Format取值为RGBA、BGRA。

    该参数同时也是色域转换开关,默认开启。

    当输入图片格式与模型处理文件格式不一致时需要开启。

    Crop

    抠图开关,若开启,则表示启用抠图功能。默认关闭。

    开启该参数后,下方会出现如下两个参数:

    • Cropping Start:抠图开始位置。
    • Cropping Area:抠图大小,不支持修改,默认抠图大小的宽和高来自图5“Input Node”取值的宽和高。

    针对没有resize和padding功能的AIPP预处理,抠图约束如下:

    • 若Input Image Format取值为YUV420 sp、YVU420 sp,则Cropping Area和Cropping Start的宽和高都必须为偶数。
    • 若Input Image Format取值为YUV422 sp、YVU422 sp,则Cropping Area和Cropping Start的必须为偶数。
    • 若Input Image Format取值为其他值,对Cropping Area和Cropping Start的宽和高没有约束。
    • 若开启抠图功能,则Input Image Resolution >= Cropping Area + Cropping Start。

    Data Normalization

    数据归一化开关。

    开启后,包括Mean、Min、Variance三个配置项,其中Conversion Type表示计算规则。

    Mean

    每个通道的均值。

    当开启“Need Data Normalization”参数时才呈现。

    • 若Input Image Format为YUV420 sp、YVU420 sp、YUV422 sp、YVU422 sp、YUV400、RGB package、BGR package,则该参数显示为Mean: [R][G][B],每个通道的默认值为104、117、123。
    • 若Input Image Format为ARGB package、RGBA package、ABGR package、BGRA package,则该参数显示为Mean: [R][G][B][A],每个通道的默认值为104、117、123、0。

    Min

    每个通道的最小值。

    当开启“Need Data Normalization”参数时才呈现。

    • 若Input Image Format为YUV420 sp、YVU420 sp、YUV422 sp、YVU422 sp、YUV400、RGB package、BGR package,则该参数显示为Min: [R][G][B],每个通道的默认值都为0。
    • 若Input Image Format为ARGB package、RGBA package、ABGR package、BGRA package,则该参数显示为Min: [R][G][B][A],每个通道的默认值都为0。

    Variance

    每个通道的方差。

    当开启“Need Data Normalization”参数时才呈现。

    • 若Input Image Format为YUV420 sp、YVU420 sp、YUV422 sp、YVU422 sp、YUV400、RGB package、BGR package,则该参数显示为Variance: [R][G][B],每个通道的默认值都为1.0。
    • 若Input Image Format为ARGB package、RGBA package、ABGR package、BGRA package,则该参数显示为Variance: [R][G][B][A],每个通道的默认值都为1.0。
    模型转换是否开启AIPP功能,执行推理业务时,对输入图片数据的要求:
    • 模型转换时开启AIPP,在进行推理业务时,输入图片数据要求为NHWC排布。该场景下1“Configure Input and Output”页签中“Input Format”参数指定的数据格式不生效。
    • 模型转换时没有开启AIPP,模型转换完毕,在进行推理业务时,输入图片数据要求为NCHW排布,因此需要用户自行把NHWC排布的原始图片数据转换为NCHW排布。

  4. 单击“Finish”,开始进行模型转换。

    Mind Studio界面下方,“Output”窗口会显示模型转换过程中的日志信息,如果提示“Model converted successfully”,则表示模型转换成功。“Output”窗口会显示模型转换所用的命令、所设置的环境变量、模型转换的结果、模型输出路径以及模型转换日志路径等信息,如下所示(如下所有的数据都为样例,请以实际转换的模型为准)。

    2020-06-28 12:23:24  ATC run success, welcome to the next use.
    2020-06-28 12:23:25  [INFO] GE(29844,atc):2020-06-28-12:23:25.003.671 [framework/domi/graph/manager/graph_mem_allocator.cc:192]29844 Finalize:Finalize.
    2020-06-28 12:23:25  [INFO] RUNTIME(29844,atc):2020-06-28-12:23:25.024.029 [runtime/feature/src/driver.cc:55]29844 ~Driver:deconstruct driver
    #模型转换所用的环境变量
    2020-06-28 12:23:25  Convert model environment variables: 
    export PATH=/usr/local/python3.7.5/bin:$PATH:/home/hisisoc/Ascend/ascend-toolkit/{version}/atc/ccec_compiler/bin:/home/hisisoc/Ascend/ascend-toolkit/{version}/atc/bin && export PYTHONPATH=$PYTHONPATH:/home/hisisoc/Ascend/ascend-toolkit/{version}/atc/python/site-packages/te.egg:/home/hisisoc/Ascend/ascend-toolkit/{version}/atc/python/site-packages/te:/home/hisisoc/Ascend/ascend-toolkit/{version}/atc/python/site-packages/topi.egg:/home/hisisoc/Ascend/ascend-toolkit/{version}/atc/python/site-packages/topi:/home/hisisoc/Ascend/ascend-toolkit/{version}/atc/python/site-packages/auto_tune.egg:/home/hisisoc/Ascend/ascend-toolkit/{version}/atc/python/site-packages/schedule_search.egg && export LD_LIBRARY_PATH=/home/hisisoc/Ascend/ascend-toolkit/{version}/atc/lib64:/home/hisisoc/Ascend/ascend-toolkit/{version}/driver/lib64:/home/hisisoc/Ascend/ascend-toolkit/{version}/add-ons:/usr/local/python3.7.5/lib && export SLOG_PRINT_TO_STDOUT=1 && export ASCEND_OPP_PATH=/home/hisisoc/Ascend/ascend-toolkit/{version}/opp
    #模型转换所用的atc命令
    2020-06-28 12:23:25  Convert model command: 
    /home/hisisoc/Ascend/ascend-toolkit/{version}/atc/bin/atc --output_type="res2a_branch2a:0:FP32;bn2a_branch2a:0:FP32;scale2a_branch2a:0:FP32;res2a_branch2a_relu:0:FP32" --input_shape="data:1,3,224,224" --out_nodes="res2a_branch2a:0;bn2a_branch2a:0;scale2a_branch2a:0;res2a_branch2a_relu:0" --weight="/home/hisisoc/c00230326/module/resnet50.caffemodel" --check_report=/home/hisisoc/modelzoo/resnet50/device/check_report_result.json --input_format=NCHW --output="/home/hisisoc/modelzoo/resnet50/device/resnet50" --soc_version=Ascend310 --insert_op_conf=/home/hisisoc/modelzoo/resnet50/device/insert_op.cfg --framework=0 --save_original_model=false --model="/home/hisisoc/module/resnet50.prototxt" --fusion_switch_file=/home/hisisoc/modelzoo/resnet50/device/fusion_switch.cfg 
    
    #模型转换结果以及输出文件
    2020-06-28 12:23:25  Model converted successfully.
    2020-06-28 12:23:25  Model input path:/home/hisisoc/module/resnet50.prototxt
    2020-06-28 12:23:25  Model output path:/home/hisisoc/modelzoo/resnet50
    2020-06-28 12:23:25  Model convert log file path:/home/hisisoc/modelzoo/resnet50/ModelConvert.txt
    2020-06-28 12:23:25  Model convert config file path:/home/hisisoc/modelzoo/resnet50/device/resnet50_config.json

  5. 模型转换完毕,在服务器后台路径“$HOME/modelzoo/resnet50/device”下会生成用于运行环境运行的.om模型文件,以及模型转换所用的配置信息文件${modelname}_config.json。

    • 如果开启数据预处理功能,在.om同级目录下,还会生成数据预处理的配置信息文件(insert_op.cfg)。
    • 如果勾选关闭融合功能,在.om同级目录下,还会生成融合开关配置文件(fusion_switch.cfg),用于记录哪些功能被关闭。

    模型转换的日志文件(ModelConvert.txt)所在路径为:“$HOME/modelzoo/resnet50”

    hisisoc@dggphicprd32833:~/modelzoo/resnet50/device$ ll
    total 150636
    drwxr-x--- 2 hisisoc hisisoc      4096 Mar 10 16:46 ./
    drwxr-x--- 3 hisisoc hisisoc      4096 Mar 10 16:45 ../
    -rw-r----- 1 hisisoc hisisoc        98 Mar 10 15:55 fusion_switch.cfg        --融合开关配置文件
    -rw-r----- 1 hisisoc hisisoc       453 Mar 10 16:45 insert_op.cfg            --数据预处理配置文件
    -rw-r----- 1 hisisoc hisisoc      2095 Mar 10 18:03 resnet50_config.json     --模型转换所用的配置信息文件,下次模型转换时,可以通过选择该文件沿用上次模型转换的配置数据
    -rw------- 1 hisisoc hisisoc  51581408 Mar 10 16:46 resnet50.om              --上板运行的模型文件         
    

异常处理

如果用户选择的模型文件中包括昇腾AI处理器不支持的算子,则模型转换时会弹出图7所示界面(该界面只是样例,请以实际转换的模型为准)。

图7 模型转换失败-包含不支持算子

图7中会给出模型转换总的算子数、不支持的算子数、不支持算子的类型、不支持算子的名称、不支持的原因,以及处理建议,同时Output窗口会给出详细日志信息,如图8所示。

图8 日志信息

单击“Customize”对该类型的算子创建工程,进行自定义算子开发,详细请参见自定义算子开发

自定义算子开发完成后,重新进行模型转换。

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!非常感谢您的反馈,我们会继续努力做到更好!
反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区论坛频道来与我们联系探讨

智能客服提问云社区提问