1. 程式人生 > >Caffe 執行平臺支援DSSD模型

Caffe 執行平臺支援DSSD模型

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模型,後面的解決方案是:

  1. 把dssd中新增加的layer新增到現有執行平臺的caffe依賴中,即把xxx_layer.hpp加到/include/caffe/layers。
  2. 重新編譯libcaffe.so.1.0.0
  3. 把新.so檔案替換原有的.so檔案
  4. 把新的include目錄替換老的include目錄(可以通過make distribute生成)