CUDA 11.4编译PyTorch 1.12.0
啊?这玩意还能有第三期?
起因是想玩玩ChatGLM3,然后发现这个库用的pytorch版本特别新(说是要求2.0以上,实测1.12也行),于是就打算自己编一个新版本玩玩。然后人就傻眼了:编了几天,编译过程是挺顺利的,结果编出来的whl用不了,一import就报OSError 1114
,说是某个DLL的初始化函数出了问题,一开始以为是编译器坏了(因为就在当天一次重启把我CUDNN炸了,也不知道是不是SSD的问题 汰渍全责!),前后更换配置(Python版本/MSVC版本/是否启用CUDA,甚至换了电脑)编了几天,SSD都写了快1TB了,还是没有任何进展。
然后也是因为各种配置问题没文档,编不出Debug版的wheel来,就着RelWithDebInfo
版用regsvr32
看了半天,发现好像是因为某个全局静态变量没有初始化还是咋的,导致DLL加载过程中抛出了c10
库的异常,没给任何有用信息就直接把主程序炸了;然而由于该方法只是简单地加载了一个DLL,并不一定遵循PyTorch应有的初始化逻辑,所以也不知道有没有参考价值。
最后实在想不通了,为什么官方编出来的装了可以直接用,于是决定去偷学官方ci的编译脚本,看看编译流程上和自己的到底有啥区别,结果最后发现,好像最大的差别是他用的是Ninja生成,而我用的是MSBuild。虽然认为本质上应该没啥区别,但是抱着死马当活马医的心态,装了VS自带的CMake工具(对,这玩意其实也自带Ninja的),然后有样学样,用Ninja来编译PyTorch。虽然不是很想用咕果家的东西,但是不得不承认的是,Ninja的TUI还是做得比MSBuild好的,至少可以大致了解到编译流程进行了多少= =
这里贴一下中间需要设置的变量:
set CMAKE_GENERATOR=Visual Studio 16 2019
(因为我没把Ninja加到PATH,以及VS2017编译会有报错);set DISTUTILS_USE_SDK=1
,不然CUDA配置那里可能报一些奇奇怪怪的错误;python setup.py bdist_wheel
,然后理论上他configure完会出现异常终止,因为MSBuild内部调的Ninja和我们设置的环境变量不符合;set CMAKE_GENERATOR=
,取消generator的设置;- 重新执行3,理论上应该不出现任何问题,直到编译完成。
然后就是经典环节了。pip安装编完的whl,import
,没有报错,直接成功了,是的,成功了。
很喜欢计算机人的一句话:啊?
只能说是在摸清问题之前解决了问题了罢。咱又不开发AI框架,既然问题解决了,那探究先到此为止吧。