文档
注册

Caffe patch安装

安装完AMCT后,量化模型前,用户需要获取并安装Caffe源代码增强包caffe_patch.tar.gz

该增强包用于完成如下内容:

  • 如果AMCT所在服务器有用户自定义的custom.proto文件,则需要和AMCT软件包中提供的proto文件进行合并。该软件包提供了基于Caffe1.0版本的caffe.proto文件、AMCT自定义层以及caffe-master相较于caffe1.0更新层的amct_custom.proto文件。proto合并原理请参见proto合并原理
  • 拷贝新增源码和动态库文件到Caffe环境caffe-master工程目录下。
  • 对Caffe环境caffe-master工程目录下部分文件安装patch,以实现对文件的自动修改。

proto合并前提条件

用户自行准备自定义的custom.proto,并上传到AMCT所在服务器任意目录。

样例如下,以下样例中的自定义层及参数仅作为参考,请用户根据实际场景对参数进行自定义

message LayerParameter {
  optional ReLU6Parameter relu6_param = 2060;
  optional ROIPoolingParameter roi_pooling_param = 8266711;
}

message ReLU6Parameter {
  optional float negative_slope = 1 [default = 0];
}

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];
}

custom.proto主要分为两部分:

  1. LayerParameter注册自定义层:
    message LayerParameter {
      # user definition fields, each field takes one line.
      optional FieldType0 field_name0 = field_num0;
      optional FieldType1 field_name1 = field_num1;
    }

    该字段用于在Layerparameter中声明用户自定义层,用户自定义层需要加入到 LayerParameter中,从而可以在Caffe框架中写入Layer并从Layer中读取到;该声明分为四个部分:

    • optional:表示该定义在LayerParameter中是可选的,只能配置为optional。
    • FieldType:声明当前字段对应的自定义类型,需要有相应的message定义。
    • field_name:当前声明的id,需要唯一,如果提示冲突,需要用户修改自己的id名称,后续需要通过该id来访问相应的内容。
    • field_num:当前声明的编号,需要唯一,如果提示冲突,需要用户修改自己的编号值,建议区间段小于5000,并且不与ATC提供的caffe.proto中的编号冲突,在二进制caffemodel中需要通过该编号去解析对应字段。

    示例如下:

    message LayerParameter {
      optional ReLU6Parameter relu6_param = 2060;
      optional ROIPoolingParameter roi_pooling_param = 8266711;
    }
    • custom.proto中用户自定义层编号建议区间段小于5000,并且不与ATC提供的caffe.proto中的内置编号冲突。
    • amct_custom.proto中的编号从200000开始(包括200000)。
    • caffe.proto中ATC自定义层的编号区间段为:[5000,200000)。
  2. message定义自定义层参数:
    message ReLU6Parameter {
      optional float negative_slope = 1 [default = 0];
    }

    用户自定义层参数定义,用于定义用户自定义层详细的参数内容,详细内容可以参考google protobuf

    该字段需要保证和AMCT自定义层amct_custom.proto不冲突,如果冲突,proto合并时会提示错误信息,用户根据提示信息进行修改;与ATC内置caffe.proto冲突则会优先使用用户的message定义覆盖。

    当前AMCT自定义message包括:QuantParameter、DeQuantParameter、IFMRParameter、LSTMQuantParameter、SearchNParameter、 RetrainDataQuantParameter、RetrainWeightQuantParameter、SingleLayerRecord、 ScaleOffsetRecord,用户自定义层时不能同上述message名重复。

安装步骤

