该增强包用于完成如下内容:
用户自行准备自定义的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主要分为两部分:
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中读取到;该声明分为四个部分:
示例如下:
message LayerParameter { optional ReLU6Parameter relu6_param = 2060; optional ROIPoolingParameter roi_pooling_param = 8266711; }
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环境。具体操作方法如下:
以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
python3 install.py --caffe_dir CAFFE_DIR [--custom_proto CUSTOM_PROTO_FILE]
参数解释如下:
参数 |
说明 |
---|---|
--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):
修改Caffe工程中caffe-master/Makefile.config文件。
# Uncomment to support layers written in Python (will link against Python libs) WITH_PYTHON_LAYER := 1
由于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)
#如果用户环境安装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}