Flownet2 NVIDIA pytorch最新安装教程 有效的避坑教程

Github 英伟达的 Flownet2-pytorch 项目地址:https://github.com/NVIDIA/flownet2-pytorch

方案1:拿来主义:

计划2022年4月:我将自己重新复现一个Flownet2的代码仓库,纯用pytorch不参杂cuda-C的东西,以后安装编译就不用那么蛋疼了,望届时关注

训练预期和官方的相差太多,不开源了,省的误人子弟。

国庆假期闲来无事,顺便编译了一个windows上的whl包,环境配置最简单的方法就是拿来主义

可以直接拿我的编译好的whl,该三个whl的使用满足的环境:torch 1.12,cuda 11.3 或者 cu11.4,python 3.9,windows

链接:https://pan.baidu.com/s/1CAyMgHvZlsrJ19HhEyWlcg
提取码:h0ag

在这里插入图片描述

在该目录下,执行:
pip install -r all.txt

即可完成无痛安装


方案2:任意版本下的必行的方案:

VC编译器的版本

  • VS2015 with update3 (VC14)
  • 可替代方案:适用于你的PC已经安装了其他版本的visua studio,比如2022,2019等,这些新版的vs会默认使用更新版本的vc builder,导致编译失败。你可以单独安装我共享的vc14 builder:链接:https://pan.baidu.com/s/1HMmIRe4ZJK57KiAVDkaN9Q
    提取码:rnwf

基本只需要正确安装VC14 builder,一切都是顺利的。

为什么要使用vs2015 update3?**
没办法,源码用的stdc11标准,这也是为什么即便你成功编译之后仍然出现很多warning的原因。

当然你可以尝试修改setup.py的C++标准,如果是在linux下使用gcc编译的情况下,你可能需要gcc 7以下的版本。
在这里插入图片描述
当然,在windows上我们用vc14 builder来编译就无需修改了,反正vc14可以顺利编译的。

源码编译(最多坑)

首先,进入到networks文件夹,
分别进入这三个文件:
在这里插入图片描述
都执行一下:

python setup.py install

如果你出现如下错误:

error C1021: 无效的预处理器命令“warning”

你需要打开site-packages里面的torch的安装位置的:torch/torch.h,再把warning那段话删掉,这是因为Flownet2的cuda部件在cu10的环境下里面使用了旧版的torch.h头文件,但他在更新之后没有改成extension.h,这里问题不大,warning删掉就行。

好消息是,cuda11下不存在这样的问题,我在cuda11.4下无痛编译,其实本文提到的问题在cuda11.4下编译均无出现

好了,接下来,重新执行python setup.py install,如果你遇到类似如下的问题:

error: more than one operator "==" matches these operands:

参考了很久以前一些在Linux下解决torch无法编译的博文,推测这是类似的原因,这是因为torch关于Half和cuda的头文件关于Half 的三元运算符定义重叠了,编译器不知道选择哪个进行编译,(这些是cuda9开发以前遗留的兼容问题),我们找到torch的源文件,对头文件进行修改,编译不适用cuda的头文件部分内容,操作步骤如下:
找到THCNumerics.cuh文件,一般来说在这个目录:'...\Python36\Lib\site-packages\torch\lib\include\THC\THCNumerics.cuh'

找到

static inline __host__ __device__ bool lt(at::Half a, at::Half b) { return a < b; } 
static inline __host__ __device__ bool le(at::Half a, at::Half b) { return a <= b; } 
static inline __host__ __device__ bool gt(at::Half a, at::Half b) { return a > b; } 
static inline __host__ __device__ bool ge(at::Half a, at::Half b) { return a >= b; } 
static inline __host__ __device__ bool eq(at::Half a, at::Half b) { return a == b; }
static inline __host__ __device__ bool ne(at::Half a, at::Half b) { return a != b; }

把以上这些代码注释掉。

然后编译,保证没问题,如果有问题,百分之90以上的可能性都是VC版本不对。

后语

因为太多人咨询我环境的问题,作为一个延申的观察,几乎每一代的torch发布的时候我都会尝试去编译一次,以此去验证他的兼容性,虽然在之前的博文下我强调过torch版本的问题,但貌似在最新的torch1.12里面已经不再存在兼容问题,在torch1.6,1.7,1.8,1.9,1.10,1.11,1.12上,搭配正常版本的cuda全部编译通过,但又一个很重要的前提,就是保证VC builder的版本,VC14.

附:训练的时候需要把git那行的代码注释掉就行

  • 21
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 64
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值