conda create -n maskrcnn_benchmark python=3.7
conda activate maskrcnn_benchmark
conda install ipython
pip install ninja yacs cython matplotlib tqdm opencv-python
首先查看自己电脑cuda的版本,这里有一个小细节,命令行中输入nvidia-smi 显示的CUDA 版本与输入nvcc --version显示的CUDA版本不一致
查过资料显示:其实是因为CUDA 有两种API,分别是 运行时 API 和 驱动API,即所谓的 Runtime API 与 Driver API。nvidia-smi显示的是驱动API,而nvcc --version显示的是运行API。主要是因为项目需要安装低版本CUDA然后加入环境变量后就会出现这个问题,按照我的理解现在运行程序使用的是CUDA10.1
PyTorch官网,前面查到的CUDA版本选择pytorch版本,如果没有可以点Previous pyTorch Versions,这里面有更多的更早的版本。
conda install pytorch==1.6.0 torchvision==0.7.0 cudatoolkit=10.1 -c pytorch
然后安装完成后可以测试是否安装成功
python
>>>>import torch
>>>>import torchvision
新建一个文件夹用来放pycocotools包、apex包和maskrcnn_benchmark项目(我这里是E:\Project\Skin\maskrcnn)
E:#用来切换盘
cd E:\Project\Skin\maskrcnn
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
python setup.py build_ext install
这里我遇到了错误
cl: 命令行 error D8021 :无效的数值参数“/Wno-cpp”
error: command 'D:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30133\\bin\\HostX86\\x64\\cl.exe' failed with exit status 2
当时找到了一个大佬的解决方案:https://blog.csdn.net/weixin_41010198/article/details/94053130,供大家参考
后来研究maskrcnn代码时发现,官方的install.md里面给了一个解决方案
将
extra_compile_args=['-Wno-cpp', '-Wno-unused-function', '-std=c99'],
换成
extra_compile_args={'gcc': ['/Qstd=c99']},
当然,后面我将visual studio换成vs2015后就没这些问题了。
cd ../../
git clone https://github.com/NVIDIA/apex.git
cd apex
python setup.py install --cuda_ext --cpp_ext
这里遇到问题RuntimeError: Error compiling objects for extension
,搜索到一个说法是去掉后面的--cuda_ext --cpp_ext
就可以了,不知所云。
后来忍痛去github上读英文了,看到了一个解决方案:
Please try my forked version: https://github.com/kezewang/apex.
Moreover, please refer to the following link to fix Windows MSVC Compatibility
facebookresearch/pytorch3d#10
It costs me a whole day to address all the issues.
大致就是去这里,下载人家改了的apex包,然后调整Windows MSVC Compatibility。
记录一下我改的部分:下载完成后python setup.py install --cuda_ext --cpp_ext
,然后出现 D:/Anaconda3/envs/maskrcnn_benchmark/lib/site-packages/torch/include\torch/csrc/jit/api/module.h(483):error: a member with an in-class initializer must be const
进入到D:/Anaconda3/envs/maskrcnn_benchmark/lib/site-packages/torch/include\torch/csrc/jit/api/module.h
,将static constexpr
和static CONSTEXPR_EXCEPT_WIN_CUDA
全部换成字段 static const
。再次运行
碰到d:\anaconda3\envs\maskrcnn_benchmark\lib\site-packages\torch\include\pybind11\cast.h(1449): error: expression must be a pointer to a complete object type
将这一行的explicit operator type&() { return *(this->value); }
改为 explicit operator type&() { return *((type*)(this->value)); }
cd ../
git clone https://github.com/facebookresearch/maskrcnn-benchmark.git
cd maskrcnn-benchmark
pip3 install -r requirements.txt
如果使用直接安装速度相对较慢,采取清华大学的镜像会提高速度。
GPU版本:
pip install tensorflow-gpu==2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
或
pip install tensorflow==2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
注明:tensorflow2.2, 后面的数字是任意一个你想安装的tensorflow版本
网上有两种说法:
python setup.py build develop
或
python3 setup.py install
我使用的第一种,搜索中说两种的区别是:
python setup.py install:主要是安装典型第三方包,这种包比较稳定,不再需要你去编辑、修改或是调试。
python setup.py develop:当你安装一个包后,这个包需要你不断修改,这样你就不得不重新安装,这时就采用这种安装方法。
中间安装了vs2015、2017、2019、2022;cuda10.0.130、10.1.105、10.1.243;gcc9、7.1.0;pytorch1.所以很多错大家可能不会报,但是还是记录一下吧。
具体教程可以参考这两篇博文:CUDA、CUDNN在windows下的安装及配置
Windows下CUDA多版本共存
安装低版本gcc:网站
可以选择7.n版本
安装cuda开发库之后,使用gcc编译会可能会报错要求gcc版本,如下表
CUDA version | max supported GCC version |
---|---|
11.1, 11.2, 11.3 | 10 |
11 | 9 |
10.1, 10.2 | 8 |
9.2, 10.0 | 7 |
9.0, 9.1 | 6 |
8 | 5.3 |
7 | 4.9 |
5.5, 6 | 4.8 |
4.2, 5 | 4.6 |
4.1 | 4.5 |
4.0 | 4.4 |
在配置环境过程中从安装apex到maskrcnn-benchmark的python setup.py build develop总是报各类错误,网上说是19的版本太高了,Windows需要MicrosoftBuild Tools 2015,仅供大家参考,我也不是很清楚,反正我把2019、2022全删除,然后换成2015,就可以了。
中间遇到了这个问题
fatal error: #error: -- C1189: unsupported Microsoft Visual Studio version!
查到的原因是CUDA版本需要与微软的C/C++编译器版本匹配,解决方法是找到你自己安装CUDA路径下的这个文件,我的如下:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\include\crt\host_config.h
打开后定位到这一行,修改 ‘_MSC_VER >=’ 后面的数值
至于_MSC_VER,它是微软公司推出的C/C++编译器在ANSI/ISO C99标准之外扩展的宏定义,用来定义当前微软公司自己的编译器的主版本。因为Visual Studio更新很快,其值不断更新,导致CUDA跟不上Visual Studio的步伐,所以出现上述错误。具体VS版本对应的_MSC_VER值可参考微软官方的资料
下表是 Visual Studio version 与 _MSC_VER 对应关系:
Visual Studio version | _MSC_VER |
---|---|
Visual Studio 6.0 | 1200 |
Visual Studio .NET 2002 (7.0) | 1300 |
Visual Studio .NET 2003 (7.1) | 1310 |
Visual Studio 2005 (8.0) | 1400 |
Visual Studio 2008 (9.0) | 1500 |
Visual Studio 2010 (10.0) | 1600 |
Visual Studio 2012 (11.0) | 1700 |
Visual Studio 2013 (12.0) | 1800 |
Visual Studio 2015 (14.0) | 1900 |
Visual Studio 2017 RTW (15.0) | 1910 |
Visual Studio 2017 version 15.3 | 1911 |
Visual Studio 2017 version 15.5 | 1912 |
Visual Studio 2017 version 15.6 | 1913 |
Visual Studio 2017 version 15.7 | 1914 |
Visual Studio 2017 version 15.8 | 1915 |
Visual Studio 2017 version 15.9 | 1916 |
Visual Studio 2019 RTW (16.0) | 1920 |
Visual Studio 2019 version 16.1 | 1921 |
Visual Studio 2019 version 16.2 | 1922 |
Visual Studio 2019 version 16.3 | 1923 |
Visual Studio 2019 version 16.4 | 1924 |
Visual Studio 2019 version 16.5 | 1925 |
Visual Studio 2019 version 16.6 | 1926 |
Visual Studio 2019 version 16.7 | 1927 |
可以看到 1920 正好对应了Visual Studio 2019的第一个版本,为了“一劳永逸”,可以将文件中的那个值修改的很大,如上图中改为 2000,这样很长一段时间内不会再出现这个问题。
我选择安装 Visual Studio 2015。
这里当时还有一个问题,如果不卸载2019,不知道是因为2019的版本更高还是因为我一开始先安装的2019,安装apex时总是给我弹:需要安装13-17之间的版本。我嫌麻烦,懒得查怎么改才能让他默认调用2015的环境,直接把俩新版本给删除了。
error C3203: “templated_iterator”: 未专用化的 类 模板 不能用作 模板 变量,该变量属于 模板 参数“_Ty1”,应为 real 类型
error: command ‘C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin\nvcc.exe’ failed with exit status 2
解决方案:https://github.com/pytorch/pytorch/issues/19156 给出一种方案是检查是不是vs2017升级到了最新版,2015应该是会有问题的。
D:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/include\type_traits(1271): error: static assertion failed with “You’ve instantiated std::aligned_storage, Align> with an extended alignment (in other words, Align > alignof(max_align_t)). Before VS 2017 15.8, the member type would non-conformingly have an alignment of only alignof(max_align_t). VS 2017 15.8 was fixed to handle this correctly, but the fix inherently changes layout and breaks binary compatibility (only for uses of aligned_storage with extended alignments). Please define either (1) _ENABLE_EXTENDED_ALIGNED_STORAGE to acknowledge that you understand this message and that you actually want a type with an extended alignment, or (2) _DISABLE_EXTENDED_ALIGNED_STORAGE to silence this message and get the old non-conformant behavior.”
大概意思就是:VS2017 15.8版本修复了老版本有关对齐存储部分缺陷,但修复本身也有缺陷。如果不想编译时报这个问题,就在预编译时定义一个宏 _ENABLE_EXTENDED_ALIGNED_STORAGE 或者 _DISABLE_EXTENDED_ALIGNED_STORAGE(博主的理解是按照修复后的逻辑处理就定义带enable那个,按照老版本的逻辑处理就定义带disable那个)
修改 setup.py (134行) version_dependent_macros = version_ge_1_1 + version_ge_1_3 + version_ge_1_5 + ['-D_ENABLE_EXTENDED_ALIGNED_STORAGE']
LINK : fatal error LNK1158: 无法运行“rc.exe”
error: command ‘D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\link.exe’ failed with exit status 1158
从此路径C:\Program Files (x86)\Windows Kits\8.1\bin\x86复制
两个文件
到另一个路径下
D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
AttributeError: module ‘torch.cuda’ has no attribtue ‘amp’ 问题解决
之前没有使用过apex,所以使用apex的时候,发现报了一条错误。
AttributeError: module 'torch.cuda' has no attribtue 'amp'
经过不断的尝试,终于找到了问题的原因。原因在于torch.cuda.amp是在torch1.6版本之后才引入的,而我所使用的是torch1.4版本,自然就会报错。
deform_conv_cuda.cu: error: identifier "AT_CHECK" is undefined ;
deform_pool_cuda.cu: error: identifier "AT_CHECK" is undefined ;
找到这两个文件,将所有的AT_CHECK改为TORCH_CHECK即可