Win10+VS2017编译跑通mega.pytorch(maskrcnn-benchmark)

文章首发于公众号【贤鱼的学塘】~

踩坑不易,求赞求关注!

【观前提示】: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,
    )
]
 

 

四、其他可省略库

还有几个重要的需要编译的库我在这里简单说明,主要原因在于它们是可以省略掉的!

先说最简单的两个库:pycocotoolscityscapeScripts。这两个库都是用于相应数据集的模型性能评测,如果只搞视频目标检测、只关注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文件中出错的部分注释掉,如下图,一般可以成功解决该问题。

 


 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值