Windows 10 安装 mmcv 1.2.7 踩坑

本文最后更新于:2021年12月11日 上午

商汤科技的 open-mmlab 是集成当前优秀深度学习成果的基于 python pytorch 的集成平台,功能强大,配置化工程。mmcv是其中重要的组件库,linux安装相对方便,Windows支持得不是很友好,本文记录Win10 安装mmcv踩坑过程。

MMCV

  • whl 包下载链接

  • github 链接

  • mmcv 是一个基础库,主要分为两个部分,一部分是和 deep learning framework 无关的一些工具函数,比如 IO/Image/Video 相关的一些操作,另一部分是为 PyTorch 写的一套训练工具,可以大大减少用户需要写的代码量,同时让整个流程的定制变得容易。

  • 官方介绍:

MMCV is a foundational library for computer vision research and supports many research projects as below:

  • MMDetection: Detection toolbox and benchmark
  • MMDetection3D: General 3D object detection toolbox and benchmark
  • MMSegmentation: Semantic segmentation toolbox and benchmark
  • MMEditing: Image and video editing toolbox
  • MMPose: Pose estimation toolbox and benchmark
  • MMAction2: Action understanding toolbox and benchmark
  • MMTracking: Video perception toolbox and benchmark
  • MMClassification: Image classification toolbox and benchmark
  • MMOCR: A Comprehensive Toolbox for Text Detection, Recognition and Understanding

It provides the following functionalities.

  • Universal IO APIs
  • Image/Video processing
  • Image and annotation visualization
  • Useful utilities (progress bar, timer, …)
  • PyTorch runner with hooking mechanism
  • Various CNN architectures
  • High-quality implementation of common CUDA ops
  • 但是在Windows上安装mmcv真的全是坑

环境配置

条目 内容
操作系统 Windows 10
显卡型号 GTX 1660
显卡驱动 456.71
CUDA 10.1
cuDNN 8.0.3
torch 版本 1.7.0
torchvision 版本 0.8.0
visual studio 2019
cl.exe 版本 19.28.29914
目标mmcv版本 1.2.7

这些都是我们的目标,慢慢装不着急

基础安装过程

显卡驱动-CUDA-cuDNN

安装 visual studio 2019

  • E:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29910\bin\Hostx64\x64添加到环境变量 Path 中
  • 在cmd中输入cl
1
2
3
4
5
C:\Users\Admin>cl
用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.28.29914 版
版权所有(C) Microsoft Corporation。保留所有权利。

用法: cl [ 选项... ] 文件名... [ /link 链接选项... ]

目的就是使用这个 cl.exe

安装torch和torchvision

  • 测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
C:\Users\Admin>pip show torch
Name: torch
Version: 1.7.0
Summary: Tensors and Dynamic neural networks in Python with strong GPU acceleration
Home-page: https://pytorch.org/
Author: PyTorch Team
Author-email: packages@pytorch.org
License: BSD-3
Location: e:\program_files\annoconda\envs\purple\lib\site-packages
Requires: future, typing-extensions, dataclasses, numpy
Required-by: torchvision, torchaudio


C:\Users\Admin>pip show torchvision
Name: torchvision
Version: 0.8.0
Summary: image and video datasets and models for torch deep learning
Home-page: https://github.com/pytorch/vision
Author: PyTorch Core Team
Author-email: soumith@pytorch.org
License: BSD
Location: e:\program_files\annoconda\envs\purple\lib\site-packages
Requires: numpy, torch, pillow
Required-by:

配置环境变量

变量名称 变量值
MMCV_WITH_OPS 1
MAX_JOBS 8
CUDA_HOME C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\
TORCH_CUDA_ARCH_LIST 6.1 # 支持 GTX 1080 1660

下载mmcv源码

1
git checkout v1.2.7

编译安装

  • 直接 pip install 安装的mmcv-full没有c++编译的文件,会报出No module named 'mmcv._ext'的错误

  • 所以我们需要老老实实编译安装mmcv

  • 编译cpp文件并链接