用户可以执行caffe_patch中的自动安装脚本install.py,如果脚本执行成功,则会自动将caffe_patch中的patch内容安装到Caffe环境caffe-master工程目录下,并完成proto合并、新增源码和动态库文件替换的功能。安装或手动修改完成后,需要重新编译Caffe环境。具体操作方法如下:

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

    AMCT的安装用户在软件包所在路径执行如下命令,解压caffe_patch.tar.gz软件包:

    tar -zxvf caffe_patch.tar.gz

    获得如下内容:

    caffe_patch
    ├── include                        //用于存放自定义层定义头文件以及公共函数
    │   └── caffe
    │       ├── layers
    │       └── util
    ├── install.py                     //Caffe环境proto合并、patch安装以及源码和动态库文件执行脚本
    ├── merge_proto                    //proto合并目录
    │   ├── amct_custom.proto         //AMCT自定义层以及caffe-master相较于Caffe1.0的更新层
    │   ├── caffe.proto               //ATC工具中内置的caffe.proto
    │   └── merge_proto.sh            //proto合并脚本,实际合并时install.py会调用该脚本
    ├── patch                          //LSTM层相关的patch文件
    │   ├── lstm_calibration_layer.cpp.patch  //用于在caffe-master/src/caffe/layers目录生成lstm_calibration_layer.cpp
    │   ├── lstm_calibration_layer.hpp.patch  //用于在caffe-master/include/caffe/layers目录生成lstm_calibration_layer.hpp
    │   ├── lstm_quant_layer.cpp.patch        //用于在caffe-master/src/caffe/layers/目录生成lstm_quant_layer.cpp
    │   └── lstm_quant_layer.hpp.patch       //用于在caffe-master/include/caffe/layers/目录生成lstm_quant_layer.hpp
    ├── quant_lib                       //用于存放量化算法核心动态库
    │   ├── libquant_gpu.so
    │   └── libquant.so
    └── src                              //用于存放自定义层实现源码文件以及公共函数
        └── caffe
            ├── layers
            └── util
  2. 切换到caffe_patch/install.py脚本所在目录,执行如下命令。
    python3 install.py --caffe_dir CAFFE_DIR [--custom_proto CUSTOM_PROTO_FILE]

    参数解释如下:

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

    参数

    说明

    --h

    可选。显示帮助信息。

    --caffe_dir

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

    --custom_proto

    可选。用户自定义custom.proto文件路径,支持相对路径和绝对路径。

    使用样例如下:

    python3 install.py  --caffe_dir caffe-master  --custom_proto custom.proto
    若提示如下信息,则说明执行成功。
    # 拷贝新增源码和动态库文件到Caffe环境caffe-master工程目录下
    [INFO]Begin to copy source files, header files and quant_lib to '$HOME/AMCT/AMCT_CAFFE/caffe-master'
    [INFO]Finish copy source files, header files and quant_lib to '$HOME/AMCT/AMCT_CAFFE/caffe-master'
    # 安装patch
    [INFO]Begin to install patch.
    [INFO]Install patch 'lstm_calibration_layer.cpp.patch' successfully.
    [INFO]Install patch 'lstm_quant_layer.hpp.patch' successfully.
    [INFO]Install patch 'lstm_quant_layer.cpp.patch' successfully.
    [INFO]Install patch 'lstm_quant_layer.hpp.patch' successfully.
    [INFO]Finish install patch.
    # proto合并
    [INFO]Merge and replace "caffe.proto" success.
    # 修改Makefile
    [INFO]Merge and replace "Makefile" success.

    执行脚本过程中(使用install.py脚本时,支持重复安装patch):

    • 如果安装patch失败,则请用户自行将Caffe工程中caffe-master/src/caffe/layers/lstm_layer.cpp和caffe-master/include/caffe/layers/lstm_layer.hpp文件还原为caffe-master原生的。
    • proto合并阶段如果提示ERROR信息,则请参见执行proto合并时提示ERROR信息解决。
    • 如果修改Makefile失败,则请根据提示信息进行修改;如果执行成功,则再次执行该脚本时,不会重复修改Makefile。
  3. 检查python layer配置,如果没有配置,增加python layer的实现。

    修改Caffe工程中caffe-master/Makefile.config文件。

    增加python layer的实现。
    # Uncomment to support layers written in Python (will link against Python libs)
    WITH_PYTHON_LAYER := 1
  4. (可选)新增c++11标准代码的支持。

    由于AMCT新增算子需要c++11支持,需要确保caffe-master/Makefile中增加了--std=c++11编译选项。2中执行install.py脚本时会自动修改该文件,请用户检查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)
  5. 返回caffe-master目录,执行如下命令重新编译Caffe以及pycaffe环境:
    #如果用户环境安装patch之前已经编译过Caffe工程,安装patch之后,需要先执行make clean,然后再执行编译命令
    make clean
    make all -j && make pycaffe -j

    caffe.proto修改后需要重新编译为caffe_pb2.py:由于AMCT需要解析用户的Caffe模型,用户使用Caffe模型时可能会新增自定义层,此时需要修改caffe.proto文件,修改后,需要用户自行提供从修改后的caffe.proto文件编译出的caffe_pb2.py,给AMCT使用。

    如果用户使用protoc方式来重新编译caffe.proto,例如protoc --python_out=./caffe.proto,此时,需要同步修改PYTHONPATH中caffe.proto所在路径。如下所示,${path}请替换为caffe.proto实际路径。

    export PYTHONPATH=$PYTHONPATH:${path}
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词