歷史上,人工智能的概念幾經沉浮。如今,憑借低成本的存儲、高性能的算力和改進的訓練方法,舊的概念再次煥發出新的生機。以TensorFlow和PyTorch為代表的一眾深度學習框架的出現,更是將這個領域的門檻降到天下何人不煉丹的程度。
然而,深(shen)度學習靠(kao)框(kuang)架(jia),框(kuang)架(jia)還要挑(tiao)CUDA。
技術的(de)飛速發展和訓練框架的(de)野蠻迭代(dai)背后,是(shi)一地不兼(jian)容的(de)版本號,和繞口(kou)令一般的(de)困境(jing)。
不同(tong)的(de)PyTorch版本(ben)依賴不同(tong)的(de)CUDA版本(ben)
不(bu)同的TensorFlow版本(ben)依賴不(bu)同的cuDNN版本(ben)
不(bu)同(tong)的cuDNN版本也依賴(lai)不(bu)同(tong)的CUDA版本
不(bu)同的(de)CUDA版本依賴不(bu)同的(de)NVIDIAGPU驅動(dong)版本
最后不(bu)同操作(zuo)系統的不(bu)同版(ban)(ban)本(ben)只支持個別版(ban)(ban)本(ben)的GPU驅(qu)動
所以新手(shou)最常遇到的場景(jing)是,為了運行一份最后更新于三(san)年前的、散(san)發(fa)著古早味的、據(ju)說很厲害的代碼(ma),降級并重裝整個操(cao)作系統,并且常常因為誤信(xin)了網(wang)上流傳的同樣古早的二手(shou)知識而以失(shi)敗告終。
基于云(yun)的(de)GPU環(huan)境一般都(dou)會提供預裝的(de)鏡像(xiang),但(dan)畢竟(jing)選擇有(you)限,不(bu)能覆(fu)蓋所(suo)有(you)的(de)場景。數(shu)據科(ke)學家(jia)們大(da)多不(bu)是工(gong)程師,糾纏這些底層細節既不(bu)擅長也無意義。工(gong)程化的(de)缺失一直是深度(du)學習領(ling)域面臨的(de)重大(da)問(wen)題,年輕的(de)煉丹師們流汗又流淚。
本文將介(jie)紹(shao)如何基(ji)于容器技術(shu)快速供給(gei)和切(qie)換不(bu)同的cuDNN/CUDA運(yun)行時,輕松搭建不(bu)同版本的深(shen)度學習環(huan)境。
GPU容器化(hua)的核心(xin)是NVIDIA Container Toolkit:
不同(tong)的(de)容器共享(xiang)GPU硬件和驅動,上層(ceng)的(de)cuDNN/CUDA組(zu)件已經(jing)預先打包在鏡(jing)像里,CUDA與底(di)層(ceng)的(de)驅動和操作系統實現(xian)解(jie)耦,不同(tong)版(ban)本的(de)運行(xing)時可以在同(tong)一臺主機上共存,宿(su)主機上只需要安(an)裝最新版(ban)本的(de)NVIDIA GPU驅動即可。
盡管很寬泛,但是NVIDIAContainer Toolkit對操作系統的(de)發(fa)行(xing)版和版本(ben)號還是有基本(ben)的(de)要求:
上表(biao)中常用(yong)(yong)的操作系(xi)統,Debian過于保(bao)(bao)守,Ubuntu太過激(ji)進,裝機(ji)量較大的CentOS又前途不明,所以(yi)我們選擇完全兼容CentOS又有Oracle官方長(chang)期支持保(bao)(bao)障的Oracle Linux作為環境安裝的基石(shi),這里使用(yong)(yong)最新的8.4版(ban)本。
首先安(an)裝GPU驅動,NVIDIA提(ti)供了三種(zhong)安(an)裝方式:本地全量(liang)(liang)rpm包(bao)、網絡rpm倉庫和(he)二(er)進制可執(zhi)行文件(jian)。毫無疑問應該選擇本地全量(liang)(liang)rpm包(bao),因(yin)為(wei)舊的(de)依賴包(bao)不久就會(hui)被從網絡上移除(chu),而GPU硬件(jian)的(de)使用壽命明顯遠遠長(chang)于這些軟(ruan)件(jian),所以(yi)不建議選擇網絡倉庫,以(yi)免將來(lai)無法重新安(an)裝;不選擇二(er)進制可執(zhi)行文件(jian)是因(yin)為(wei)安(an)裝后難以(yi)干凈地移除(chu),升(sheng)級時可能會(hui)遇到(dao)沖突。
在//developer.nvidia.com/cuda-downloads下載全量rpm包(bao):
安(an)裝(zhuang)內(nei)核頭文(wen)件,注(zhu)意OracleLinux默認使用(yong)的是(shi)UEK內(nei)核,如果使用(yong)主線內(nei)核請(qing)做相應(ying)調整(zheng)(安(an)裝(zhuang)kernel-devel):
【代碼】
安(an)裝(zhuang)驅動模塊(kuai)和必(bi)要的依(yi)賴:
【代碼】
第二步(bu),安裝并啟(qi)動(dong)Docker服務(wu):
【代碼】
最后(hou),安裝NVIDIA Container Toolkit并且(qie)重啟Docker服(fu)務:
【代碼】
NVIDIA在//gitlab.com/nvidia/container-images/cuda/blob/master/doc/supported-tags.md提供了從CUDA 9.2到CUDA 11..4.1的(de)(de)多(duo)種官方鏡像,創建不同(tong)版本的(de)(de)cuDNN/CUDA運(yun)行(xing)時(shi)只需(xu)要簡單拉取對應的(de)(de)鏡像即可。
比如安裝PyTorch 1.9.0所需的CUDA 10.2:
【代碼】
【輸出】
不(bu)要被(bei)右上角的CUDA版本(ben)號嚇到,它只是(shi)表(biao)明當前宿(su)主機的GPU驅動(dong)所能支持CUDA的最高版本(ben),容器中(zhong)真正的CUDA版本(ben)可以通過nvcc命(ming)令來驗證:
【代碼】
【輸出】
祝煉丹成功。