導(dǎo)讀
本文記錄了組裝深度學(xué)習(xí)工作站過程中的超詳細(xì)操作流程,文章分為硬件、系統(tǒng)、DL開發(fā)環(huán)境配置以及工作站的維護(hù),可供有類似需求的同學(xué)作為參考。
0 前言
工作原因一直想配置一臺(tái)自己的深度學(xué)習(xí)工作站服務(wù)器,之前自己看完paper想做一些實(shí)驗(yàn)或者復(fù)現(xiàn)模型的時(shí)候只能用自己的日常PC來跑很麻煩...一方面電腦得裝雙系統(tǒng),干活的時(shí)候就不能用作其他用途了;另一方面,即使是沒有使用流程的問題,GTX1080的性能也還是弱了一些,更何況我用的是一個(gè)A4迷你機(jī)箱,長時(shí)間高負(fù)載的訓(xùn)練任務(wù)也不太可靠。
以前在公司的時(shí)候還可以用公司的DGX訓(xùn)練集群做一些實(shí)驗(yàn),但是我現(xiàn)在的開發(fā)環(huán)境已經(jīng)切換到了昇騰的NPU架構(gòu)芯片之上了,昇騰平臺(tái)算力方面雖然是比肩甚至可以超越英偉達(dá),但是目前暫時(shí)很多學(xué)術(shù)界的生態(tài)都還是基于GPU服務(wù)器的(主要是指開源代碼),且我們這兒昇騰服務(wù)器對個(gè)人也不好買(且買不起),所以有一臺(tái)這樣的GPU工作站還是會(huì)方便一些。
那么本文是我在組裝工作站過程中記錄的詳細(xì)操作流程,供有類似需求的同學(xué)參考~
1. 硬件篇
1.1 工作站配置選型
配件全家福
服務(wù)器的配置以個(gè)人使用性價(jià)比為主,同時(shí)考慮到以后的擴(kuò)展性像是主板和機(jī)箱這些配件配置設(shè)置一些冗余。首先是CPU平臺(tái)的選擇,雖然AMD這兩年實(shí)在是香,但是作為生產(chǎn)力工具考慮到軟件庫的兼容性問題,還是決定選擇intel平臺(tái)里十代X系列CPU+X299主板,算是比較穩(wěn)的方案,而且某東上CPU搭配主板套裝一起買也性價(jià)比也很高。GPU方面今年的30系顯卡都比較良心,使用兩塊3080或者一塊3090都是很給力的,24G的顯存也已經(jīng)跟TITAN RTX持平了(價(jià)格卻只要一半)...這里考慮到主板上只能插兩塊PCIEx16的卡,為了以后可能的提升性能還需要再加一塊卡,所以3090是最佳選擇。
最后選定的配置如下:
CPU:i9-10920X
顯卡GPU:七彩虹RTX3090 Advance
內(nèi)存:芝奇幻光戟16G x 4共64G
主板:華碩X299-DELUXE PRIME
固態(tài)硬盤:1TB西數(shù)NVME SSD + 1TB三星870QVO SATA SSD
機(jī)械硬盤:希捷EXOS 12TB氦氣盤
電源:海盜船AX1200i 1200W模組電源
散熱器:海盜船H100X240水冷 + 若干120機(jī)箱風(fēng)扇
機(jī)箱:海盜船AIR540 E-ATX機(jī)箱
其中硬盤的設(shè)計(jì)是這樣的:1T的NVME固態(tài)做系統(tǒng)盤,12T的機(jī)械盤作為數(shù)據(jù)集倉庫,另外一個(gè)1T SATA固態(tài)作為訓(xùn)練時(shí)的數(shù)據(jù)集緩存,因?yàn)镮O讀寫速度也是會(huì)影響訓(xùn)練效率的,所以相比于直接從機(jī)械盤里面讀取數(shù)據(jù),加一塊SSD做cache效果會(huì)好很多。
1.2 電腦組裝
總之就是快樂的玩具拼裝過程~
機(jī)箱尺寸比較大,預(yù)留的空間非常足所以不會(huì)出現(xiàn)像是在裝A4機(jī)箱時(shí)那種考驗(yàn)走線和裝配順序的技巧問題;而且服務(wù)器嘛,安靜地塞在某個(gè)角落就好了,也不用過于考慮什么美觀問題,所以走線就很隨意了:
這個(gè)機(jī)箱設(shè)計(jì)還是很科學(xué)的,預(yù)留了足夠多的擴(kuò)展接口比如:2個(gè) 3.5寸可快拆盤位、5個(gè)2.5寸可快拆盤位、光驅(qū)位(用不到,后期改造了)、前后頂部一堆風(fēng)扇位等等。線材基本都可以塞到機(jī)箱的另一個(gè)側(cè)面,前面板安裝了三個(gè)進(jìn)風(fēng)風(fēng)扇,背部安裝了一個(gè)出風(fēng)風(fēng)扇,水冷的冷排和風(fēng)扇在頂端。
這里值得一提的是,正面的光驅(qū)位屬于用不上的老古董,所以我改造了一下準(zhǔn)備裝一個(gè)小型的LCD屏幕上去,這樣偶爾需要進(jìn)圖形桌面或者BIOS界面的時(shí)候,就不用再抱個(gè)顯示器插在機(jī)箱上了;此外以后也可以寫個(gè)軟件把這個(gè)屏幕作為系統(tǒng)狀態(tài)監(jiān)視器來使用~
↑ 后面會(huì)3D打印一個(gè)外殼把屏幕固定住。
這個(gè)屏幕也是我前陣子剛設(shè)計(jì)的,項(xiàng)目已經(jīng)開源了叫做PocketLCD,感興趣的可以去倉庫看看:
https://github.com/peng-zhihui/PocketLCDgithub.com
2. 系統(tǒng)篇
系統(tǒng)選擇DL開發(fā)里面最常用的Ubuntu,最新的穩(wěn)定版本是20.04,安裝過程需要準(zhǔn)備一個(gè)U盤作為系統(tǒng)啟動(dòng)盤。
2.1 安裝Ubuntu 20.04系統(tǒng)
在官網(wǎng)下載Ubuntu鏡像:Ubuntu 20.04.1 LTS (Focal Fossa)(http://releases.ubuntu.com/20.04/),選擇Desktop Image版本,得到.iso的鏡像文件。
Windows下使用UltraISO工具打開.iso鏡像文件,并將其寫入到一個(gè)U盤,得到系統(tǒng)啟動(dòng)盤:
將U盤插到服務(wù)器上,開機(jī)按del鍵(具體什么鍵跟主板型號(hào)有關(guān))選擇啟動(dòng)項(xiàng)進(jìn)入臨時(shí)的Ubuntu系統(tǒng),在圖形界面中選擇Install Ubuntu,所有配置都可以使用默認(rèn)的,改一下用戶名和密碼即可。這里建議使用英文作為默認(rèn)語言,省得給自己日后開發(fā)找麻煩哈。
安裝過程中會(huì)聯(lián)網(wǎng)下載一些軟件包更新,可以直接點(diǎn)skip掉,在安裝好系統(tǒng)之后再手動(dòng)更新也是一樣的。
1. 進(jìn)入系統(tǒng)后設(shè)置一下root賬戶密碼:sudo passwd root
2.2 配置國內(nèi)鏡像軟件源
為了提升后續(xù)安裝軟件時(shí)的幸福感,第一步當(dāng)然先要替換一下軟件源。
1. 備份原來的源:cp /etc/apt/sources.list /etc/apt/sources.list.bak
2. 將源的內(nèi)容設(shè)置為阿里云鏡像:
sudo vim /etc/apt/sources.list
內(nèi)容改為:
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
3. 更新軟件列表:
sudo apt update sudo apt upgrade
也可以去網(wǎng)上搜其他鏡像,在我這邊經(jīng)測試阿里云是最快的。另外也可以在圖形桌面環(huán)境下打開Software & Updates軟件,在里面也有網(wǎng)速測試并選擇最佳源的功能。
1. Ubuntu系統(tǒng)默認(rèn)自帶python,有版本需求的話也可以自己安裝一下(不安裝也行因?yàn)楹竺鏁?huì)安裝conda環(huán)境):sudo apt install python3 sudo apt install python3-pip
2. 不管是不是自己安裝的python,替換python的pip源建議是一定操作一下的,pip安裝速度會(huì)快很多:
cd ~ mkdir .pip
直接新建并編輯pip.conf:
sudo vim ~/.pip/pip.conf
改為以下內(nèi)容(這里用的清華源,也可以試一下阿里、豆瓣等源):
[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple/ [install] trusted-host = pypi.tuna.tsinghua.edu.cn
3. 更改默認(rèn)python版本,python目錄默認(rèn)鏈接的是python2,而現(xiàn)在基本都是用python3開發(fā)了,每次都輸入python3很麻煩所以這里直接更換默認(rèn)的python命令鏈接。
把原來的python軟鏈接刪掉:
sudo rm /usr/bin/python
新建一個(gè)軟鏈接:
sudo ln -s /usr/bin/python3 /usr/bin/python sudo ln -s /usr/bin/pip3 /usr/bin/pip
現(xiàn)在輸入python就會(huì)進(jìn)入python3環(huán)境了。
2.4 配置SSH & 遠(yuǎn)程桌面
純凈安裝的系統(tǒng)里面默認(rèn)沒有開啟SSH,我們手動(dòng)安裝一下。
安裝ssh:
sudo apt install ssh
會(huì)自動(dòng)安裝好很多依賴包并啟動(dòng)服務(wù),完成之后用XShell等軟件就可以SSH登錄服務(wù)器了。
2. 安裝xrdp
Xrdp 是一個(gè)微軟遠(yuǎn)程桌面協(xié)議(RDP)的開源實(shí)現(xiàn),它允許我們通過圖形界面控制遠(yuǎn)程系統(tǒng)。這里使用RDP而不是VNC作為遠(yuǎn)程桌面,是因?yàn)閃indows自帶的遠(yuǎn)程桌面連接軟件就可以連接很方便,另外RDP在Windows下的體驗(yàn)非常好,包括速度很快(因?yàn)閴嚎s方案做得比較好),可以直接在主機(jī)和遠(yuǎn)程桌面之間復(fù)制粘貼等等。
有的Xwindow軟件是不太兼容xrdp的(比如ubuntu 18.04的默認(rèn)桌面),但是ubuntu 20.04使用的Gnome是完全ok的。
安裝過程如下:
sudo apt install xrdp
安裝完成xrdp 服務(wù)將會(huì)自動(dòng)啟動(dòng),可以輸入下面的命令驗(yàn)證它:
sudo systemctl status xrdp
默認(rèn)情況下,xrdp 使用/etc/ssl/private/ssl-cert-snakeoil.key,它僅僅對ssl-cert用戶組成語可讀,所以需要運(yùn)行下面的命令,將xrdp用戶添加到這個(gè)用戶組:
sudo adduser xrdp ssl-cert sudo systemctl restart xrdp
然后使用Windows自帶的遠(yuǎn)程桌面軟件連接服務(wù)器IP地址或者域名就行了。
2.5 安裝frp進(jìn)行內(nèi)網(wǎng)穿透
前面介紹的SSH和遠(yuǎn)程桌面都是需要在局域網(wǎng)下通過IP地址進(jìn)行連接的,而我們配置一臺(tái)服務(wù)器最重要的訴求,應(yīng)該是可以隨時(shí)隨地去訪問服務(wù)器。
那在家里面,網(wǎng)絡(luò)運(yùn)營商提供的網(wǎng)絡(luò)服務(wù)通過路由器路由到各個(gè)設(shè)備,此時(shí)路由器會(huì)同時(shí)具備內(nèi)網(wǎng)地址(路由器之內(nèi),局域網(wǎng),LAN,也就是192.168.x.x)和外網(wǎng)地址(路由器之外,互聯(lián)網(wǎng),WAN)。但是其實(shí)這個(gè)WAN口的IP并不是真正的“公網(wǎng)IP”,而時(shí)經(jīng)過了多層的NAT轉(zhuǎn)換之后的地址,外網(wǎng)的設(shè)備是不能通過這個(gè)地址訪問到路由器的。這個(gè)問題的原因是ipv4地址池緊張,如果運(yùn)營商給每家的路由器都安排一個(gè)公網(wǎng)ip的話,那ip地址早就不夠用了呀。
因此為了能讓外網(wǎng)訪問到我們局域網(wǎng)內(nèi)的設(shè)備,就需要跟中國電信等運(yùn)營商申請公網(wǎng)ip(現(xiàn)在能申請到的概率也已經(jīng)不大了,而且即使申請到也不是所有端口都可以使用的),或者我們自己動(dòng)手做一些操作來達(dá)到同樣的目的。
有幾種方法:
可以直接用類似花生殼(https://hsk.oray.com/)這樣的DDNS服務(wù)平臺(tái)做轉(zhuǎn)發(fā)實(shí)現(xiàn)內(nèi)網(wǎng)穿透,優(yōu)點(diǎn)是比較簡單穩(wěn)定,缺點(diǎn)是需要持續(xù)付費(fèi),而且速度和延遲效果一般,而且每加一個(gè)端口都要額外付費(fèi)。
也可以像我一樣使用frp之類的軟件做反向代理來實(shí)現(xiàn)內(nèi)網(wǎng)穿透,這個(gè)方案也是需要你有一臺(tái)帶公網(wǎng)IP的云服務(wù)器的,優(yōu)點(diǎn)就是完全可控,自己想配置多少個(gè)端口的穿透都可以,速度跟你的云服務(wù)器帶寬有關(guān)。
為什么需要多個(gè)端口?是因?yàn)椴煌瑧?yīng)用占用的端口不同,比如我們的SSH走的是22號(hào)端口,而遠(yuǎn)程桌面的rdp走的是3389號(hào)端口,如果需要自建Web服務(wù)的話則是走80/443端口、想把工作站作為上外網(wǎng)的代理服務(wù)器的話會(huì)需要1080端口等等...所以用上面第二個(gè)方案顯然會(huì)方便很多,而且云服務(wù)器也不貴,我在騰訊云上購買一年只要200左右。
下面介紹如何安裝配置frp:
frp分為frps(server)和frpc(client)兩個(gè)包 ,其中前者安裝到我們的云服務(wù)器上,后者安裝在需要被外網(wǎng)訪問到的各個(gè)設(shè)備上,這里就是指我們的深度學(xué)習(xí)工作站。
云服務(wù)器端:
去https://github.com/fatedier/frp/releases下載適合你服務(wù)器系統(tǒng)的frp軟件,我這里是用的是騰訊云64位Ubuntu16.04所以選擇frp_0.34.3_linux_amd64.tar.gz,下好之后解壓:
tar -zxvf frp_0.34.3_linux_amd64.tar.gz
我們需要編輯的文件是frps.ini :
內(nèi)容改為:
[common] bind_port = 7000 # frp服務(wù)的端口號(hào),可以自己定 dashboard_port = 7500 # frp的web界面的端口號(hào) dashboard_user = user # web界面的登陸賬戶,自己修改 dashboard_pwd = pass # web界面的登陸密碼,自己修改 authentication_method = token token = xxxxx # frp客戶端連接時(shí)的密碼,自己修改
保存配置后,使用該命令啟動(dòng):
./frps -c ./frps.ini
在瀏覽器輸入[云服務(wù)器的公網(wǎng)ip]:7500即可訪問到 frp的web管理界面。
注意,可能需要去云服務(wù)器控制臺(tái)配置安全組規(guī)則 開放以上涉及到的端口,否則無法訪問。
本地的深度學(xué)習(xí)服務(wù)器端:
下載相應(yīng)版本的frpc軟件包(跟剛剛一樣的):Releases · fatedier/frp (github.com),這里選amd64的,下好之后解壓到一個(gè)臨時(shí)文件夾。
修改frpc.ini配置文件,內(nèi)容如下:[common] server_addr = xx.xx.xx.xx # 你的云服務(wù)器的公網(wǎng)ip authentication_method = token token = xxxxx # 剛剛配置的frp連接密碼 server_port = 7000 # 剛剛配置的frp服務(wù)端口 [Fusion-ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 20022 [Fusion-rdp] type = tcp local_ip = 127.0.0.1 local_port = 3389 remote_port = 23389
通過上面的腳本就可以把對于云服務(wù)器特定端口的訪問給重定向到本地服務(wù)器的某個(gè)端口了,簡單地講就是:假如我用SSH客戶端訪問[云服務(wù)器ip]:20022,就可以經(jīng)過反向代理直接訪問到[本地的訓(xùn)練服務(wù)器ip]:22;同理需要連接遠(yuǎn)程桌面的話,只需要訪問[云服務(wù)器ip]:23389就可以了。
當(dāng)然你也可以修改腳本添加更多映射~
3. 添加開機(jī)自動(dòng)啟動(dòng)的腳本,新建一個(gè)文件內(nèi)容如下:
文件名/etc/systemd/system/frpc.service,注意修改其中的路徑:
[Fusion] Description=Frp Server Daemon After=syslog.target network.target Wants=network.target [Service] Type=simple ExecStart=/usr/local/bin/frp/frpc -c /usr/local/bin/frp/frpc.ini # 修改為你的frp實(shí)際安裝目錄 ExecStop=/usr/bin/killall frpc #啟動(dòng)失敗1分鐘后再次啟動(dòng) RestartSec=1min KillMode=control-group #重啟控制:總是重啟 Restart=always [Install] WantedBy=multi-user.target
然后執(zhí)行以下命令啟用腳本:
sudo systemctl enable frpc.service sudo systemctl start frpc.service
通過下面的命令查看服務(wù)狀態(tài),如果是running的話就說明可以了:
sudo systemctl status frpc.service
這里順便提一下,按照習(xí)慣一般把上面的frp軟件解壓防止在/usr/local/bin目錄下。Linux 的軟件安裝目錄是也是有講究的,理解這一點(diǎn),在對系統(tǒng)管理是有益的
/usr:系統(tǒng)級的目錄,可以理解為C:/Windows/
/usr/lib:可以理解為C:/Windows/System32
/usr/local:用戶級的程序目錄,可以理解為C:/Progrem Files/,用戶自己編譯的軟件默認(rèn)會(huì)安裝到這個(gè)目錄下
/opt:用戶級的程序目錄,可以理解為D:/Software,opt有可選的意思,這里可以用于放置第三方大型軟件(或游戲),當(dāng)你不需要時(shí),直接rm -rf掉即可。在硬盤容量不夠時(shí),也可將/opt單獨(dú)掛載到其他磁盤上使用
源碼放哪里?
/usr/src:系統(tǒng)級的源碼目錄
/usr/local/src:用戶級的源碼目錄。
2.6 安裝SAMBA服務(wù)
如果能把服務(wù)器上的磁盤直接掛載到我們使用的Windows個(gè)人PC上是不是很爽?
如開頭的視頻里面演示的,可以通過建立局域網(wǎng)SAMBA服務(wù)來實(shí)現(xiàn)這個(gè)效果:
1.安裝samba和samba-common-bin
sudo apt-get install samba samba-common-bin
1.配置/etc/samba/smb.conf文件
sudo nano /etc/samba/smb.conf
在最后一行后面加入:
# 共享文件夾顯示的名稱 [home] # 說明信息 comment = Fusion WorkStation Storage # 可以訪問的用戶 valid users = pengzhihui,root # 共享文件的路徑 path = /home/pengzhihui/ # 可被其他人看到資源名稱(非內(nèi)容) browseable = yes # 可寫 writable = yes # 新建文件的權(quán)限為 664 create mask = 0664 # 新建目錄的權(quán)限為 775 directory mask = 0775
可以把配置文件中你不需要的分享名稱刪除,例如 [homes], [printers] 等。
運(yùn)行這個(gè)命令測試一下配置文件是否有錯(cuò)誤,根據(jù)提示做相應(yīng)修改:testparm
3. 添加登陸賬戶并創(chuàng)建密碼
必須是 linux 已存在的用戶:
sudo smbpasswd -a pi
然后重啟服務(wù)即可:
sudo /etc/init.d/samba-ad-dc restart
接下來可以在Windows的網(wǎng)絡(luò)中發(fā)現(xiàn)設(shè)備了:
但是可能會(huì)出現(xiàn)無法點(diǎn)開的情況,這里需要在Windows的憑據(jù)管理器中添加賬戶信息(開始菜單里搜索憑據(jù)管理器即可打開),點(diǎn)擊添加Windows憑據(jù),輸入你的服務(wù)器名稱和賬戶密碼:
接下來就可以點(diǎn)進(jìn)去看到服務(wù)器上的文件了。為了更加方便地進(jìn)行文件交互,我們添加對應(yīng)的磁盤到Windows資源管理器的此電腦中:
選擇剛剛服務(wù)器的網(wǎng)絡(luò)路徑即可添加:
3. DL開發(fā)環(huán)境配置篇
配置這臺(tái)服務(wù)器的主要作用就是做深度學(xué)習(xí)訓(xùn)練,所以GPU相關(guān)的驅(qū)動(dòng)和環(huán)境時(shí)肯定要安排好的,網(wǎng)上資料很多很雜,這里梳理出了最便捷可靠的安裝方法供大家參考~
3.1 安裝Nvidia顯卡驅(qū)動(dòng)
最簡單的方式是通過系統(tǒng)的軟件與更新來安裝:
進(jìn)入系統(tǒng)的圖形桌面,打開Software & Updates軟件,可以看到標(biāo)簽欄有一個(gè)Additional Drivers:
選擇第一個(gè)安裝Nvidia官方驅(qū)動(dòng)(第二個(gè)是開源驅(qū)動(dòng))即可,根據(jù)網(wǎng)絡(luò)情況稍等大概十分鐘,安裝完重啟服務(wù)器。
重啟完之后更新一下軟件:
sudo apt update sudo apt upgrade
這里會(huì)連帶Nvidia的驅(qū)動(dòng)一起升級一遍,更新到最新的驅(qū)動(dòng);更新完可能會(huì)出現(xiàn)nvidia-smi命令報(bào)錯(cuò),再重啟一下就解決了。
3.2 安裝CUDA
如果之前安裝了舊版本的cuda和cudnn的話,需要先卸載后再安裝:
sudo apt-get remove --purge nvidia*
然后按照前面的方法重新安裝顯卡驅(qū)動(dòng),安裝好了之后開始安裝CUDA:
去官網(wǎng)下載cuda安裝包:CUDA Toolkit 11.0 Download | NVIDIA Developer(https://developer.nvidia.com/cuda-11.0-download-archive),相關(guān)選項(xiàng)如下(根據(jù)實(shí)際情況選擇):
運(yùn)行下面的命令進(jìn)行安裝:
chmod +x cuda_11.0.2_450.51.05_linux.run sudo sh ./cuda_11.0.2_450.51.05_linux.run
可能會(huì)報(bào)一個(gè)警告:
前面已經(jīng)卸載過舊版本了直接Continue就好。然后根據(jù)提示選擇安裝選項(xiàng),注意不要勾選第一個(gè)安裝顯卡驅(qū)動(dòng)的,因?yàn)橹耙呀?jīng)安裝過了。安裝完成后提示
2. 根據(jù)上圖提示需要配置環(huán)境變量:
nano ~/.bashrc
再文件最后加入以下語句:
export CUDA_HOME=/usr/local/cuda-11.0 export LD_LIBRARY_PATH=${CUDA_HOME}/lib64 export PATH=${CUDA_HOME}/bin:${PATH}
然后使其生效:
source ~/.bashrc
3. 可以使用命令nvcc -V查看安裝的版本信息:
也可以編譯一個(gè)程序測試安裝是否成功,執(zhí)行以下幾條命令:
cd ~/Softwares/cuda/NVIDIA_CUDA-11.0_Samples/1_Utilities/deviceQuery make ./deviceQuery
正常的話會(huì)有相應(yīng)輸出,打印顯卡的信息。
3.3 安裝CuDNN
進(jìn)入到CUDNN的下載官網(wǎng):cuDNN Download | NVIDIA Developer(https://developer.nvidia.com/rdp/cudnn-download),然點(diǎn)擊Download開始選擇下載版本,當(dāng)然在下載之前還有登錄,選擇版本界面如下:
我們選擇和之前cuda版本對應(yīng)的cudnn版本:
下載之后是一個(gè)壓縮包,對它進(jìn)行解壓,命令如下:
tar -xzvf cudnn-11.0-linux-x64-v8.0.5.39.tgz
使用以下兩條命令復(fù)制這些文件到CUDA目錄下:
sudo cp cuda/lib64/* /usr/local/cuda-11.0/lib64/ sudo cp cuda/include/* /usr/local/cuda-11.0/include/
拷貝完成之后,可以使用以下命令查看CUDNN的版本信息:
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
可以看到版本信息如下,為8.0.5:
3.4 安裝Conda環(huán)境
不同的訓(xùn)練框架和版本可能會(huì)需要不同的python版本相對應(yīng),而且有的包比如numpy也對版本有要求,所以比較優(yōu)雅的方法是給每個(gè)配置建立一個(gè)虛擬的python環(huán)境,在需要的時(shí)候可以隨時(shí)切換,而不需要的時(shí)候也能刪除不浪費(fèi)磁盤資源,那在這方面conda是做得最好的。
下面介紹怎么安裝conda:
在Anaconda官網(wǎng)下載Linux安裝包:Anaconda | Individual Edition(https://www.anaconda.com/products/individual)
運(yùn)行下面的命令安裝:chmod +x Anaconda3-2020.11-Linux-x86_64.sh ./Anaconda3-2020.11-Linux-x86_64.sh
一路按ENTER確認(rèn),然后根據(jù)提示輸入yes,這里我為了目錄整潔不安裝在默認(rèn)路徑,設(shè)置為下面的路徑:/home/pengzhihui/Softwares/anaconda
然后會(huì)詢問你是否要初始化conda,輸入yes確認(rèn),重開終端窗口之后,就可以看到conda環(huán)境可用了(base代表默認(rèn)環(huán)境):
conda的使用方法網(wǎng)上搜一下有很多,這里就不贅述了。
3.5 安裝Nvidia-Docker
Docker也是虛擬化環(huán)境的神器,前面說的conda雖然可以提供python的虛擬環(huán)境并方便地切換,但是有的時(shí)候我們的開發(fā)環(huán)境并不只是用到python,比如有的native庫需要對應(yīng)gcc版本的編譯環(huán)境,或者進(jìn)行交叉編譯時(shí)喲啊安裝很多工具鏈等等。如果這些操作都在服務(wù)器本地上進(jìn)行,那時(shí)間久了就會(huì)讓服務(wù)器的文件系統(tǒng)非常雜亂,而且還會(huì)遇到各種軟件版本沖突問題。
Docker就可以很好地解決這些問題,它其實(shí)可以理解為就是一個(gè)非常輕量化的虛擬機(jī),我們可以在宿主服務(wù)器上新建很多個(gè)這種被稱為容器的虛擬機(jī),然后在里面配置我們的開發(fā)環(huán)境,且這些配置好的環(huán)境是可以打包成鏡像的,方便隨時(shí)做分享和重用;不需要的時(shí)候,我們直接刪除容器就好了,其資源是和我們的服務(wù)器宿主機(jī)完全隔離的。
Docker的具體使用可以自己搜索一下很多教程,這里主要介紹如何把GPU暴露給Docker的容器(因?yàn)榇蠹叶贾老袷荲Mware這種虛擬機(jī)里面都是無法共享宿主機(jī)的GPU的),是通過nvidia-docker實(shí)現(xiàn)的。
以前為了配置nvidia-docker,需要安裝完docker之后再安裝單獨(dú)的nvidia docker2,而現(xiàn)在只需要安裝nvidia container toolkit即可,更加方便了。
docker安裝 官網(wǎng)上有詳細(xì)的介紹:Install Docker Engine on Ubuntudocs.docker.com(https://docs.docker.com/engine/install/ubuntu/) 或者運(yùn)行下面的命令安裝:sudo apt-get update sudo apt-get install docker.io systemctl start docker systemctl enable docker
可以運(yùn)行這條命令檢查是否安裝成功:
docker version
2. 安裝NVIDIA Container Toolkit
官網(wǎng)安裝步驟:NVIDIA/nvidia-docker: Build and run Docker containers leveraging NVIDIA GPUs (github.com)(https://github.com/NVIDIA/nvidia-docker) 或者直接運(yùn)行下面的命令:
##首先要確保已經(jīng)安裝了nvidia driver # 2. 添加源 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list # 2. 安裝并重啟 sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker
安裝完成后可以新建一個(gè)容器測試一下:
sudo docker run -it --name test_nvidia_docker --gpus all nvidia/cuda:11.1-base
其中最后的參數(shù)nvidia/cuda:11.1-base是Nvidia官方的鏡像,需要根據(jù)工作站主機(jī)中實(shí)際安裝的cuda版本進(jìn)行修改,版本可以用nvcc -V查看。
進(jìn)入容器之后可以跑一下nvidia-smi命令看看:
現(xiàn)在可以在docker里面正常使用GPU啦~
3.6 測試
這里通過一個(gè)簡單的python腳本測試一下GPU訓(xùn)練是否一切正常,跑一個(gè)DL里面的Hello World程序,通過兩種方法測試:本地conda和docker虛擬機(jī)。
以后的開發(fā)過程中一般還是使用Docker的方式來進(jìn)行更為優(yōu)雅。
1. 本地Conda環(huán)境方式:
先用conda新建一個(gè)python3.8+pytorch1.7+cuda11.0的虛擬環(huán)境:
conda create --name python_38-pytorch_1.7.0 python=3.8
創(chuàng)建完成后進(jìn)入環(huán)境:
conda activate python_38-pytorch_1.7.0
檢查一下是否切換到所需環(huán)境了:
which pip
如果看到使用的確實(shí)是我們設(shè)置的環(huán)境目錄中的pip的話說明就ok。
接下來在環(huán)境中安裝pytorch,可以參考官網(wǎng)的安裝命令:Start Locally | PyTorch(https://pytorch.org/get-started/locally/)
輸入以下命令進(jìn)行安裝:
pip install torch==1.7.0+cu110 torchvision==0.8.1+cu110 torchaudio===0.7.0 -f https://download.pytorch.org/whl/torch_stable.html
環(huán)境配置就完成了,下面新建一個(gè)簡單的測試腳本驗(yàn)證功能,新建mnist_train.py,內(nèi)容如下:
import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim import torch.backends.cudnn as cudnn from torchvision import datasets, transforms class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 10, kernel_size=5) self.conv2 = nn.Conv2d(10, 20, kernel_size=5) self.conv2_drop = nn.Dropout2d() self.fc1 = nn.Linear(320, 50) self.fc2 = nn.Linear(50, 10) def forward(self, x): x = F.relu(F.max_pool2d(self.conv1(x), 2)) x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2)) x = x.view(-1, 320) x = F.relu(self.fc1(x)) x = F.dropout(x, training=self.training) x = self.fc2(x) return F.log_softmax(x, dim=1) def train(model, device, train_loader, optimizer, epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = F.nll_loss(output, target) loss.backward() optimizer.step() if batch_idx % 10 == 0: print('Train Epoch: {} [{}/{} ({:.0f}%)] Loss: {:.6f}'.format( epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader), loss.item())) def main(): cudnn.benchmark = True torch.manual_seed(1) device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") print("Using device: {}".format(device)) kwargs = {'num_workers': 1, 'pin_memory': True} train_loader = torch.utils.data.DataLoader( datasets.MNIST('./data', train=True, download=True, transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ])), batch_size=64, shuffle=True, **kwargs) model = Net().to(device) optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5) for epoch in range(1, 11): train(model, device, train_loader, optimizer, epoch) if __name__ == '__main__': main()
運(yùn)行腳本,正常的話就可以看到訓(xùn)練輸出了:
2. Docker環(huán)境方式:
首先還是新建一個(gè)Docker鏡像,運(yùn)行下面的命令:
sudo docker run -it --name train_mnist -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime -v /home/pengzhihui/WorkSpace/_share:/home/workspace/_share --gpus all nvidia/cuda:11.1-base
就進(jìn)入到了帶gpu的ubuntu20.04容器中,效果可以參考文章開頭的視頻。按照前面的配置方法同樣配置好pytorch和其他軟件包,然后運(yùn)行同樣的腳本,也可以得到上述輸出,說明gpu在docker中正常工作。
4. 工作站維護(hù)篇
4.1 工作站系統(tǒng)備份還原
備份
由于Linux本身萬物皆文件的設(shè)計(jì)理念,加上root用戶對幾乎全部的系統(tǒng)文件都有訪問和更改的權(quán)限,因此Linux系統(tǒng)的備份和還原其實(shí)非常簡單,我們直接打包整個(gè)根文件系統(tǒng)就可以了。
我們可以使用tar命令來打包并壓縮文件系統(tǒng),不過這里在打包的過程中需要排除一些不需要文件,或者與新系統(tǒng)文件沖突的文件,包括/tmp、/proc、/lost+found等目錄。
找一個(gè)你想保存?zhèn)浞菸募哪夸洠\(yùn)行下面的命令:
tar -cvpzf ubuntu_backup@`date +%Y-%m+%d`.tar.gz --exclude=/proc --exclude=/tmp --exclude=/boot --exclude=/lost+found --exclude=/media --exclude=/mnt --exclude=/run /
我們會(huì)得到一個(gè)名為backup.tgz的壓縮文件,這個(gè)文件包含我們需要備份的系統(tǒng)的全部內(nèi)容。
2. 還原
如果系統(tǒng)沒有出問題可以正常啟動(dòng)的話,那直接在剛剛的壓縮包找找到想還原的文件替換就好了。而如果系統(tǒng)無法啟動(dòng)了,或者說想換一塊硬盤克隆一樣的系統(tǒng),那么可以按一下步驟操作:
重裝干凈的Ubuntu系統(tǒng)。跟上面介紹的一樣,使用U盤給目標(biāo)磁盤重裝一個(gè)干凈的系統(tǒng),這一步是為了省去自己分配存儲(chǔ)空間和掛載的麻煩,如果你會(huì)自己配置的話那也可以不做這一步。
再次使用U盤進(jìn)入系統(tǒng),這次選擇try ubuntu without installing,然后可以看到掛載好的剛剛安裝了干凈系統(tǒng)的另一個(gè)盤,我們在這里對盤里的根文件系統(tǒng)進(jìn)行一些文件的提?。簊udo su # 在tryUbuntu根目錄下有media文件夾,里面是U盤文件夾和新安裝的系統(tǒng)文件夾,在在里分別用(U盤)和(UBUNTU)表示 cd /media/(U盤) mount -o remount rw ./ # 將新系統(tǒng)根目錄下/boot/grub/grub.cfg文件備份到U盤中 sudo cp /media/(Ubuntu)/boot/grub/grub.cfg ./ # 將新系統(tǒng)根目錄下/etc/fstab文件備份到U盤中,fstab是與系統(tǒng)開機(jī)掛載有關(guān)的文件,grub.cfg是與開機(jī)引導(dǎo)有關(guān)的文件,所以這一步至關(guān)重要 sudo cp /media/(UBUNTU)/etc/fstab ./ # 這一步刪除新裝ubuntu全部的系統(tǒng)文件,有用的fstab及grub.cfg已經(jīng)備份 cd /media/(UBUNTU) sudo rm -rf ./* # 將U盤中backup.tgz復(fù)制到該目錄下并解壓縮 cp /media/(U盤)/backup.tgz ./ sudo tar xvpfz backup.tgz ./ # 創(chuàng)建打包系統(tǒng)時(shí)排除的文件 sudo mkdir proc lost+found mnt sys media
這一步完成后,在用我們在新系統(tǒng)中備份的fatab及grub.cfg文件去替換壓縮包中解壓出來的同名文件,sudo reboot重啟后就發(fā)現(xiàn)系統(tǒng)已經(jīng)恢復(fù)到備份時(shí)的狀態(tài),包括各種框架,環(huán)境,系統(tǒng)設(shè)置~
以上,后面有更新的話還會(huì)繼續(xù)補(bǔ)充,希望對大家有幫助~
責(zé)任編輯:lq
-
芯片
+關(guān)注
關(guān)注
456文章
51037瀏覽量
425449 -
gpu
+關(guān)注
關(guān)注
28文章
4761瀏覽量
129135 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5510瀏覽量
121340
原文標(biāo)題:保姆級教程:個(gè)人深度學(xué)習(xí)工作站配置指南
文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論