更新时间:2021-03-18 GMT+08:00
分享

安装后处理

Caffe环境修改

安装完模型小型化工具,量化模型前,用户需要获取并安装Caffe源代码增强包caffe_patch.tar.gz,在Caffe源码中增加部分源码文件、动态库文件及修改部分源代码。

安装过程整体分为两部分:

  1. 拷贝新增源码和动态库文件到Caffe环境caffe-master工程目录下。
  2. 对Caffe环境caffe-master工程目录下部分文件安装patch,以实现对文件的自动修改。

用户可以执行caffe_patch中的自动安装脚本install.py,如果脚本执行成功,则会自动将caffe_patch中的内容安装到Caffe环境caffe-master工程目录下。安装过程中如果安装patch失败,则会在caffe_patch目录生成caffe_compare文件夹。该文件夹中含有原始的文件(从github上下载)和修改后的文件,用户需要自行进行比对,并将差异部分手动合并到Caffe环境对应文件中。安装或手动修改完成后,需要重新编译Caffe环境。具体操作方法如下:

  1. 解压Caffe源代码增强包。

    模型小型化工具的安装用户在软件包所在路径执行如下命令,解压caffe_patch.tar.gz软件包:

    tar -zxvf caffe_patch.tar.gz
    获得如下内容:
    • caffe_patch/src/caffe:用于存放自定义层实现源码文件以及公共函数。
    • caffe_patch/include/caffe:用于存放自定义层定义头文件以及公共函数。
    • caffe_patch/quant_lib:用于存放量化算法核心动态库libquant.so, libquant_gpu.so。
    • caffe_patch/patch:
      • caffe.proto.patch:用于修改caffe-master/src/caffe/proto/caffe.proto
      • Makefile.patch:用于修改caffe-master/Makefile
      • lstm_quant_layer.hpp.patch:用于在caffe-master/include/caffe/layers/目录生成lstm_quant_layer.hpp。
      • lstm_quant_layer.cpp.patch:用于在caffe-master/src/caffe/layers/目录生成lstm_quant_layer.cpp。
    • caffe_patch/install.py:Caffe环境一键式安装脚本。

  2. 切换到caffe_patch/install.py脚本所在目录,执行如下命令,将caffe_patch中的内容替换到Caffe环境caffe-master工程目录下。

    执行如下命令时,请确保模型小型化工具所在服务器能链接网络。
    python3.7.5 install.py [--caffe_dir CAFFE_DIR]

    参数解释如下:

    表1 量化脚本所用参数说明

    参数

    说明

    是否必填

    [--h]

    显示帮助信息。

    [--caffe_dir CAFFE_DIR]

    Caffe源代码路径,支持相对路径和绝对路径。

    使用样例如下:

    python3.7.5 install.py  --caffe_dir caffe-master 

    如果提示“Finish install patch.”并且没有报错,则说明文件替换成功,否则替换失败。如果替换失败,则在caffe_patch目录会生成caffe_compare文件夹,存储替换失败的文件,该场景下需要用户手动完成修改:

    • lstm_quant_layer_hpp.patch在caffe_compare/modified/include/caffe/layer目录新生成的lstm_quant_layer.hpp,lstm_quant_layer.cpp.patch在caffe_compare/modified/src/caffe/layers目录新生成的lstm_quant_layer.cpp,需要用户分别复制到caffe-master/include/caffe/layers/和caffe-master/src/caffe/layers/目录。
    • caffe.proto和Makefile需要通过比对的方式,完成修改:

      在Linux服务器使用如下命令查看文件的修改情况,建议用户将caffe_compare目录下载到Windows PC机,使用比对工具查看文件的修改情况。其中,origin目录为修改前的文件,modified目录为修改后的文件。根据修改前后比对变化,用户可以方便将修改同步到caffe-master/src/caffe/proto/caffe.proto文件以及caffe-master/Makefile文件。

      cd caffe_compare
      diff -y modified/Makefile origin/Makefile
      diff -y modified/src/caffe/proto/caffe.proto origin/src/caffe/proto/caffe.proto
    • 因为对同一个文件不能重复打patch(重复打patch会提示错误信息),install.py脚本只能执行一次,不支持重复安装,建议用户在安装前做好代码备份。
    • 用户手动修改caffe.proto文件时,如果新增参数与原来参数的序列号冲突,请修改原来参数的序列号,保持序列号唯一(如果修改新增参数的序列号,可能导致ATC工具无法正常解析)。
    • 用户在Caffe训练网络中所使用的caffe.proto需要与ATC软件包安装路径下的内置caffe.proto(atc/include/proto/caffe.proto)以及自定义custom.proto(atc/sample/op/caffe)内容保持一致,如果不一致,则需要用户自行合并custom.proto;custom.proto添加自定义算子层的定义时,ID需要保持唯一,建议从1000开始递增。

  3. (可选)该步骤修改只针对检测网络生效,如果不执行检测网络的sample,则请忽略该步骤。

    修改caffe-master/src/caffe/proto/caffe.proto,增加自定义层。
    1. “message LayerParameter”最后增加如下信息:
      optional ROIPoolingParameter roi_pooling_param = 8266711;
    2. 文件最后增加如下信息:
      // Message that stores parameters used by ROIPoolingLayer
      message ROIPoolingParameter {
        // Pad, kernel size, and stride are all given as a single value for equal
        // dimensions in height and width or as Y, X pairs.
        optional uint32 pooled_h = 1 [default = 0]; // The pooled output height
        optional uint32 pooled_w = 2 [default = 0]; // The pooled output width
        // Multiplicative spatial scale factor to translate ROI coords from their
        // input scale to the scale used when pooling
        optional float spatial_scale = 3 [default = 1];
      }
    3. 切换到caffe-master,修改caffe-master/Makefile.config。
      增加python layer的实现。
      # Uncomment to support layers written in Python (will link against Python libs)
      WITH_PYTHON_LAYER := 1

  4. 修改完成后,返回caffe-master目录,执行如下命令重新编译Caffe以及pycaffe环境,

    make all && make pycaffe

    caffe.proto修改后需要重新编译为caffe_pb2.py。

    由于模型小型化工具需要解析用户的Caffe模型,用户使用Caffe模型时可能会新增自定义层,此时需要修改caffe.proto文件,修改后,需要用户自行提供从修改后的caffe.proto文件编译出的caffe_pb2.py,给模型小型化工具使用;如果用户使用protoc方式来重新编译caffe.proto,例如protoc --python_out=./ caffe.proto,此时,需要同步修改PYTHONPATH中caffe.proto所在路径。如下所示,${path}请替换为caffe.proto实际路径。

    export PYTHONPATH=$PYTHONPATH:${path}

    如果编译时提示图1所示错误,则是由于因为编译不支持c++11标准代码,此时需要在caffe-master/Makefile文件中添加-std=c++11,代码修改如下:

    # Complete build flags.
    COMMON_FLAGS += $(foreach includedir,$(INCLUDE_DIRS),-I$(includedir)) --std=c++11
    CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS)
    NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
    图1 编译提示错误信息

