0%

detectron2 windows 安装过程

什么是detectron2

detectron2 是fair开发的目标检测、语义分割等的对比平台,集成了很多适合用来快速构建自己的目标检测、语义分割的模型和对应的预训练模型,但是官方文档里面只有linux和mac上的安装过程,虽然双系统很不错,但是还是windows能完成是最好的,所以这里介绍windows下需要进行的一些安装配置过程。总的来说分为以下几步:

  1. python安装
  2. cuda和cudnn安装
  3. pytorch 1.3安装
  4. detectron2 windows安装

写在前面:截止 2019 年 12 月,detectron2 官方并不支持 Windows 平台,源码中部分 CUDA 算子直接使用了 Linux 特有的写法,必须手工打 patch 才能编译通过。本文记录的就是在 Windows 10 下走通整套流程的方法,所有版本组合都是当时验证过能跑起来的最稳的一组。

python 安装

当然,windows上需要面对很多奇怪的库的配置,和虚拟环境的需求(虚拟环境真的很重要),所以我选择conda,我电脑上安装的是anaconda3.7的版本,基本上就是截止到目前最新的版本了。但是pytorch环境的版本还是选择了目前来说最为稳定的python3.6,说句实话,几年前配置caffe的时候让我认识到版本这个东西真的很重要,差一点就等同于没有环境。那么还是那样,先创建相应的环境,在此之前先检查一下conda有没有添加到路径中:conda -v,若是报错就是没有把 conda 加到环境变量中,需要在「系统属性 → 环境变量 → Path」中加入 anaconda 安装目录下的 Scripts/Library/bin/

创建并激活环境:

1
2
conda create -n detectron2 python=3.6
conda activate detectron2

这里特意选 3.6 是因为 detectron2 的依赖(fvcore、pycocotools 的 Windows 分支等)在 3.6 上验证最充分;3.7 也能用,但偶尔会遇到一些预编译 wheel 不全的问题。

cuda 和 cudnn 安装

PyTorch 1.3 官方 Windows wheel 提供 CUDA 9.2 / 10.1 两个版本,本文选 CUDA 10.1 + cuDNN 7.6(对显卡驱动要求 ≥ 418.96,二十系卡和一千系卡都能跑)。

安装 CUDA 10.1

  1. NVIDIA CUDA Toolkit Archive 下载 cuda_10.1.243_426.00_win10.exe
  2. 双击安装,选择「自定义」,取消勾选 Visual Studio Integration(如果机器上已装过 VS,自带的 integration 反而会和后面装的 Build Tools 冲突)
  3. 安装完成后命令行 nvcc -V 应能看到:
    1
    Cuda compilation tools, release 10.1, V10.1.243

安装 cuDNN 7.6

  1. cuDNN Archive 下载 cuDNN v7.6.5 for CUDA 10.1(需要 NVIDIA 账号)
  2. 解压后,把里面的 3 个目录覆盖到 CUDA 安装目录:
    • cuda/bin/cudnn64_7.dllC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\
    • cuda/include/cudnn.h...\v10.1\include\
    • cuda/lib/x64/cudnn.lib...\v10.1\lib\x64\

验证:

1
where cudnn64_7.dll

能搜到刚才放的文件就 OK。

pytorch 1.3 安装

在刚才创建的 conda 环境里:

1
conda install pytorch==1.3.1 torchvision==0.4.2 cudatoolkit=10.1 -c pytorch

注意必须用 conda 装,不要用 pip。pip 装的 PyTorch wheel 在 Windows 上经常缺一些 C++ 运行库导致 import 失败。

验证 GPU 可用:

1
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"

正常应该输出:

1
1.3.1 True

detectron2 windows 安装

这是整个流程里最折腾的一步。官方 repo 的 setup.py 在 Windows 上直接跑会报错,需要先装一堆 build 依赖,再对源码打 patch。

1. 安装 Visual Studio Build Tools

detectron2 的部分 C++/CUDA 算子需要 cl.exe 编译,所以必须装 MSVC。推荐 Visual Studio 2019 Build Tools(VS2017 也行,但 2019 对 CUDA 10.1 兼容性更好):

  1. Visual Studio 下载页 下「Visual Studio 2019 生成工具」
  2. 安装时勾选「使用 C++ 的桌面开发」工作负载
  3. 安装完成后用「x64 Native Tools Command Prompt for VS 2019」启动命令行,后续的所有命令都在这个终端里执行(这一步非常重要,普通的 cmd / PowerShell 找不到 cl.exe)

