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那行的代码注释掉就行