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