windows10+VS2017+CUDA10.1编译指南mmdet
经历磨难终于在windows上编译好了mmdetect
给出我的环境信息供参考:
Windows10
Visual Studio 2017,15.9.23 _MSC_VER=14.16
CUDA 10.0
nvcc 10.0 (显卡驱动好像显示10.1 不一样好像无伤大雅
python 3.6
pytorch 版本要在[1.1,1.4]之间,1.5会出问题:AT_CHECK未声明:
前期一直都在visual studio 和cuda版本匹配上花时间。
尽量老老实实用2017,VS 2019到后面及时修改了cuda 10.0配置文件也会出一些问题。
执行的时候尽量在cmd执行,pycharm输出的编码可能不支持,出来的都是utf-8解gbk编码的乱码。
安装好Visual Studio后在cmd执行
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 -vcvars_ver=14.xx (x 修改为对应_MSC_VER)
在这里可以查看对应MSC_VER: https://dev.to/yumetodo/list-of-mscver-and-mscfullver-8nd
其它跟着感觉装就好,似乎没有在其它包上出大问题。
参考dockerfile
FROM pytorch/pytorch:1.1.0-cuda10.0-cudnn7.5-devel
RUN apt-get update && apt-get install -y \
git \
wget \
curl \
cmake \
unzip \
build-essential \
libsm6 \
libxext6 \
libfontconfig1 \
libxrender1 \
libswscale-dev \
libtbb2 \
libtbb-dev \
libjpeg-dev \
libpng-dev \
libtiff-dev \
libjasper-dev \
libavformat-dev \
libpq-dev \
libturbojpeg \
software-properties-common \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN pip install --no-cache-dir \
numpy \
pandas \
PyYAML \
cycler \
dill \
h5py \
imgaug \
matplotlib \
opencv-contrib-python \
Pillow \
scikit-image \
scikit-learn \
scipy \
setuptools \
six \
tqdm \
ipython \
ipdb \
albumentations \
click \
jpeg4py \
addict \
colorama \
torchvision \
iterative-stratification
解决报错: Error checking compiler version for cl
解决方法:导入cl.exe所在位置到系统环境变量path
对mmdetect项目文件进行修改:
在mmdet/ops/nms/setup.py
替换
# default_compiler_so = self.compiler_so # to make it successfully compile disable compiler_so edited by zzl
=>
default_compiler_so = ""
在mmdet/ops/sigmoid_focal_loss/src/sigmoid_focal_loss_cuda.cu
在#include 区域下添加
int Ceil_div(int a, int b) { return (a + b - 1); }
替换
/*targets.contiguous().data<long>(), edited by zzl*/
=>
static_cast<long*>(targets.contiguous().data_ptr()),
/*dim3 grid(std::min(THCCeilDiv(d_logits_size, 512L), 4096L)); edited by zzl*/
=>
dim3 grid(std::min(Ceil_div((int)d_logits_size, 512), 4096));
/*dim3 grid(std::min(THCCeilDiv(losses_size, 512L), 4096L)); edited by zzl*/
=>
dim3 grid(std::min(Ceil_div((int)losses_size, 512), 4096));
完成修改后,分别在
mmdet/ops/roi_align/
mmdet/ops/roi_pool/
mmdet/ops/dcn/
mmdet/ops/nms/
mmdet/ops/sigmoid_focal_loss/ 下 执行
python setup.py build_ext --inplace
正在创建库 build\temp.win-amd64-3.6\Release\src\sigmoid_focal_loss_cuda.cp36-win_amd64.lib 和对象 build\temp.win-amd64-3.6\Release\src\sigmoid_focal_loss_cuda.cp36-win_amd64.exp
正在生成代码
c:\users\jhwen\venus\py\kaggle-imaterialist-with-model\mmdetection\mmdet\ops\sigmoid_focal_loss\src\sigmoid_focal_loss.cpp(36) : warning C4715: “SigmoidFocalLoss_backward”: 不是所有的控件路径都返回值
c:\users\jhwen\venus\py\kaggle-imaterialist-with-model\mmdetection\mmdet\ops\sigmoid_focal_loss\src\sigmoid_focal_loss.cpp(25) : warning C4715: “SigmoidFocalLoss_forward”: 不是所有的控件路径都返回值
已完成代码的生成
copying build\lib.win-amd64-3.6\sigmoid_focal_loss_cuda.cp36-win_amd64.pyd ->
最后在mmdetection目录下执行
python setup.py develop
如果顺利执行,那么恭喜你完成了编译工作,接下来就可以测试一下了。