环境:vs2017 pytorch1.5 cuda10.1
github地址:https://github.com/feihuzhang/GANet
源码中给出的是在linux下的编译步骤,没提win10的事情,自己搞了下编译通过,记录一下。
首先,源码根目录下的compile.sh文件是给linux准备的,在windows上直接运行的话…,手动搞吧。
首先配置好你的cuda目录,在你的环境变量中设置好CUDA_PATH,然后打开你的cmd
cd GANet\libs\GANet
python setup.py build
不出意外你将得到一堆信息,最后的两行大概这样:
4 errors detected in the compilation of "C:/Users/zzubq/AppData/Local/Temp/tmpxft_00004958_00000000-10_GANet_kernel.cpp1.ii".
error: command 'C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v10.1\\bin\\nvcc.exe' failed with exit status 1
将编译的信息拷贝到nodepad++中,直接查找"error",可以找到如下信息:
C:/Users/zzubq/Anaconda3/lib/site-packages/torch/include\torch/csrc/jit/api/module.h(474): error: member "torch::jit::detail::ModulePolicy::all_slots" may not be initialized
C:/Users/zzubq/Anaconda3/lib/site-packages/torch/include\torch/csrc/jit/api/module.h(487): error: member "torch::jit::detail::ParameterPolicy::all_slots" may not be initialized
C:/Users/zzubq/Anaconda3/lib/site-packages/torch/include\torch/csrc/jit/api/module.h(501): error: member "torch::jit::detail::BufferPolicy::all_slots" may not be initialized
C:/Users/zzubq/Anaconda3/lib/site-packages/torch/include\torch/csrc/jit/api/module.h(514): error: member "torch::jit::detail::AttributePolicy::all_slots" may not be initialized
可以看到都是module.h出的错误,打开这个文件,将文件中所有的"constexpr"改成”const",可以使用nodepad++的全部替换功能,比如:
static constexpr bool all_slots = Policy::all_slots;
修改成:
static const bool all_slots = Policy::all_slots;
然后修改cast.h这个文件,路径:{你的python路径}\Lib\site-packages\torch\include\pybind11\cast.h,1449行
explicit operator type&() { return *(this->value); }
修改成:
explicit operator type&() { return *((type*)this->value); }
保存退出,然后再去重新执行:
python setup.py build
等待完成,然后在libs\GANet\build下新建一个名为"lib"的文件夹,将刚才编译出来的“lib.win-amd64-3.70”文件夹下的内容全部拷贝到lib文件夹下,完成后目录结构如下:
这两步其实就是compile.sh中的
cp -r build/lib* build/lib
根据上述的操作都已经改好了,所以直接运行即可
cd libs/sync_bn
python setup.py build
然后同样新建一个"lib"文件夹,拷贝过去,完成后目录结构如下:
到这里就都编译好了,作者还提到安装apex,如果运行的时候没有碰到BN error的错误,就不用折腾了。
现在就可以直接按照作者给出的命令运行了,不过(表 重点)运行的话需要你的显存大于6.5G,硬性要求!如果你的显存比较可怜,可以将predict.py中的
parser.add_argument('--model', type=str, default='GANet_deep', help="model to train")
改成:
parser.add_argument('--model', type=str, default='GANet11', help="model to train")
也可以试试将参数中的cuda改成False,不过大概率的你会得到另外的错误,比如:
TypeError: batchnorm_forward(): incompatible function arguments. The following argument types are supported:
别问我怎么知道的,也别问我怎么解决。问就是“换一块显存大于6.5G的GPU”,CPU真的折腾不起,搞不定!(伤害性不大,侮辱性极强。我不会告诉你,今天为了这个受到了100000点的伤害 /哭)