文章首发于公众号【贤鱼的学塘】~
踩坑不易,求赞求关注!
【观前提示】:windows平台在pytorch1.7后才支持分布式训练,配置环境较为复杂,我刚刚完成吐血踩坑,将在下一篇文章中分享~ 此教程为基础环境配置方法,在windows上无法进行多卡训练!下篇文章将带来解决方法!
我个人因为设备限制需要在Windows 10主机上跑通此前分析过的 mega 项目代码。不得不说windows对于我们搞算法的确实不太友好,遇到需要编译的项目直接原地爆炸;另外,网上靠谱的资料很少,大多资料也不是很靠谱。
由于mega像很多项目一样是基于maskrcnn-benchmark开发的,所以我在maskrcnn-benchmark那里找到了最靠谱的教程,链接如下:maskrcnn-benchmark在windows下的安装教程(英文)不过该教程有一些容易出错的细节并没有说清,我在win10上尝试跑通mega项目的过程中还是吃了不少的苦头,挣扎消耗的时间不少于两周......现在比较确定跑通它所需要的步骤,我觉得我不写一篇文章总结一下也太亏了。
这篇文章一定是目前全网最靠谱的win10下编译mega.pytorch的教程,希望各位朋友点个赞支持一下~
一、基础环境配置
注意,mega或者说maskrcnn-benchmark应当无法支持30系列及之后的显卡,cuda也不要用11版本及之后的,这也就要求服务器的显卡驱动不要太新否则不支持低版本的cuda!大家可以网上搜索cuda版本和显卡驱动版本对照表,我个人在win10环境下使用的显卡驱动版本为456.71,cuda版本为10.1。
不要没事升级显卡驱动到最新,降低驱动版本的过程可能发生很多玄学事件,老老实实用低版本的好!
pytorch版本选择方面,我尝试过1.3和1.4都没问题,如果不放心就照mega作者说的用1.3。与cuda、pytorch版本对应的cudnn配置好,其他一般的一些库,也按照要求配置好就行。
接下来是重点,如何在win10系统实现代码的编译?我主要参考了前面说到的教程https://github.com/facebookresearch/maskrcnn-benchmark/issues/1042,另外添加了一些我的修改、解读以及注意事项。
二、VS2017相关安装
这里要用到 VS2017 的安装器,这个不太好找,需要的朋友可以在我的公众号后台回复“vs2017”获取。运行 VS2017 的安装器,直接点击单个组件,搜索选择以下3个组件:
-
VC++ 2017 version 15.7 v14.14 toolset:该组件版本会有细微不同没有关系
-
适用于桌面的VC++ 2015.3 v14.00(v140)工具集:该组件英文名是VC++ 2015.3 v14.00(v140)toolset for desktop
-
Windows 10 SDK:这个选择最新的版本就行
以上3个组件选择好后,画面应当如下。
如果系统盘空间不足,还得修改IDE的安装位置,默认位置:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community。最轻便的情况下安装的总体情况应该如下(修改了IDE安装位置到E盘):
安装好VS2017后,将C:\Program Files (x86)\Windows Kits\10\bin\x64 添加至系统环境变量。
随后从 C:\Program Files (x86)\Windows Kits\8.1\bin\x86 复制 rc.exe & rcdll.dll 两个文件到 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin 目录。
三、项目源码修改
这部分依照参考连接中的方法去做,把 mega_core/csrc/cuda 目录下的ROIAlign_cuda.cu、ROIPool_cuda.cu和 SigmoidFocalLoss_cuda.cu三个文件做相应修改:分别把三个文件内的THCCeilDiv改为ceil_div1、ceil_div2、ceil_div3函数,这三个函数内容一致(仅函数名不一样):
long ceil_div1(long a, long b) {
return (a + b - 1) / b;
}
然后之前调用THCCeilDiv函数的地方要记得相应修改。另外,需要在output_size前面加上(long),示例如下:
/* replace the lines with THCCeilDiv, there are 2 palces in each file */
dim3 grid(std::min(ceil_div((long)output_size, 512), 4096));
// dim3 grid(std::min(THCCeilDiv(output_size, 512L), 4096L));
最后还得修改整个项目的setup.py文件如下部分(添加两个变量并用于这个ext_modules):
# add 'extra_compile_args' and 'extra_link_args' in get_extensions()
extra_compile_args = {"cxx": ['/MD']}
extra_link_args = ['/NODEFAULTLIB:LIBCMT.LIB']
# change the ext_modules in get_extensions()
ext_modules = [
extension(
"maskrcnn_benchmark._C",
sources,
include_dirs=include_dirs,
define_macros=define_macros,
extra_compile_args=extra_compile_args,
extra_link_args = extra_link_args,
)
]
四、其他可省略库
还有几个重要的需要编译的库我在这里简单说明,主要原因在于它们是可以省略掉的!
先说最简单的两个库:pycocotools 和 cityscapeScripts。这两个库都是用于相应数据集的模型性能评测,如果只搞视频目标检测、只关注VID和DET数据集上性能的话这两个根本不用编译安装。当然这两个库编译安装也不会有问题,这里不再赘述。
最麻烦的是apex库的编译安装,因为它关系到cuda。我的建议是在win10系统下跑mega代码的话可以直接放弃正常编译带有cuda扩展的apex的想法。原因有两点:① 极大概率编译不成功;② 我询问过mega作者他们没有使用混合精度训练,也就是根本没用apex。
如果有兴趣可以依照文章开始我给的参考连接的步骤编译。如果像我推荐的放弃用apex尝试混合精度,那么我有如下两种方案:
-
方法一:编译没有cuda和C++扩展的apex
pip install -v --no-cache-dir .
在apex目录下执行上述命令即可,这样编译好的apex是个样子货,好处是不用改mega项目代码,只要不启用混合精度就可以正常运行代码。
-
方法二:完全弃用移除apex
这个做法好处是用的库更少了更干净了,缺点是需要我们执行想跑的脚本,然后根据报错删除修改apex相关的代码,稍微麻烦一点不过操作还是很简单的。修改的代码主要是反向传播,删除的主要是 import 以及 apex 初始化 model、optimizer 的代码。
五、项目编译
前面步骤都做好之后就可以编译mega项目了,位于项目目录下,在命令行中执行以下5句命令:
set "VS150COMNTOOLS=c:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build"
set CMAKE_GENERATOR=Visual Studio 15 2017 Win64
set DISTUTILS_USE_SDK=1
call "%VS150COMNTOOLS%\vcvarsall.bat" x64 -vcvars_ver=14.14
python setup.py build develop
这里有我自己摸索的两点细节:
-
第一行命令中的路径:如果安装VS2017的IDE时修改了路径,那么这一条要相应修改。
-
倒数第二行命令中的版本号:上面的14.14对应的是前文安装的组件VC++ 2017 version 15.7 v14.14 toolset,注意版本号一致。
至此,mega项目在win10下编译完成。
另:一个可能的错误
我在一台单卡机器上进行一次mega项目代码运行时,遇到 contextlib.py 中报错: RuntimeError: generator didn't yield。
该问题我没有搞清楚什么原因导致,我猜测可能是因为win10机器只有一张显卡导致。根据报错,将mega_core/utils/__init__.py文件中出错的部分注释掉,如下图,一般可以成功解决该问题。