<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          保姆級教程:個人深度學習工作站配置指南

          共 16689字,需瀏覽 34分鐘

           ·

          2020-12-18 14:30

          作者丨稚暉@知乎(已授權)
          來源丨h(huán)ttps://zhuanlan.zhihu.com/p/336429888

          0 前言

          工作原因一直想配置一臺自己的深度學習工作站服務器,之前自己看完paper想做一些實驗或者復現(xiàn)模型的時候只能用自己的日常PC來跑很麻煩...一方面電腦得裝雙系統(tǒng),干活的時候就不能用作其他用途了;另一方面,即使是沒有使用流程的問題,GTX1080的性能也還是弱了一些,更何況我用的是一個A4迷你機箱,長時間高負載的訓練任務也不太可靠。

          以前在公司的時候還可以用公司的DGX訓練集群做一些實驗,但是我現(xiàn)在的開發(fā)環(huán)境已經(jīng)切換到了昇騰的NPU架構芯片之上了,昇騰平臺算力方面雖然是比肩甚至可以超越英偉達,但是目前暫時很多學術界的生態(tài)都還是基于GPU服務器的(主要是指開源代碼),且我們這兒昇騰服務器對個人也不好買(且買不起),所以有一臺這樣的GPU工作站還是會方便一些。

          那么本文是我在組裝工作站過程中記錄的詳細操作流程,供有類似需求的同學參考~

          首先我們來看一下配置完后最終效果的視頻:

          1. 硬件篇

          1.1 工作站配置選型

          配件全家福

          服務器的配置以個人使用性價比為主,同時考慮到以后的擴展性像是主板和機箱這些配件配置設置一些冗余。首先是CPU平臺的選擇,雖然AMD這兩年實在是香,但是作為生產(chǎn)力工具考慮到軟件庫的兼容性問題,還是決定選擇intel平臺里十代X系列CPU+X299主板,算是比較穩(wěn)的方案,而且某東上CPU搭配主板套裝一起買也性價比也很高。GPU方面今年的30系顯卡都比較良心,使用兩塊3080或者一塊3090都是很給力的,24G的顯存也已經(jīng)跟TITAN RTX持平了(價格卻只要一半)...這里考慮到主板上只能插兩塊PCIEx16的卡,為了以后可能的提升性能還需要再加一塊卡,所以3090是最佳選擇。

          最后選定的配置如下:

          • CPU:i9-10920X
          • 顯卡GPU:七彩虹RTX3090 Advance
          • 內存:芝奇幻光戟16G x 4共64G
          • 主板:華碩X299-DELUXE PRIME
          • 固態(tài)硬盤:1TB西數(shù)NVME SSD + 1TB三星870QVO SATA SSD
          • 機械硬盤:希捷EXOS 12TB氦氣盤
          • 電源:海盜船AX1200i 1200W模組電源
          • 散熱器:海盜船H100X240水冷 + 若干120機箱風扇
          • 機箱:海盜船AIR540 E-ATX機箱

          其中硬盤的設計是這樣的:1T的NVME固態(tài)做系統(tǒng)盤,12T的機械盤作為數(shù)據(jù)集倉庫,另外一個1T SATA固態(tài)作為訓練時的數(shù)據(jù)集緩存,因為IO讀寫速度也是會影響訓練效率的,所以相比于直接從機械盤里面讀取數(shù)據(jù),加一塊SSD做cache效果會好很多。

          1.2 電腦組裝

          總之就是快樂的玩具拼裝過程~

          機箱尺寸比較大,預留的空間非常足所以不會出現(xiàn)像是在裝A4機箱時那種考驗走線和裝配順序的技巧問題;而且服務器嘛,安靜地塞在某個角落就好了,也不用過于考慮什么美觀問題,所以走線就很隨意了:

          這個機箱設計還是很科學的,預留了足夠多的擴展接口比如:2個 3.5寸可快拆盤位、5個2.5寸可快拆盤位、光驅位(用不到,后期改造了)、前后頂部一堆風扇位等等。線材基本都可以塞到機箱的另一個側面,前面板安裝了三個進風風扇,背部安裝了一個出風風扇,水冷的冷排和風扇在頂端。

          這里值得一提的是,正面的光驅位屬于用不上的老古董,所以我改造了一下準備裝一個小型的LCD屏幕上去,這樣偶爾需要進圖形桌面或者BIOS界面的時候,就不用再抱個顯示器插在機箱上了;此外以后也可以寫個軟件把這個屏幕作為系統(tǒng)狀態(tài)監(jiān)視器來使用~

          ↑ 后面會3D打印一個外殼把屏幕固定住。

          這個屏幕也是我前陣子剛設計的,項目已經(jīng)開源了叫做PocketLCD,感興趣的可以去倉庫看看:

          https://github.com/peng-zhihui/PocketLCDgithub.com

          2. 系統(tǒng)篇

          系統(tǒng)選擇DL開發(fā)里面最常用的Ubuntu,最新的穩(wěn)定版本是20.04,安裝過程需要準備一個U盤作為系統(tǒng)啟動盤。

          2.1 安裝Ubuntu 20.04系統(tǒng)

          1. 在官網(wǎng)下載Ubuntu鏡像:Ubuntu 20.04.1 LTS (Focal Fossa)(http://releases.ubuntu.com/20.04/),選擇Desktop Image版本,得到.iso的鏡像文件。
          2. Windows下使用UltraISO工具打開.iso鏡像文件,并將其寫入到一個U盤,得到系統(tǒng)啟動盤:
          1. 將U盤插到服務器上,開機按del鍵(具體什么鍵跟主板型號有關)選擇啟動項進入臨時的Ubuntu系統(tǒng),在圖形界面中選擇Install Ubuntu,所有配置都可以使用默認的,改一下用戶名和密碼即可。這里建議使用英文作為默認語言,省得給自己日后開發(fā)找麻煩哈。

          安裝過程中會聯(lián)網(wǎng)下載一些軟件包更新,可以直接點skip掉,在安裝好系統(tǒng)之后再手動更新也是一樣的。

          1. 進入系統(tǒng)后設置一下root賬戶密碼:
          sudo passwd root

          2.2 配置國內鏡像軟件源

          為了提升后續(xù)安裝軟件時的幸福感,第一步當然先要替換一下軟件源。

          1. 備份原來的源:

          cp /etc/apt/sources.list /etc/apt/sources.list.bak

          2. 將源的內容設置為阿里云鏡像:

          sudo vim /etc/apt/sources.list

          內容改為:

           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)速測試并選擇最佳源的功能。

          2.3 安裝Python和pip

          1. Ubuntu系統(tǒng)默認自帶python,有版本需求的話也可以自己安裝一下(不安裝也行因為后面會安裝conda環(huán)境):
          sudo apt install python3
          sudo apt install python3-pip


          2. 不管是不是自己安裝的python,替換python的pip源建議是一定操作一下的,pip安裝速度會快很多:

          cd ~
          mkdir .pip

          直接新建并編輯pip.conf:

          sudo vim ~/.pip/pip.conf

          改為以下內容(這里用的清華源,也可以試一下阿里、豆瓣等源):

          [global]
          index-url = https://pypi.tuna.tsinghua.edu.cn/simple/
          [install]
          trusted-host = pypi.tuna.tsinghua.edu.cn

          3. 更改默認python版本,python目錄默認鏈接的是python2,而現(xiàn)在基本都是用python3開發(fā)了,每次都輸入python3很麻煩所以這里直接更換默認的python命令鏈接。

          把原來的python軟鏈接刪掉:

          sudo rm /usr/bin/python

          新建一個軟鏈接:

          sudo ln -s /usr/bin/python3 /usr/bin/python
          sudo ln -s /usr/bin/pip3 /usr/bin/pip

          現(xiàn)在輸入python就會進入python3環(huán)境了。

          2.4 配置SSH & 遠程桌面

          純凈安裝的系統(tǒng)里面默認沒有開啟SSH,我們手動安裝一下。

          1. 安裝ssh:
          sudo apt install ssh

          會自動安裝好很多依賴包并啟動服務,完成之后用XShell等軟件就可以SSH登錄服務器了。

          2. 安裝xrdp

          Xrdp 是一個微軟遠程桌面協(xié)議(RDP)的開源實現(xiàn),它允許我們通過圖形界面控制遠程系統(tǒng)。這里使用RDP而不是VNC作為遠程桌面,是因為Windows自帶的遠程桌面連接軟件就可以連接很方便,另外RDP在Windows下的體驗非常好,包括速度很快(因為壓縮方案做得比較好),可以直接在主機和遠程桌面之間復制粘貼等等。

          有的Xwindow軟件是不太兼容xrdp的(比如ubuntu 18.04的默認桌面),但是ubuntu 20.04使用的Gnome是完全ok的。

          安裝過程如下:

          sudo apt install xrdp

          安裝完成xrdp 服務將會自動啟動,可以輸入下面的命令驗證它:

          sudo systemctl status xrdp

          默認情況下,xrdp 使用/etc/ssl/private/ssl-cert-snakeoil.key,它僅僅對ssl-cert用戶組成語可讀,所以需要運行下面的命令,將xrdp用戶添加到這個用戶組:

          sudo adduser xrdp ssl-cert ?
          sudo systemctl restart xrdp

          然后使用Windows自帶的遠程桌面軟件連接服務器IP地址或者域名就行了。

          2.5 安裝frp進行內網(wǎng)穿透

          前面介紹的SSH和遠程桌面都是需要在局域網(wǎng)下通過IP地址進行連接的,而我們配置一臺服務器最重要的訴求,應該是可以隨時隨地去訪問服務器。

          那在家里面,網(wǎng)絡運營商提供的網(wǎng)絡服務通過路由器路由到各個設備,此時路由器會同時具備內網(wǎng)地址(路由器之內,局域網(wǎng),LAN,也就是192.168.x.x)和外網(wǎng)地址(路由器之外,互聯(lián)網(wǎng),WAN)。但是其實這個WAN口的IP并不是真正的“公網(wǎng)IP”,而時經(jīng)過了多層的NAT轉換之后的地址,外網(wǎng)的設備是不能通過這個地址訪問到路由器的。這個問題的原因是ipv4地址池緊張,如果運營商給每家的路由器都安排一個公網(wǎng)ip的話,那ip地址早就不夠用了呀。

          因此為了能讓外網(wǎng)訪問到我們局域網(wǎng)內的設備,就需要跟中國電信等運營商申請公網(wǎng)ip(現(xiàn)在能申請到的概率也已經(jīng)不大了,而且即使申請到也不是所有端口都可以使用的),或者我們自己動手做一些操作來達到同樣的目的。

          有幾種方法:

          • 可以直接用類似花生殼(https://hsk.oray.com/)這樣的DDNS服務平臺做轉發(fā)實現(xiàn)內網(wǎng)穿透,優(yōu)點是比較簡單穩(wěn)定,缺點是需要持續(xù)付費,而且速度和延遲效果一般,而且每加一個端口都要額外付費。
          • 也可以像我一樣使用frp之類的軟件做反向代理來實現(xiàn)內網(wǎng)穿透,這個方案也是需要你有一臺帶公網(wǎng)IP的云服務器的,優(yōu)點就是完全可控,自己想配置多少個端口的穿透都可以,速度跟你的云服務器帶寬有關。

          為什么需要多個端口?是因為不同應用占用的端口不同,比如我們的SSH走的是22號端口,而遠程桌面的rdp走的是3389號端口,如果需要自建Web服務的話則是走80/443端口、想把工作站作為上外網(wǎng)的代理服務器的話會需要1080端口等等...所以用上面第二個方案顯然會方便很多,而且云服務器也不貴,我在騰訊云上購買一年只要200左右。

          下面介紹如何安裝配置frp:

          frp分為frps(server)和frpc(client)兩個包 ,其中前者安裝到我們的云服務器上,后者安裝在需要被外網(wǎng)訪問到的各個設備上,這里就是指我們的深度學習工作站。

          云服務器端:

          https://github.com/fatedier/frp/releases下載適合你服務器系統(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 :

          內容改為:

           [common]
          bind_port = 7000 # frp服務的端口號,可以自己定
          dashboard_port = 7500 # frp的web界面的端口號
          dashboard_user = user # web界面的登陸賬戶,自己修改
          dashboard_pwd = pass # web界面的登陸密碼,自己修改
          authentication_method = token
          token = xxxxx # frp客戶端連接時的密碼,自己修改

          保存配置后,使用該命令啟動:

           ./frps -c ./frps.ini

          在瀏覽器輸入?[云服務器的公網(wǎng)ip]:7500?即可訪問到 frp的web管理界面。

          注意,可能需要去云服務器控制臺配置安全組規(guī)則 開放以上涉及到的端口,否則無法訪問。

          本地的深度學習服務器端:

          1. 下載相應版本的frpc軟件包(跟剛剛一樣的):Releases · fatedier/frp (github.com),這里選amd64的,下好之后解壓到一個臨時文件夾。
          2. 修改frpc.ini配置文件,內容如下:
             [common]
            server_addr = xx.xx.xx.xx # 你的云服務器的公網(wǎng)ip
            authentication_method = token
            token = xxxxx # 剛剛配置的frp連接密碼
            server_port = 7000 # 剛剛配置的frp服務端口

            [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

          通過上面的腳本就可以把對于云服務器特定端口的訪問給重定向到本地服務器的某個端口了,簡單地講就是:假如我用SSH客戶端訪問?[云服務器ip]:20022,就可以經(jīng)過反向代理直接訪問到[本地的訓練服務器ip]:22;同理需要連接遠程桌面的話,只需要訪問[云服務器ip]:23389就可以了。

          當然你也可以修改腳本添加更多映射~

          3. 添加開機自動啟動的腳本,新建一個文件內容如下:

          文件名/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實際安裝目錄
          ExecStop=/usr/bin/killall frpc
          #啟動失敗1分鐘后再次啟動
          RestartSec=1min
          KillMode=control-group
          #重啟控制:總是重啟
          Restart=always

          [Install]
          WantedBy=multi-user.target

          然后執(zhí)行以下命令啟用腳本:

          sudo systemctl enable frpc.service
          sudo systemctl start frpc.service

          通過下面的命令查看服務狀態(tài),如果是running的話就說明可以了:

          sudo systemctl status frpc.service

          這里順便提一下,按照習慣一般把上面的frp軟件解壓防止在/usr/local/bin目錄下。Linux 的軟件安裝目錄是也是有講究的,理解這一點,在對系統(tǒng)管理是有益的

          • /usr:系統(tǒng)級的目錄,可以理解為C:/Windows/
          • /usr/lib:可以理解為C:/Windows/System32
          • /usr/local:用戶級的程序目錄,可以理解為C:/Progrem Files/,用戶自己編譯的軟件默認會安裝到這個目錄下
          • /opt:用戶級的程序目錄,可以理解為D:/Software,opt有可選的意思,這里可以用于放置第三方大型軟件(或游戲),當你不需要時,直接rm -rf掉即可。在硬盤容量不夠時,也可將/opt單獨掛載到其他磁盤上使用

          源碼放哪里?

          • /usr/src:系統(tǒng)級的源碼目錄
          • /usr/local/src:用戶級的源碼目錄。

          2.6 安裝SAMBA服務

          如果能把服務器上的磁盤直接掛載到我們使用的Windows個人PC上是不是很爽?

          如開頭的視頻里面演示的,可以通過建立局域網(wǎng)SAMBA服務來實現(xiàn)這個效果:

          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/
          # 可被其他人看到資源名稱(非內容)
          browseable = yes
          # 可寫
          writable = yes
          # 新建文件的權限為 664
          create mask = 0664
          # 新建目錄的權限為 775
          directory mask = 0775

          可以把配置文件中你不需要的分享名稱刪除,例如 [homes], [printers] 等。

          運行這個命令測試一下配置文件是否有錯誤,根據(jù)提示做相應修改:testparm

          3. 添加登陸賬戶并創(chuàng)建密碼

          必須是 linux 已存在的用戶:

          sudo smbpasswd -a pi

          然后重啟服務即可:

          sudo /etc/init.d/samba-ad-dc restart


          接下來可以在Windows的網(wǎng)絡中發(fā)現(xiàn)設備了:

          但是可能會出現(xiàn)無法點開的情況,這里需要在Windows的憑據(jù)管理器中添加賬戶信息(開始菜單里搜索憑據(jù)管理器即可打開),點擊添加Windows憑據(jù),輸入你的服務器名稱和賬戶密碼:

          接下來就可以點進去看到服務器上的文件了。為了更加方便地進行文件交互,我們添加對應的磁盤到Windows資源管理器的此電腦中:

          選擇剛剛服務器的網(wǎng)絡路徑即可添加:

          3. DL開發(fā)環(huán)境配置篇

          配置這臺服務器的主要作用就是做深度學習訓練,所以GPU相關的驅動和環(huán)境時肯定要安排好的,網(wǎng)上資料很多很雜,這里梳理出了最便捷可靠的安裝方法供大家參考~

          3.1 安裝Nvidia顯卡驅動

          最簡單的方式是通過系統(tǒng)的軟件與更新來安裝:

          1. 進入系統(tǒng)的圖形桌面,打開Software & Updates軟件,可以看到標簽欄有一個Additional Drivers

          選擇第一個安裝Nvidia官方驅動(第二個是開源驅動)即可,根據(jù)網(wǎng)絡情況稍等大概十分鐘,安裝完重啟服務器。

          1. 重啟完之后更新一下軟件:
          sudo apt update
          sudo apt upgrade

          這里會連帶Nvidia的驅動一起升級一遍,更新到最新的驅動;更新完可能會出現(xiàn)nvidia-smi命令報錯,再重啟一下就解決了。

          3.2 安裝CUDA

          如果之前安裝了舊版本的cuda和cudnn的話,需要先卸載后再安裝:

           sudo apt-get remove --purge nvidia*

          然后按照前面的方法重新安裝顯卡驅動,安裝好了之后開始安裝CUDA:

          1. 去官網(wǎng)下載cuda安裝包:CUDA Toolkit 11.0 Download | NVIDIA Developer(https://developer.nvidia.com/cuda-11.0-download-archive),相關選項如下(根據(jù)實際情況選擇):
          1. 運行下面的命令進行安裝:
          chmod +x cuda_11.0.2_450.51.05_linux.run
          sudo sh ./cuda_11.0.2_450.51.05_linux.run

          可能會報一個警告:

          前面已經(jīng)卸載過舊版本了直接Continue就好。然后根據(jù)提示選擇安裝選項,注意不要勾選第一個安裝顯卡驅動的,因為之前已經(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查看安裝的版本信息:

          也可以編譯一個程序測試安裝是否成功,執(zhí)行以下幾條命令:

          cd ~/Softwares/cuda/NVIDIA_CUDA-11.0_Samples/1_Utilities/deviceQuery
          make
          ./deviceQuery

          正常的話會有相應輸出,打印顯卡的信息。

          3.3 安裝CuDNN

          進入到CUDNN的下載官網(wǎng):cuDNN Download | NVIDIA Developer(https://developer.nvidia.com/rdp/cudnn-download),然點擊Download開始選擇下載版本,當然在下載之前還有登錄,選擇版本界面如下:

          我們選擇和之前cuda版本對應的cudnn版本:

          下載之后是一個壓縮包,對它進行解壓,命令如下:

          tar -xzvf cudnn-11.0-linux-x64-v8.0.5.39.tgz

          使用以下兩條命令復制這些文件到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)境

          不同的訓練框架和版本可能會需要不同的python版本相對應,而且有的包比如numpy也對版本有要求,所以比較優(yōu)雅的方法是給每個配置建立一個虛擬的python環(huán)境,在需要的時候可以隨時切換,而不需要的時候也能刪除不浪費磁盤資源,那在這方面conda是做得最好的。

          下面介紹怎么安裝conda:

          1. 在Anaconda官網(wǎng)下載Linux安裝包:Anaconda | Individual Edition(https://www.anaconda.com/products/individual
          2. 運行下面的命令安裝:
            chmod +x Anaconda3-2020.11-Linux-x86_64.sh

            ./Anaconda3-2020.11-Linux-x86_64.sh


          一路按ENTER確認,然后根據(jù)提示輸入yes,這里我為了目錄整潔不安裝在默認路徑,設置為下面的路徑:/home/pengzhihui/Softwares/anaconda

          然后會詢問你是否要初始化conda,輸入yes確認,重開終端窗口之后,就可以看到conda環(huán)境可用了(base代表默認環(huán)境):

          conda的使用方法網(wǎng)上搜一下有很多,這里就不贅述了。

          3.5 安裝Nvidia-Docker

          Docker也是虛擬化環(huán)境的神器,前面說的conda雖然可以提供python的虛擬環(huán)境并方便地切換,但是有的時候我們的開發(fā)環(huán)境并不只是用到python,比如有的native庫需要對應gcc版本的編譯環(huán)境,或者進行交叉編譯時喲啊安裝很多工具鏈等等。如果這些操作都在服務器本地上進行,那時間久了就會讓服務器的文件系統(tǒng)非常雜亂,而且還會遇到各種軟件版本沖突問題。

          Docker就可以很好地解決這些問題,它其實可以理解為就是一個非常輕量化的虛擬機,我們可以在宿主服務器上新建很多個這種被稱為容器的虛擬機,然后在里面配置我們的開發(fā)環(huán)境,且這些配置好的環(huán)境是可以打包成鏡像的,方便隨時做分享和重用;不需要的時候,我們直接刪除容器就好了,其資源是和我們的服務器宿主機完全隔離的。

          Docker的具體使用可以自己搜索一下很多教程,這里主要介紹如何把GPU暴露給Docker的容器(因為大家都知道像是VMware這種虛擬機里面都是無法共享宿主機的GPU的),是通過nvidia-docker實現(xiàn)的。

          以前為了配置nvidia-docker,需要安裝完docker之后再安裝單獨的nvidia docker2,而現(xiàn)在只需要安裝nvidia container toolkit即可,更加方便了。

          1. docker安裝 官網(wǎng)上有詳細的介紹:Install Docker Engine on Ubuntudocs.docker.com(https://docs.docker.com/engine/install/ubuntu/) 或者運行下面的命令安裝:
            sudo apt-get update
            sudo apt-get install docker.io
            systemctl start docker
            systemctl enable docker

            可以運行這條命令檢查是否安裝成功:

            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) 或者直接運行下面的命令:

           ##首先要確保已經(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

          安裝完成后可以新建一個容器測試一下:

          sudo docker run -it --name test_nvidia_docker --gpus all nvidia/cuda:11.1-base

          其中最后的參數(shù)nvidia/cuda:11.1-base?是Nvidia官方的鏡像,需要根據(jù)工作站主機中實際安裝的cuda版本進行修改,版本可以用nvcc \-V查看。

          進入容器之后可以跑一下nvidia-smi命令看看:

          現(xiàn)在可以在docker里面正常使用GPU啦~

          3.6 測試

          這里通過一個簡單的python腳本測試一下GPU訓練是否一切正常,跑一個DL里面的Hello World程序,通過兩種方法測試:本地conda和docker虛擬機。

          以后的開發(fā)過程中一般還是使用Docker的方式來進行更為優(yōu)雅。

          1. 本地Conda環(huán)境方式:

          先用conda新建一個python3.8+pytorch1.7+cuda11.0的虛擬環(huán)境:

          conda create --name python_38-pytorch_1.7.0 python=3.8

          創(chuàng)建完成后進入環(huán)境:

           conda activate python_38-pytorch_1.7.0

          檢查一下是否切換到所需環(huán)境了:

           which pip

          如果看到使用的確實是我們設置的環(huán)境目錄中的pip的話說明就ok。

          接下來在環(huán)境中安裝pytorch,可以參考官網(wǎng)的安裝命令:Start Locally | PyTorch(https://pytorch.org/get-started/locally/

          輸入以下命令進行安裝:

          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)境配置就完成了,下面新建一個簡單的測試腳本驗證功能,新建mnist_train.py,內容如下:

          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}%)]\tLoss: {:.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()


          運行腳本,正常的話就可以看到訓練輸出了:

          2. Docker環(huán)境方式:

          首先還是新建一個Docker鏡像,運行下面的命令:

          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

          就進入到了帶gpu的ubuntu20.04容器中,效果可以參考文章開頭的視頻。按照前面的配置方法同樣配置好pytorch和其他軟件包,然后運行同樣的腳本,也可以得到上述輸出,說明gpu在docker中正常工作。

          4. 工作站維護篇

          4.1 工作站系統(tǒng)備份還原

          1. 備份

          由于Linux本身萬物皆文件的設計理念,加上root用戶對幾乎全部的系統(tǒng)文件都有訪問和更改的權限,因此Linux系統(tǒng)的備份和還原其實非常簡單,我們直接打包整個根文件系統(tǒng)就可以了。

          我們可以使用tar命令來打包并壓縮文件系統(tǒng),不過這里在打包的過程中需要排除一些不需要文件,或者與新系統(tǒng)文件沖突的文件,包括/tmp、/proc/lost+found?等目錄。

          找一個你想保存?zhè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 /

          我們會得到一個名為backup.tgz的壓縮文件,這個文件包含我們需要備份的系統(tǒng)的全部內容。

          2. 還原

          如果系統(tǒng)沒有出問題可以正常啟動的話,那直接在剛剛的壓縮包找找到想還原的文件替換就好了。而如果系統(tǒng)無法啟動了,或者說想換一塊硬盤克隆一樣的系統(tǒng),那么可以按一下步驟操作:

          • 重裝干凈的Ubuntu系統(tǒng)。跟上面介紹的一樣,使用U盤給目標磁盤重裝一個干凈的系統(tǒng),這一步是為了省去自己分配存儲空間和掛載的麻煩,如果你會自己配置的話那也可以不做這一步。
          • 再次使用U盤進入系統(tǒng),這次選擇try ubuntu without installing,然后可以看到掛載好的剛剛安裝了干凈系統(tǒng)的另一個盤,我們在這里對盤里的根文件系統(tǒng)進行一些文件的提?。?/section>
            sudo 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)開機掛載有關的文件,grub.cfg是與開機引導有關的文件,所以這一步至關重要
            sudo cp /media/(UBUNTU)/etc/fstab ./

            # 這一步刪除新裝ubuntu全部的系統(tǒng)文件,有用的fstab及grub.cfg已經(jīng)備份
            cd /media/(UBUNTU)
            sudo rm -rf ./*

            # 將U盤中backup.tgz復制到該目錄下并解壓縮
            cp /media/(U盤)/backup.tgz ./
            sudo tar xvpfz backup.tgz ./

            # 創(chuàng)建打包系統(tǒng)時排除的文件
            sudo mkdir proc lost+found mnt sys media


          這一步完成后,在用我們在新系統(tǒng)中備份的fatabgrub.cfg文件去替換壓縮包中解壓出來的同名文件,sudo reboot重啟后就發(fā)現(xiàn)系統(tǒng)已經(jīng)恢復到備份時的狀態(tài),包括各種框架,環(huán)境,系統(tǒng)設置~


          以上,希望對大家有幫助~


          ·················END·················



          推薦閱讀

          ?? ?川普的退休生活,AI 宅舞很專業(yè)。?? ?清華 CVer 對自監(jiān)督學習的一些思考????帶你「周游世界」的 MODNet 算法?? ?「修煉開始」一文帶你入門深度學習?? ?百年老照片修復算法,那些高顏值的父母!



          瀏覽 49
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产在线国偷精品产拍 | 国产日韩一区二区 | 欧美一级特黄A片免费看视频 | 成人欧美A | 俺来也图片区视频区 |