---
title: Caffe patch安装
description: "安装完AMCT后，量化模型前，用户需要获取并安装Caffe源代码增强包caffe_patch.tar.gz。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/devaids/amct/atlasamct_16_0037.html
sourcePath: /source/zh/canncommercial/900/devaids/amct/atlasamct_16_0037.html
indexId: 5bc4fbb932644d5adc2e8878ce5e9b12e28d808283d4d11bcc222d3dd2b5d8fd65
---
# 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(https://developers.google.com/protocol-buffers/docs/proto)。

  该字段需要保证和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}
