安装后处理
Caffe环境修改
安装完模型小型化工具,量化模型前,用户需要获取并安装Caffe源代码增强包caffe_patch.tar.gz,在Caffe源码中增加部分源码文件、动态库文件及修改部分源代码。
安装过程整体分为两部分:
- 拷贝新增源码和动态库文件到Caffe环境caffe-master工程目录下。
- 对Caffe环境caffe-master工程目录下部分文件安装patch,以实现对文件的自动修改。
用户可以执行caffe_patch中的自动安装脚本install.py,如果脚本执行成功,则会自动将caffe_patch中的内容安装到Caffe环境caffe-master工程目录下。安装过程中如果安装patch失败,则会在caffe_patch目录生成caffe_compare文件夹。该文件夹中含有原始的文件(从github上下载)和修改后的文件,用户需要自行进行比对,并将差异部分手动合并到Caffe环境对应文件中。安装或手动修改完成后,需要重新编译Caffe环境。具体操作方法如下:
- 解压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环境一键式安装脚本。
- 切换到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开始递增。
- (可选)该步骤修改只针对检测网络生效,如果不执行检测网络的sample,则请忽略该步骤。修改caffe-master/src/caffe/proto/caffe.proto,增加自定义层。
- 在“message LayerParameter”最后增加如下信息:
optional ROIPoolingParameter roi_pooling_param = 8266711;
- 文件最后增加如下信息:
// 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]; }
- 切换到caffe-master,修改caffe-master/Makefile.config。
- 在“message LayerParameter”最后增加如下信息:
- 修改完成后,返回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)
环境变量设置
设置日志打印级别,其中日志包括打印在屏幕上的日志以及保存到amct_log/amct_caffe.log文件中的日志。该部分环境变量为可选配置,如果不设置,则按照默认日志级别,默认级别为INFO。
- 变量取值
日志打印级别通过如下两个变量设置:
- AMCT_LOG_FILE_LEVEL: 控制amct_caffe.log日志文件的信息级别以及生成精度仿真模型时,对应量化层生成的日志文件信息级别。
- AMCT_LOG_LEVEL:控制屏幕输出的信息级别。
有效取值以及含义如表2所示。信息级别不区分大小写,即Info、info、INFO均为有效取值。
- 使用示例如下命令只是样例,用户根据实际情况进行设置。
- 将量化日志amct_caffe.log信息级别设置为INFO级别。
export AMCT_LOG_FILE_LEVEL=INFO
- 将屏幕打印输出信息级别设置为INFO级别。
export AMCT_LOG_LEVEL=INFO
- 将量化日志amct_caffe.log信息级别设置为INFO级别。
