## 4.3.AI CPU算子实现 ### 4.3.1 Non-support层处理方式 在介绍Non-support层处理方式之前,先介绍下一个网络层的分类,一个网络的层可分为如下3类: * 标准层:NNIE支持的Caffe标准层,如Convolution、Pooling层等; * 扩展层:NNIE支持的公开但非Caffe标准层,分为2种: * 一种是基于Caffe框架进行自定义扩展的层,比如Faster RCNN中的ROIPooling层、SSD中Normalize层、RFCN中的PSROIPooling层,SegNet中的UpSample层等; * 另外一种是来源于其他深度学习框架的自定义层,比如YOLOv2中Passthrough层等; * Non-support层:NNIE不支持的层,比如Caffe中专用于Tranning的层、其他非Caffe框架中的一些层或者用户自定义的私有层等。 当网络中存在Non-support层时,需要将网络进行切分,不支持的部分由用户使用CPU 或者DSP等方式实现,统称为非NNIE方式。由此整个网络会出现NNIE->非NNIE- >NNIE… 的分段执行方式。 nnie_mapper将NNIE的Non-support层分为两种,“Proposal”层和“Custom”层: (1)Proposal层输出的是矩形信息(Bbox,即Bounding box);Proposal自定义层格 式如下,包含name\type\bottom\top等关键字段参数,type必须为 “Proposal”,支持任意多个的bottom,但是top只有一个。 ```python layer { name: "proposal" type: "Proposal" bottom: "rpn_cls_prob_reshape" bottom: "rpn_bbox_pred" top: "rois" } ``` Proposal层还支持以下参数的解析,但不产生实际的效果。 ![](./figures/hispark_taurus_nnie_sample/130proposal%E5%B1%82%E6%94%AF%E6%8C%81%E7%9A%84%E5%8F%82%E6%95%B0.png) (2)Custom层输出的是tensor(feature map、vector);Custom自定义层格式如下,仅包含name\type\bottom\top\ custom_param\shape\dim关键字段,type 必须为“Custom”,支持任意多个top\bottom,custom_param中的shape信息 是描述top输出的形状,如果有多个输出,则按top顺序书写多个shape。用户原有其他的参数字段需删除。 ``` layer { name: "custom1" type: "Custom" bottom: "conv1" bottom: "conv2" bottom: "pooling1" top: "custom1_1" top: "custom1_2" custom_param { shape { dim: 1 dim: 256 dim: 64 dim: 64 } shape { dim: 1 dim: 128 dim: 128 dim: 128 } } } ``` 在nnie_mapper对网络模型进行转化之前,用户需根据上述特性将Non-support层 修改为“Proposal”层或者“Custom”层,具体修改方式参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**《HiSVP 开发指南.pdf》中“3.2 Prototxt要求”。 ### 4.3.2 NNIE算子无法支持的网络层实现 #### 4.3.2.1通过CPU/GPU/DSP实现NNIE不支持算子 ##### 4.3.2.1.1 案例 以RFCN网络为例进行阐述 RFCN跟Faster RCNN类似,RPN部分的Proposal层(Bbox_transform、Argsort、NMS 等操作)输出的是Bounding Box信息,由此网络被分为5段NNIE: * 第1段(NNIE执行),卷积部分,包含RPN前面的部分; * 第2段(非NNIE执行),Proposal部分,生成矩形框信息; * 第3段(NNIE执行),左边的PsRoiPooling部分以及后续的Pooling等,得到矩形框调整值; * 第4段(NNIE执行),右边的PsRoiPooling部分以及后续的Pooling等,得到矩形框置信度; * 第5段(非NNIE执行),结果获取部分,由3、4段得到的矩形框调整值和置信度经过bbox_transfom、argsort、NMS、ClipBox等步骤获取最终的矩形框和置信度信息。 RFCN 网络 mapper 自动分段示意图,如下图所示: ![](./figures/hispark_taurus_nnie_sample/131RFCN%E7%BD%91%E7%BB%9Cmapper%E8%87%AA%E5%8A%A8%E5%88%86%E6%AE%B5%E7%A4%BA%E6%84%8F%E5%9B%BE.png) 类似Faster RCNN,考虑将Reshape->Softmax->Reshape->Proposal一起又CPU执行,RFCN 自定义分段示意图如下图所示: ![](./figures/hispark_taurus_nnie_sample/132RFCN%E8%87%AA%E5%8A%A8%E5%88%86%E6%AE%B5%E7%A4%BA%E6%84%8F%E5%9B%BE.png)