Caffe 執行平臺支援DSSD模型
阿新 • • 發佈:2018-11-26
DSSD原始碼:https://github.com/chengyangfu/caffe/tree/dssd
在cuda9環境下編譯,首先把Makefile.config裡面的USE_CUDNN := 1
開關開啟,編譯報如下的錯:
make: *** [.build_release/src/caffe/layers/multibox_loss_layer.o] Error 1 In file included from ./include/caffe/util/device_alternate.hpp:40:0, from ./include/caffe/common.hpp:19, from ./include/caffe/blob.hpp:8, from ./include/caffe/caffe.hpp:7, from src/caffe/parallel.cpp:12: ./include/caffe/util/cudnn.hpp: In function 'void caffe::cudnn::setConvolutionDesc(cudnnConvolutionStruct**, cudnnTensorDescriptor_t, cudnnFilterDescriptor_t, int, int, int, int)': ./include/caffe/util/cudnn.hpp:112:3: error: too few arguments to function 'cudnnStatus_t cudnnSetConvolution2dDescriptor(cudnnConvolutionDescriptor_t, int, int, int, int, int, int, cudnnConvolutionMode_t, cudnnDataType_t)' CUDNN_CHECK(cudnnSetConvolution2dDescriptor(*conv, ^ In file included from ./include/caffe/util/cudnn.hpp:5:0, from ./include/caffe/util/device_alternate.hpp:40, from ./include/caffe/common.hpp:19, from ./include/caffe/blob.hpp:8, from ./include/caffe/caffe.hpp:7, from src/caffe/parallel.cpp:12: /usr/local/cuda/include/cudnn.h:537:27: note: declared here cudnnStatus_t CUDNNWINAPI cudnnSetConvolution2dDescriptor( cudnnConvolutionDescriptor_t convDesc, ^
原因:上述DSSD的程式碼是基於老版本的caffe開發,老版本的caffe不支援新版本的cudnn,從而報錯。
老版本的caffe程式碼如下:
template <typename Dtype> inline void setConvolutionDesc(cudnnConvolutionDescriptor_t* conv, cudnnTensorDescriptor_t bottom, cudnnFilterDescriptor_t filter, int pad_h, int pad_w, int stride_h, int stride_w) { CUDNN_CHECK(cudnnSetConvolution2dDescriptor(*conv, pad_h, pad_w, stride_h, stride_w, 1, 1, CUDNN_CROSS_CORRELATION)); }
新版本的caffe程式碼如下:
//定義巨集CUDNN_VERSION_MIN,從而支援高版本CUDNN。 template <typename Dtype> inline void setConvolutionDesc(cudnnConvolutionDescriptor_t* conv, cudnnTensorDescriptor_t bottom, cudnnFilterDescriptor_t filter, int pad_h, int pad_w, int stride_h, int stride_w) { #if CUDNN_VERSION_MIN(6, 0, 0) CUDNN_CHECK(cudnnSetConvolution2dDescriptor(*conv, pad_h, pad_w, stride_h, stride_w, 1, 1, CUDNN_CROSS_CORRELATION, dataType<Dtype>::type)); #else CUDNN_CHECK(cudnnSetConvolution2dDescriptor(*conv, pad_h, pad_w, stride_h, stride_w, 1, 1, CUDNN_CROSS_CORRELATION)); #endif }
所以為了讓現有執行平臺支援DSSD模型,後面的解決方案是:
- 把dssd中新增加的layer新增到現有執行平臺的caffe依賴中,即把xxx_layer.hpp加到/include/caffe/layers。
- 重新編譯
libcaffe.so.1.0.0
- 把新.so檔案替換原有的.so檔案
- 把新的include目錄替換老的include目錄(可以通過
make distribute
生成)