配置
**styleGAN2和styleGAN3一直跑不出来的问题“no module named fused”,或者是“filtered_lrelu_plugin setup failed”,原因在于它们的模型使用了torch extension,例如styleGAN2下的models文件里面有个op,里面有C++代码,这部分在运行时python会调用ninja来编译。对于styleGAN2,有人介绍过一种方法,不需要配环境,只需要把fused_at.py和upfirdn2d.py全部修改为python版本的即可,在styleGAN2的官方仓库的issue里有提供,也可以在这位博主这里找到 如果不改上面的,或者遇到了一些其它情况下的问题,可能可以参考本文方法解决,不保证有效性,本文的环境配置为
- pytorch=1.8.0
- cuda=11.4
- windows11
- ninja 1.10.2
预先安装
- 检查cuda是否安装好,例如在CMD输入NVCC -V, nvidia-smi能出现正常的字幕。cuda的安装参考其它部分
- 检查VS是否是2017版,最好是这个版本,之前笔者安装了VS2019,浪费了2个下午也没有配置成功。需要首先安装VS2017 community版,只需要安装C++桌面开发的库,并且全部使用默认路径(在C盘,program file(x86)里面)。并且配置VS的环境变量Path、LIB和INCLUDE,它们的内容可能是:
①Path=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64; ②LIB=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\lib\x64; ③INCLUDE=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include - 将VS的语言包安装为英文版,否则会出现离奇的错误,UnicodeError,XXX can’t XXX,具体做法是找到VS的installer,里面语言包。完成之后在CMD输入cl,返回的都是英文,这样就可以UTF-8解码了
可能出现的报错情况
- 编译[‘ninja’,’-v’] return 1—>如果是styleGAN2报错,这里面需要找到torch的extention这个报错的文件,笔者的是anaconda环境torch18,所以在anaconda3\envs\torch18\Lib\site-packages\torch\utils目录下,找到cpp_extension.py,找到其中的函数_run_ninja_build,下面有一行command = [‘ninja’, ‘-v’],如果把’-v’改成’–version’,可以解决一种情况下的报错,表示的意思是显示版本,先改完保存,再运行一次styleGAN试试,可能就成了【如果没有成功,记得改回来,’-v’表示的是verbose的意思】
- UnicodeError, UTF-8 can’t XXXX。有人说要把cpp_extension.py里面的match = re.search(r’(\d+).(\d+).(\d+)’, compiler_info.decode().strip())这里,compiler_info(也就是cl返回的信息,VS默认返回中文,UTF-8解码错误),所以修改为空格gbk,也就是decode(‘ gbk’)用gbk编码来解码中文,会发现运行styleGAN2是warning,styleGAN3是error,在filtered_lrelu_plugin进行setup的时候直接gbk can’t decodeXXX,所以一定要做好预先安装那里,VS的语言是英文,这个错误不需要修改cpp_extension.py
- 在styleGAN3中报错[‘ninja’,’-v’] return 1,这个略微复杂,报错非常长,但是在pycharm里面,或者jupyter notebook的报错信息里面搜索’error’,会发现实际上报错的信息是说,filtered_lrelu.cpp代码里面出现了if constexpr这个用法,这个用法是C++17以后才可以用,所以问题变为让ninja调用C++17,也就是cl要使用C++17的规范来编译。修改方法为,修改filtered_lrelu.py这个文件,在里面搜索get_plugin,找到这个函数,加上extra_cflags=[’/std:c++17’],指定使用C++17编译,对于另外两个extension,bias_act和upfirdn2d也要找到get_plugin进行修改,修改完应该就OK了!
- 运行代码在ninja编译filtered_lrelu、fused或者upfirdn2d的时候,过了2分钟仍然卡在同一个位置,“死锁”。这是由于cpp_extension.py里面创建了一个lock,这个lock的位置是在torch的缓存目录下,windows中,找到个人用户目录,例如自己电脑上登录的用户名为username,这个目录在C:\Users\username\AppData\Local\torch_extensions\torch_extensions\Cache,Cache里面打开就会发现一系列文件,可能文件夹的名字含有…RTX…,再点开这个文件夹,如果是styleGAN3,看见的是下图,挨个点开看,里面是否有一个文件名叫’lock’,有的话,删除该文件,如果删不动说在占用,就点击重试,多点几次重试之后,还删不掉,点击取消,这时候发现程序开始动了…每次运行可能这三个文件夹里面都会或者都不会出现’lock’,需要经常检查
其它
现在在windows上调试ok了,linux之后更 在上面卡了三四天,浪费了很多时间,希望大家都能一次成功!
|