Windows 10 安装 mmcv 1.2.7 踩坑

1,808 阅读5分钟

「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战」。

商汤科技的 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
CUDA10.1
cuDNN8.0.3
torch 版本1.7.0
torchvision 版本0.8.0
visual studio2019
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
C:\Users\Admin>cl
用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.28.29914 版
版权所有(C) Microsoft Corporation。保留所有权利。

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

目的就是使用这个 cl.exe

安装torch和torchvision

  • 测试
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_OPS1
MAX_JOBS8
CUDA_HOMEC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\
TORCH_CUDA_ARCH_LIST6.1 # 支持 GTX 1080 1660

下载mmcv源码

git checkout v1.2.7

编译安装

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

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

  • 编译cpp文件并链接

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 库输出版本的命令是
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行
  • 加入一句:
self.use_ninja = False
  • 编译程序会一个一个编译,也可以找到编译的循环,选择自己想要编译的文件进行编译,从而得到完整的obj文件套装

编译完成的文件

  • 分享我千辛万苦编译出来的结果
运行方式下载链接
gpu 版cdn.jsdelivr.net/gh/zywvvd/H…
cpu 版cdn.jsdelivr.net/gh/zywvvd/H…
  • 将文件重命名为_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 的环境下才有可能可用

参考资料