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主要分为两部分:
- 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)。
- 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环境。具体操作方法如下:
- 解压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
- 切换到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
若提示如下信息,则说明执行成功。1 2 3 4 5 6 7 8 9 10 11 12 13 14
# 拷贝新增源码和动态库文件到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。
- 检查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
- (可选)新增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)
- 返回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}