环境变量设置

设置日志打印级别,其中日志包括打印在屏幕上的日志以及保存到amct_log/amct_caffe.log文件中的日志。该部分环境变量为可选配置,如果不设置,则按照默认日志级别,默认级别为INFO。

  • 变量取值

    日志打印级别通过如下两个变量设置:

    • AMCT_LOG_FILE_LEVEL: 控制amct_caffe.log日志文件的信息级别以及生成精度仿真模型时,对应量化层生成的日志文件信息级别。
    • AMCT_LOG_LEVEL:控制屏幕输出的信息级别。
    有效取值以及含义如表2所示。
    表2 变量取值范围

    信息级别

    含义

    信息描述

    DEBUG

    输出DEBUG/INFO/WARNING/ERROR级别的运行信息。

    详细的流程信息,包括量化层及对应的处理阶段(融合,参数量化或者数据量化等)。

    INFO

    输出INFO/WARNING/ERROR级别的运行信息。默认为INFO。

    概要的量化处理信息,包含量化的阶段等信息。

    WARNING

    输出WARNING/ERROR级别的运行信息。

    量化处理过程中的警告信息。

    ERROR

    输出ERROR级别的运行信息。

    量化处理过程中的错误信息。

    信息级别不区分大小写,即Info、info、INFO均为有效取值。

  • 使用示例
    如下命令只是样例,用户根据实际情况进行设置。
    • 将量化日志amct_caffe.log信息级别设置为INFO级别。
      export AMCT_LOG_FILE_LEVEL=INFO
    • 将屏幕打印输出信息级别设置为INFO级别。
      export AMCT_LOG_LEVEL=INFO
分享:

    相关文档

    相关产品

close