确认 cl.exe 可用:

1
cl

能看到 Microsoft (R) C/C++ Optimizing Compiler 字样就行。

2. 安装 pycocotools(Windows 分支)

官方 pycocotools 同样不支持 Windows,要用社区维护的 fork:

1
pip install pycocotools-windows

或者从 philferriere/cocoapi 装:

1
pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI

3. 安装 fvcore 和其他依赖

1
2
3
pip install cython
pip install opencv-python
pip install fvcore

4. 克隆 detectron2 源码并打 patch

1
2
git clone https://github.com/facebookresearch/detectron2.git
cd detectron2

需要修改 3 处源码,让它能在 Windows 上编译通过:

Patch 1: detectron2/layers/csrc/deformable/deform_conv_cuda.cu

把文件开头的:

1
#include <THC/THC.h>

下面的所有 AT_CHECK 替换为 TORCH_CHECK(PyTorch 1.3 已经弃用 AT_CHECK,但 detectron2 这个文件里漏改了)。

Patch 2: detectron2/layers/csrc/ROIAlign/ROIAlign_cuda.cuROIAlignRotated_cuda.cu

同样的 AT_CHECKTORCH_CHECK 替换。

Patch 3: setup.py

找到 extra_compile_args 这一段,把 GCC 风格的编译选项换成 MSVC 风格:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 改前(Linux):
extra_compile_args = {"cxx": ["-O3"]}
if torch.cuda.is_available() and CUDA_HOME is not None:
extra_compile_args["nvcc"] = [
"-O3",
"-DCUDA_HAS_FP16=1",
"-D__CUDA_NO_HALF_OPERATORS__",
...
]

# 改后(Windows):
extra_compile_args = {"cxx": ["/MD", "/wd4819", "/O2"]}
if torch.cuda.is_available() and CUDA_HOME is not None:
extra_compile_args["nvcc"] = [
"-O3",
"-DCUDA_HAS_FP16=1",
"-D__CUDA_NO_HALF_OPERATORS__",
"-D__CUDA_NO_HALF_CONVERSIONS__",
"-D__CUDA_NO_HALF2_OPERATORS__",
]

5. 编译安装

x64 Native Tools Command Prompt 里:

1
2
set DISTUTILS_USE_SDK=1
python setup.py build develop

DISTUTILS_USE_SDK=1 这个环境变量必须设,否则 setuptools 会去找 Visual C++ 9.0(也就是上古的 VS2008)的编译器,直接报错。

如果一切顺利,编译过程会持续 10 分钟左右(取决于 CPU),最后输出:

1
Finished processing dependencies for detectron2==0.1

6. 验证安装

随便跑个 demo:

1
2
3
4
cd demo
python demo.py --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml \
--input input.jpg \
--opts MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl

能在窗口里看到画着检测框和 mask 的结果,就说明装好了。

常见报错

报错 原因 解决
error: Microsoft Visual C++ 14.0 is required 没装 VS Build Tools 或没用 x64 Native Tools 终端 用 x64 Native Tools Command Prompt 启动
nvcc fatal: Unsupported gpu architecture 'compute_75' CUDA 10.0 不支持二十系卡 升级到 CUDA 10.1
AT_CHECK undefined PyTorch 1.3 移除了 AT_CHECK 见上面 Patch 1/2
ImportError: DLL load failed cuDNN dll 没放对位置 cudnn64_7.dll 复制到 CUDA 的 bin/ 目录
pycocotools 安装失败 官方版本不支持 Windows pycocotools-windows 或 philferriere 的 fork

小结

总体来说,2019 年底在 Windows 上装 detectron2 的核心难点不在 CUDA 或 PyTorch,而在于:

  1. detectron2 部分 CUDA 算子的源码假设了 Linux 环境,需要手工 patch
  2. setup.py 的编译选项是 GCC 风格的,要换成 MSVC 风格
  3. 必须在「x64 Native Tools Command Prompt」里执行编译,并设置 DISTUTILS_USE_SDK=1

如果只是想跑通模型不想折腾编译,更推荐用 WSL2 或者干脆装个 Ubuntu 双系统——这是 fair 官方支持的路径,所有依赖直接 pip install 就完事了。但如果像我一样必须在 Windows 上跑(比如要和 Windows 上的其他工具链联动),上面这套流程是当下能走通的最稳的一条路。