1
2
python setup.py build_ext # 如果成功, cl 将会自动弹出来编译 flow_warp
python setup.py develop # 安装

踩坑安装

讲道理这么复杂的环境配置已经足够折磨人了,但是在编译过程中也会冒出层出不穷、连绵不绝、匪夷所思的错误

错误 calling a host function(“__floorf”) from a device function("deformable_im2col_bilinear< float > ") is not allowed

错误 calling a host function(“__ceilf”) from a global function("deform_roi_pool_forward_cuda_kernel< float > ") is not allowed

  • 看到上述两个错误去找mmcv源码中对应的行

  • 不要取找torch代码中报错对应的行

  • 错误原因是cuda与cpu编程时函数名不一样

  • 将报错文件中的 floor 替换为 floorf

  • 将报错文件中的 ceil 替换为 ceilf

  • 具体有以下文件:

需要修改的文件
mmcv\mmcv\ops\csrc\deform_conv_cuda_kernel.cuh
mmcv\mmcv\ops\csrc\deform_roi_pool_cuda_kernel.cuh
mmcv\mmcv\ops\csrc\modulated_deform_conv_cuda_kernel.cuh
mmcv\mmcv\ops\csrc\roi_align_cuda_kernel.cuh
mmcv\mmcv\ops\csrc\roi_pool_cuda_kernel.cuh

错误 subprocess.CalledProcessError: Command ‘[‘ninja’, ‘-v’, ‘-j’, ‘8’]’ returned non-zero exit status 1.

错误 subprocess.CalledProcessError: Command ‘[‘ninja’, ‘-v’]’ returned non-zero exit status 1.

  • 上述两个错误是因为 ninja 库输出版本的命令是
1
ninja --version
  • 因此解决方案是进入到 Annoconda\lib\site-packages\torch\utils\cpp_extension.py 文件中,在 1500 行附近,将['ninja', '-v']改为['ninja', '--version']

错误 member “torch::jit::ProfileOptionalOp::Kind” may not be initialized

  • 到现在我也没有找到这个问题的原因,也没有解决
  • 但是这个错误在使用ninja编译文件时不会报出来

错误 error: a member with an in-class initializer must be const

  • 我是在Lib\site-packages\torch\include\torch\csrc\jit\api\module.h中报错
  • 解决方案是将报错位置的 static 改为 const

错误 Error checking compiler version for cl: ‘utf-8’ codec can’t decode byte 0xd3 in position 0: invalid continuation byte

  • 不用管,语言不通,系统 utf-8 微软让 cl.exe 用 gbk 了,不影响正常编译

编译文件不完整

  • 默认命令行会使用 ninja 多核并行编译,可以编译出来很多文件
  • 如果有文件想单独编译,可以进入 Lib\site-packages\torch\utils\cpp_extension.py 文件的第335行
  • 加入一句:
1
self.use_ninja = False
  • 编译程序会一个一个编译,也可以找到编译的循环,选择自己想要编译的文件进行编译,从而得到完整的obj文件套装

编译完成的文件

  • 分享我千辛万苦编译出来的结果
运行方式 下载链接
gpu 版 https://cdn.jsdelivr.net/gh/zywvvd/HexoFiles/images_matrixtime/20210421100448.pyd
cpu 版 https://cdn.jsdelivr.net/gh/zywvvd/HexoFiles/images_matrixtime/20210421144546.pyd
  • 将文件重命名为_ext.cp37-win_amd64.pyd放在安装好的 mmcv-full 包内

也就是说,在没有这个文件时,你运行mmdet会报错No module named 'mmcv._ext'

此时把这个文件放上

  • 之后就可以正常使用mmcv了
  • 注意:GPU版的pyd文件一定要在 CUDA 10.1mmcv 1.2.7torch 1.7.0torchvision 0.8.0 的环境下才有可能可用

参考资料