Contents

【坑】【配置地狱】Pytorch+CUDA

问题的诞生

随着人工智能领域不断地发展,Pytorch已经成为AI领域的基础设施,因此有许多研究者/开发者基于Pytorch开发出了不少新的基础设施,例如港中文-商汤的openmmlab推出的mmdetection系列。而又有更多人基于mmdetection,做出了更多的项目。

Nvidia做的恶在于不同版本间的CUDA是ABI不兼容的。于是乎,我们就有了经典的配置地狱(排列组合问题)。比如说我想装Pytorch 1.8,支持的有CPUonly,CUDA 10.2和11.1,然后Python版本可以有3.6,3.7,3.8和3.9等等。那么同一个版本的Pytorch就有12个不同配置的包,进一步恶化了Python不同版本之间的打包并额外添加了硬件依赖。可以想象,Python、CUDA版本、Torch版本三重套娃下,需要构造多少版本包。

现在AMD的ROCm还在发展中,尽管一贯秉持开源精神,但是与CUDA生态相比,尚有很大的差距。苏妈加油!!!

根据通常的编程经验,LOOP不要超过4层。在目前基于Pytorch等框架做茶底,一层层进行套娃项目的环境下,这个版本包的LOOP大概可以达到5层以上。而且,目前的开发人员缺乏对多版本包构造的维护能力,更多地,往往是打一枪就走人了,于是项目常年不更新了,宣判进入死亡。

我们将可以看到Github将成为无数AI Project的墓地。墓志铭上写着:老黄,我死的好惨啊~

老黄要是能当个人的话,希望早日提高CUDA跨版本兼容性。我作为一个纯白痴用户,非常希望你不断地升级CUDA,但是你也不要 只管新人笑,不管旧人哭

更新:2022年12月28日

老黄意识到有兼容性问题(Compatibility),也做了兼容性的尝试与保证,只是他纯纯不当人而已。

CUDA官网release相关信息:

For example, 11.6 applications can link against the 11.8 runtime and the reverse. This is accomplished through API or ABI consistency within the library files. For more information, see CUDA Compatibility.

Minor version compatibility continues into CUDA 12.x. However, as 12.0 is a new major release, the compatibility guarantees are reset. Applications that used minor version compatibility in 11.x may have issues when linking against 12.0. Either recompile your application against 12.0 or statically link to the needed libraries within 11.x to ensure the continuity of your development.

CUDA 11 里面所有小版本是ABI相互兼容,可以互换,也就是说11.1~11.8之间的cuda版本,做动态链接的so库,都是相互之间兼容的。

然而,老黄还是不保证跨版本兼容,11.x内部可以兼容,12.x内部也可以兼容。只是11.x与12.x不做兼容。

这么多茶底,你怎么逃得过?

上古茶底7.5,8.5,9.0,10.0,10.1,10.2;

现代茶底11.x;

未来茶底12.x;

https://tse1-mm.cn.bing.net/th/id/OIP-C.aXlZs0mexuu2Yr4ugJLGHAHaG-?pid=ImgDet&rs=1

说到跨版本兼容性差,不得不提Ubuntu。 18.04转到20.04环境挂一波,20.04到22.04继续挂一波。。。。

然而,目前机器学习相关的官方环境,都推荐使用Ubuntu,不当人遇见了不当人=What the Hell!!!

个人的解决经验

Step 1 解决CUDA 多版本共存的问题

Lucky Point:CUDA本身其实是一个二进制安装包。注意在安装过程中不要顺路装了CUDA安装包里面自带的GPU驱动了。 正确的CUDA安装顺序是:

安装GPU驱动(官网下载相应型号的RUN包,或者Ubuntu apt一键解决)

CUDA网站下载CUDA RUN包

安装CUDA(without CUDA中的GPU Driver)

然后通过Environment Module(HPC经典的解决方案) 通过编写Modulefile来构造不同的CUDA环境,示例如下:

#cuda/111
#%Module 1.0
conflict cuda
set CUDA /usr/local/cuda-11.1
setenv CUDA_HOME $CUDA
prepend-path PATH ${CUDA}/bin
prepend-path LD_LIBRARY_PATH ${CUDA}/lib

注意需要添加CUDA_HOME环境变量,可选地进行module conflict配置。

通过module load cuda/111来载入CUDA 11.1的环境。

类似地,通过module load cuda/116来载入CUDA 11.6的环境。

环境切换可通过命令module switch XXX执行。

另外可以通过 module purge 来清空当前载入的所有modulefile环境。

Step 2 安装Anaconda(还是老老实实走Conda环境吧)

使用virtualenv、pipenv、conda各种虚拟环境后,我个人体验下来的经验是 conda create --name envname python=3.X 这个虚拟环境环境配置起来最舒服。 pipenv需要本地有其他版本的python才能虚拟出其他版本的python,当然也有pyenv诸如此类的python版本虚拟库项目当外挂。

虽然我一直诟病 conda install 的resolve dependency时间很长,但是如果我们换一种思路: 我们每做一个git clone 人工智能project,就为这个project create一个独立的conda环境,以做好环境依赖和隔离,更可以避免项目间互相打架。这样每次因为是新环境,其实resolve dependency并不需要很长的时间。

用空间来换时间!

Pytorch加速下载小技巧

PyTorch pip安装默认都是通过torch官网自带的repo进行下载,由于服务器在境外,在祖国大地上下载相关的包速度非常慢!!!

conda install需要配置好.condarc并指向国内镜像。

ref:CSDN

普通用户: 找到aliyun的anaconda Pytorch mirror REPO

教育网用户: 清华的anaconda Pytorch mirror REPO

利用ctrl+F迅速搜索到适合自己Python版本、CUDA版本的Pytorch、Tochvision等tar.bz2包。

之后利用下述命令,进行离线GPU版的Pytorch安装。

conda install --offline ./pytorch-XXX-pyXXX-cudaXXX.tar.bz2

注意安装顺序: 先装好Pytorch在torchvision等其他包。