什么是detectron2
detectron2 是fair开发的目标检测、语义分割等的对比平台,集成了很多适合用来快速构建自己的目标检测、语义分割的模型和对应的预训练模型,但是官方文档里面只有linux和mac上的安装过程,虽然双系统很不错,但是还是windows能完成是最好的,所以这里介绍windows下需要进行的一些安装配置过程。总的来说分为以下几步:
- python安装
- cuda和cudnn安装
- pytorch 1.3安装
- 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 | conda create -n detectron2 python=3.6 |
这里特意选 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
- 到 NVIDIA CUDA Toolkit Archive 下载
cuda_10.1.243_426.00_win10.exe - 双击安装,选择「自定义」,取消勾选 Visual Studio Integration(如果机器上已装过 VS,自带的 integration 反而会和后面装的 Build Tools 冲突)
- 安装完成后命令行
nvcc -V应能看到:1
Cuda compilation tools, release 10.1, V10.1.243
安装 cuDNN 7.6
- 在 cuDNN Archive 下载
cuDNN v7.6.5 for CUDA 10.1(需要 NVIDIA 账号) - 解压后,把里面的 3 个目录覆盖到 CUDA 安装目录:
cuda/bin/cudnn64_7.dll→C:\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 兼容性更好):
- 到 Visual Studio 下载页 下「Visual Studio 2019 生成工具」
- 安装时勾选「使用 C++ 的桌面开发」工作负载
- 安装完成后用「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 | pip install cython |
4. 克隆 detectron2 源码并打 patch
1 | git clone https://github.com/facebookresearch/detectron2.git |
需要修改 3 处源码,让它能在 Windows 上编译通过:
Patch 1: detectron2/layers/csrc/deformable/deform_conv_cuda.cu
把文件开头的:
1 |
下面的所有 AT_CHECK 替换为 TORCH_CHECK(PyTorch 1.3 已经弃用 AT_CHECK,但 detectron2 这个文件里漏改了)。
Patch 2: detectron2/layers/csrc/ROIAlign/ROIAlign_cuda.cu 和 ROIAlignRotated_cuda.cu
同样的 AT_CHECK → TORCH_CHECK 替换。
Patch 3: setup.py
找到 extra_compile_args 这一段,把 GCC 风格的编译选项换成 MSVC 风格:
1 | # 改前(Linux): |
5. 编译安装
在 x64 Native Tools Command Prompt 里:
1 | set DISTUTILS_USE_SDK=1 |
DISTUTILS_USE_SDK=1这个环境变量必须设,否则 setuptools 会去找 Visual C++ 9.0(也就是上古的 VS2008)的编译器,直接报错。
如果一切顺利,编译过程会持续 10 分钟左右(取决于 CPU),最后输出:
1 | Finished processing dependencies for detectron2==0.1 |
6. 验证安装
随便跑个 demo:
1 | cd demo |
能在窗口里看到画着检测框和 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,而在于:
- detectron2 部分 CUDA 算子的源码假设了 Linux 环境,需要手工 patch
setup.py的编译选项是 GCC 风格的,要换成 MSVC 风格- 必须在「x64 Native Tools Command Prompt」里执行编译,并设置
DISTUTILS_USE_SDK=1
如果只是想跑通模型不想折腾编译,更推荐用 WSL2 或者干脆装个 Ubuntu 双系统——这是 fair 官方支持的路径,所有依赖直接 pip install 就完事了。但如果像我一样必须在 Windows 上跑(比如要和 Windows 上的其他工具链联动),上面这套流程是当下能走通的最稳的一条路。