背景
做深度学习的小伙伴们可能都会在安装环境的时候经常遇到的cuda版本驱动版本以及和显卡是如何对应的,经常搞得特别糊涂,官网没有直接提供他们的对应关系,导致我们在升级显卡的时候发现原来的软件环境不兼容,出现各种奇奇怪怪的问题。
NVIDIA系列显卡做深度学习,需要在宿主机安装显卡驱动(driver),需要在docker中安装英伟达的科学计算库(cuda),在python中安装深度学习库(我主要用pytorch),driver依赖显卡,cuda依赖driver,pytorch依赖cuda,于是就会有一些版本依赖问题.
最近我在将显卡从GTX2070升级到GTX3090的时候,发现自己原来pytorch程序总会在.cuda()命令卡十分钟左右,并且还有其他异常。后来才知到GTX3090需要cuda11以上的版本才能正常运行,而我使用的python库pytorch为0.4.1,cuda版本为9.0,受制于当前pytorch版本,无法使用最新的显卡,那么这个是如何看出来的呢?又如何解决?
寻找对应关系
英伟达官网(参考cuda-GPUs)并没有给出一个直接的关联关系,而是给了一个Compute Capability,让人摸不到头脑。
实际上这是一个中间数据,还需要另外一张表才能找到和cuda的对应关系,经过搜索我在维基百科(参考CUDA) 找到了答案。
同时,cuda对显卡驱动也有特定的要求,从英伟达官网(参考cuda)继续寻找答案
我们再查询深度学习库(参考pytorch)的版本对cuda的依赖关系
解决问题
综合以上分析,GTX3090需要Compute Capability在8.6以上的cuda,而满足这个要求的cuda又只有11.0以上的版本。而cuda11版本又需要版本号>450的显卡驱动。
其实,从表中我们也可以分析出,cuda和显卡驱动基本都是向下兼容的,意味着我安装最新的cuda和显卡驱动,基本上可以支持以前的几乎所有显卡。当然了,代价是需要更新我们的python深度学习库比如pytorch,tensorflow等指定cuda的版本,否则可能会出现一些兼容问题。
所以最后我安装最新驱动,重新构建了docker,用英伟达官方提供的cuda11的作为基础镜像,参考github Docker-Ubuntu-Unity-noVNC, 更新pytorch0.4.1到1.7.1,甚至升级python版本3.5为3.9,索性兼容性还不错,只做了少量改动,问题完美解决。
参考链接汇总
https://developer.nvidia.com/cuda-GPUs
https://en.wikipedia.org/wiki/CUDA
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html