历史上,人工智能的概念几经沉浮。如今,凭借低成本的存储、高性能的算力和改进的训练方法,旧的概念再次焕发出新的生机。以TensorFlow和PyTorch为代表的一众深度学习框架的出现,更是将这个领域的门槛降到天下何人不炼丹的程度。
然而(er),深度学习靠(kao)框(kuang)(kuang)架,框(kuang)(kuang)架还(hai)要(yao)挑CUDA。
技术的(de)飞速发展和(he)训(xun)练框架的(de)野蛮迭(die)代背后,是一地不兼容(rong)的(de)版本号,和(he)绕(rao)口(kou)令一般的(de)困境(jing)。
不(bu)同(tong)的PyTorch版(ban)本依赖不(bu)同(tong)的CUDA版(ban)本
不同的(de)TensorFlow版(ban)本(ben)依赖不同的(de)cuDNN版(ban)本(ben)
不同(tong)的cuDNN版本也(ye)依(yi)赖不同(tong)的CUDA版本
不同(tong)的(de)CUDA版本(ben)依(yi)赖不同(tong)的(de)NVIDIAGPU驱动版本(ben)
最(zui)后不同操作系统的(de)不同版(ban)本(ben)只支持个别版(ban)本(ben)的(de)GPU驱动
所以新手最常(chang)遇到的场景是(shi),为了运行一份(fen)最后更新于三(san)年前的、散(san)发着古早(zao)味的、据说很厉(li)害的代码,降级并(bing)重装整个操作(zuo)系统(tong),并(bing)且常(chang)常(chang)因为误信了网(wang)上流(liu)传(chuan)的同样古早(zao)的二手知识而以失败告终。
基(ji)于云的GPU环境(jing)一(yi)般都(dou)会提供预装(zhuang)的镜像,但毕竟选择有限,不能覆盖所有的场景。数据科(ke)学家(jia)们大多不是工程(cheng)师,纠缠这些底层细节既不擅长也无意(yi)义(yi)。工程(cheng)化的缺失一(yi)直(zhi)是深度学习领域面临的重大问题,年轻的炼丹师们流汗又流泪。
本(ben)文将介绍如何基于容器(qi)技术快(kuai)速供(gong)给和切(qie)换不同(tong)的cuDNN/CUDA运(yun)行时(shi),轻松搭建(jian)不同(tong)版本(ben)的深(shen)度学习环境。
GPU容器化(hua)的核心是NVIDIA Container Toolkit:
不同(tong)的(de)容(rong)器共(gong)享(xiang)GPU硬件(jian)和驱动(dong),上(shang)层(ceng)的(de)cuDNN/CUDA组(zu)件(jian)已经(jing)预先打包在镜像(xiang)里,CUDA与(yu)底(di)层(ceng)的(de)驱动(dong)和操作系统实现解耦,不同(tong)版本(ben)的(de)运行时(shi)可以在同(tong)一台(tai)主(zhu)机(ji)上(shang)共(gong)存,宿(su)主(zhu)机(ji)上(shang)只需(xu)要安装最新(xin)版本(ben)的(de)NVIDIA GPU驱动(dong)即可。
尽管很宽泛,但(dan)是NVIDIAContainer Toolkit对操作(zuo)系统的发行版和(he)版本(ben)(ben)号还(hai)是有基(ji)本(ben)(ben)的要求(qiu):
上表中常用(yong)(yong)的(de)(de)(de)操(cao)作(zuo)系统,Debian过于保(bao)(bao)守,Ubuntu太过激进,装机量较大的(de)(de)(de)CentOS又前途不明,所以我(wo)们选择完全兼(jian)容CentOS又有Oracle官方长期支持(chi)保(bao)(bao)障的(de)(de)(de)Oracle Linux作(zuo)为(wei)环境安装的(de)(de)(de)基石(shi),这里(li)使用(yong)(yong)最新的(de)(de)(de)8.4版(ban)本(ben)。
首先安装(zhuang)GPU驱动,NVIDIA提供(gong)了三种安装(zhuang)方式:本地全(quan)量(liang)rpm包(bao)(bao)、网(wang)络(luo)rpm仓库和二(er)进制(zhi)可执行文件(jian)(jian)(jian)。毫(hao)无(wu)疑问应(ying)该选(xuan)(xuan)择(ze)(ze)本地全(quan)量(liang)rpm包(bao)(bao),因为旧的(de)依赖包(bao)(bao)不(bu)久就会被从网(wang)络(luo)上移除,而(er)GPU硬件(jian)(jian)(jian)的(de)使(shi)用寿命(ming)明(ming)显远远长于这些(xie)软件(jian)(jian)(jian),所以不(bu)建议选(xuan)(xuan)择(ze)(ze)网(wang)络(luo)仓库,以免(mian)将来(lai)无(wu)法重新安装(zhuang);不(bu)选(xuan)(xuan)择(ze)(ze)二(er)进制(zhi)可执行文件(jian)(jian)(jian)是因为安装(zhuang)后难以干(gan)净地移除,升级时可能会遇到(dao)冲突。
在(zai)//developer.nvidia.com/cuda-downloads下(xia)载全(quan)量rpm包:
安装(zhuang)内核头(tou)文件,注意(yi)OracleLinux默认(ren)使用的是(shi)UEK内核,如果使用主(zhu)线(xian)内核请做相(xiang)应调整(安装(zhuang)kernel-devel):
【代码】
安(an)装驱动模块和(he)必要的依赖(lai):
【代码】
第二(er)步,安装(zhuang)并(bing)启动Docker服务:
【代码】
最(zui)后,安装NVIDIA Container Toolkit并且重启Docker服(fu)务:
【代码】
NVIDIA在(zai)//gitlab.com/nvidia/container-images/cuda/blob/master/doc/supported-tags.md提供了从CUDA 9.2到(dao)CUDA 11..4.1的多(duo)种官方镜(jing)像(xiang),创建不(bu)同版本的cuDNN/CUDA运(yun)行时只需要简单拉(la)取对应的镜(jing)像(xiang)即可(ke)。
比(bi)如(ru)安(an)装PyTorch 1.9.0所需的CUDA 10.2:
【代码】
【输出】
不要被右(you)上角的CUDA版(ban)本(ben)号吓到,它(ta)只是表明当前宿(su)主(zhu)机的GPU驱动所能支持CUDA的最高版(ban)本(ben),容器中真(zhen)正的CUDA版(ban)本(ben)可以(yi)通过nvcc命令来验证:
【代码】
【输出】
祝炼丹成功。