保姆級(jí)神器,再也不用擔(dān)心搞崩了!
呂昱峰?|?https://zhuanlan.zhihu.com/p/422462131
大家好,我是 Jack。
所謂工欲善其事,必先利其器。
做深度學(xué)習(xí)相關(guān)的任務(wù),GPU 不可或缺,但是等到買了一堆卡,配置好了裸機(jī)之后,問題也就接踵而來了。
由于是經(jīng)驗(yàn)總結(jié),也不避諱什么,相信下面的情況各個(gè)組里的同學(xué)都有遇到過:
實(shí)驗(yàn)室多人混用一個(gè)物理機(jī),來個(gè)小白裝庫分分鐘給你把環(huán)境乃至系統(tǒng)搞崩了; 沒有清晰的存儲(chǔ)區(qū)域劃分,/root或者/home/user_name 代碼數(shù)據(jù)亂放,隨時(shí)滿; 多人使用一臺(tái)物理機(jī)需要搶占; 實(shí)驗(yàn)室新人不敢讓他碰環(huán)境,老人又不想當(dāng)運(yùn)維; 有的人愛在終端起任務(wù),有的人愛開notebook寫; 。。。。
今天,給大家?guī)硪豢钌衿鳎鉀Q這些的痛點(diǎn)!
實(shí)驗(yàn)室GPU管理的需求
環(huán)境穩(wěn)定!環(huán)境穩(wěn)定!環(huán)境穩(wěn)定!重要的事情說三遍!沒有人希望公用的環(huán)境時(shí)不時(shí)的崩了,而且高校基本上不存在運(yùn)維的人(名義上招進(jìn)來實(shí)際在干啥相信同學(xué)們也知道)。 兼容性好,即可以滿足各種版本的Nvidia-driver+CUDA+框架的組合。為什么?因?yàn)槟阋獜?fù)現(xiàn)別人的代碼啊,起碼要跑一下吧,作者能給開源就不錯(cuò)了,不會(huì)給你持續(xù)更新,你只能裝人家readme要求的版本。這時(shí)候物理機(jī)裝著一大堆的環(huán)境,不斷升級(jí)降級(jí),換誰不崩潰。 升級(jí)+維護(hù)簡(jiǎn)單。理由也很簡(jiǎn)單,因?yàn)闆]有運(yùn)維。 屏蔽物理機(jī)權(quán)限(開docker鏡像),誰剛來都可能是小白,但誰也都不希望小白給自己瞎整,甚至給小白擦屁股。 任務(wù)式管理。如果遇上需要搶占顯卡的情況,能夠排隊(duì)。相信一起共用物理機(jī)的同學(xué)都體會(huì)過kill和被kill進(jìn)程的“快感”。
Determined——完美的解決方案
Determined是一家國外創(chuàng)業(yè)公司做的集群管理+可視化作業(yè)+模型調(diào)優(yōu)一體的解決方案,當(dāng)然這里我選擇它的原因主要還是集群管理。從2019年開始我就在各處找合適的方案,期間也用過微軟的OpenPAI,基本能夠滿足上述的1,2,4,5。但是難受就難受在環(huán)境依賴一大堆,科學(xué)上網(wǎng)只要不穩(wěn),升個(gè)級(jí)要費(fèi)上好幾天。手動(dòng)改了一些shell腳本替換成國內(nèi)源,但是更新了幾個(gè)大版本要跟著改,實(shí)驗(yàn)室就我一個(gè)人會(huì)升級(jí),就很難頂。
下面再說說為什么Determined是完美解決方案:
安裝只需要一個(gè)Python包,pip install一下就OK了。包括升級(jí)也是一行搞定,省事。 操作系統(tǒng)隨便apt update/upgrade, nvidia-driver隨便升級(jí)最新版,不影響使用。 只有docker本身pull鏡像依賴科學(xué)上網(wǎng)。 前面提到的所有GPU管理的需求都能滿足。
說白了,安裝簡(jiǎn)單,升級(jí)沒限制,用起來舒適。
Determined安裝
這里就事無巨細(xì)的把所有的安裝步驟都寫一下,當(dāng)然官網(wǎng)文檔其實(shí)寫的已經(jīng)很清楚了,先放個(gè)鏈接:
https://docs.determined.ai/latest/sysadmin-deploy-on-prem/index.html
下面開始進(jìn)行安裝步驟說明:
1. 安裝全新的Ubuntu系統(tǒng),建議選擇18.04或20.04的長(zhǎng)期維護(hù)版。
為什么選擇Ubuntu?CentOS官方已經(jīng)放棄了,另外apt直裝nvidia-driver非常友好,非要用run包的請(qǐng)繞道。
2. 安裝Docker
這里給出兩個(gè)安裝方式,首先是determined官方給的方式(注意此方式需要科學(xué)上網(wǎng)):
sudo?apt-get?update?&&?sudo?apt-get?install?-y?software-properties-common
curl?-fsSL?https://download.docker.com/linux/ubuntu/gpg?|?sudo?apt-key?add?-
sudo?add-apt-repository?"deb?[arch=amd64]?https://download.docker.com/linux/ubuntu?$(lsb_release?-cs)?stable"
sudo?apt-get?update?&&?sudo?apt-get?install?-y?--no-install-recommends?docker-ce
sudo?systemctl?reload?docker
sudo?usermod?-aG?docker?$USER
或者:
sudo?apt?install?docker.io
3. 安裝nvidia-container-toolkit
用于Docker容器內(nèi)調(diào)用GPU(注意需要科學(xué)上網(wǎng))
curl?-fsSL?https://nvidia.github.io/nvidia-docker/gpgkey?|?sudo?apt-key?add?-
distribution=$(.?/etc/os-release;echo?$ID$VERSION_ID)
curl?-s?-L?https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list?|?sudo?tee?/etc/apt/sources.list.d/nvidia-docker.list
sudo?apt-get?update
sudo?apt-get?install?-y?--no-install-recommends?nvidia-container-toolkit
sudo?systemctl?restart?docker
4. 配置docker代理,方便后續(xù)pull鏡像能夠順利
創(chuàng)建配置文件目錄和配置文件
sudo?mkdir?-p?/etc/systemd/system/docker.service.d
sudo?touch?/etc/systemd/system/docker.service.d/http-proxy.conf
添加HTTP_PROXY環(huán)境變量。其中[proxy-addr]和[proxy-port]分別改成實(shí)際情況的代理地址和端口:
[Service]
Environment="HTTP_PROXY=http://[proxy-addr]:[proxy-port]/"
Environment="HTTPS_PROXY=https://[proxy-addr]:[proxy-port]/"
更新配置并重啟Docker
systemctl?daemon-reload
systemctl?restart?docker
最后查看一下是否生效
docker?info
輸出中包含如圖的HTTP PROXY和HTTPS PROXY即可。
5. 安裝Determined
pip?install?determined
至此安裝準(zhǔn)備工作完成,下面進(jìn)行集群配置。
Determined集群配置
先放一個(gè)Determined的AWS部署圖,本地部署結(jié)構(gòu)也是類似的:
可以看到Determined集群節(jié)點(diǎn)由一個(gè)Master和無數(shù)個(gè)Agent構(gòu)成,其中Master作為Client訪問入口,即通過網(wǎng)頁、CLI等方式發(fā)起請(qǐng)求,通過Master發(fā)送到agents進(jìn)行調(diào)度。此外還需要有獨(dú)立的存儲(chǔ)位置。
這里給出一套簡(jiǎn)單的集群配置:
Master節(jié)點(diǎn)1個(gè),簡(jiǎn)單的server,不需要GPU 存儲(chǔ)節(jié)點(diǎn)1個(gè),具體空間自定,建議不小于4T(可與Master為同一節(jié)點(diǎn)) Agent節(jié)點(diǎn)若干,GPU服務(wù)器,建議將同型號(hào)卡分組 萬兆交換機(jī)連接,保證網(wǎng)絡(luò)存儲(chǔ)速度。
首先將所有節(jié)點(diǎn)連接到同一局域網(wǎng),并按照上面的安裝教程安裝給所有機(jī)器安裝依賴環(huán)境(Master和存儲(chǔ)節(jié)點(diǎn)不需要安裝nvidia相關(guān)的內(nèi)容)
然后啟動(dòng)Master節(jié)點(diǎn):
det?deploy?local?master-up
一般直接啟動(dòng)即可,web訪問端口為8080,有具體配置需求可以參考詳細(xì)配置文檔。
然后配置GPU節(jié)點(diǎn),這里需要將不同型號(hào)的卡進(jìn)行分組,需要配置yaml文件:
##?The?hostname?or?IP?address?of?the?Determined?master.
master_host:?ip_of_your_master_node
##?The?port?of?the?Determined?master.
master_port:?8080
##?The?ID?of?this?agent;?defaults?to?the?hostname?of?the?current?machine.?Agent?IDs?must?be?unique
##?within?a?cluster.
agent_id:?rtx3090_0
##?The?label?of?this?agent.?Agents?with?labels?may?only?run?workloads?with?the
##?corresponding?label.
label:?rtx3090
##?The?GPUs?that?should?be?exposed?as?slots?by?the?agent.?A?comma-separated?list?of?GPUs,
##?each?specified?by?a?0-based?index,?UUID,?PCI?bus?ID,?or?board?serial?number.
http_proxy:?ip_of_proxy
https_proxy:?ip_of_proxy
這里主要配置3個(gè)內(nèi)容:
Master節(jié)點(diǎn),用于識(shí)別Master節(jié)點(diǎn) agent_id和label,分別對(duì)應(yīng)本機(jī)id和組名,根據(jù)顯卡型號(hào)命名即可 科學(xué)上網(wǎng)代理
完成后,所有agent節(jié)點(diǎn)使用如下命令啟動(dòng):
docker?run?--gpus?all?-v?/var/run/docker.sock:/var/run/docker.sock?-v?"$PWD"/agent-config.yaml:/etc/determined/agent.yaml?determinedai/determined-agent:0.15.6
注意最后的版本號(hào)要和安裝的determined版本號(hào)對(duì)應(yīng),一般為最新。
除此之外,還需要講存儲(chǔ)節(jié)點(diǎn)進(jìn)行分布式存儲(chǔ)的配置,一般可以采用NFS或者Ceph,這里給出NFS的配置教程和Ceph官方文檔,可參考配置,具體步驟不再贅述:
https://docs.ceph.com/en/pacific/ https://ubuntu.com/server/docs/service-nfs
注意:所有Agent掛載存儲(chǔ)到同一位置,如/mnt/data,才能保證任意任務(wù)都可以使用同一配置啟動(dòng)。
使用Determined
Determined主要有兩種使用方式,Web和CLI。其中web可以直接通過Master節(jié)點(diǎn)IP:8080進(jìn)行訪問,具體界面如下:
可以直接通過網(wǎng)頁端創(chuàng)建任務(wù)(不推薦)。
這里詳細(xì)介紹CLI的用法,因?yàn)榫W(wǎng)頁端創(chuàng)建任務(wù)無法自定義存儲(chǔ)路徑和加載的Docker鏡像,靈活度十分受限。
在終端機(jī)安裝determined,pip install determined即可 在環(huán)境變量配置MASTER節(jié)點(diǎn)IP
nano?~/.bashrc
#?添加如下內(nèi)容:
#?export?DET_MASTER=ip_of_your_master_node
source?~/.bashrc
使用determined cli創(chuàng)建任務(wù)
首先需要登錄:
det?user?login
#?輸入賬號(hào)密碼即可
admin用戶可以管理用戶添加刪除,具體參考用戶管理文檔。
然后寫一個(gè)開啟任務(wù)的yaml配置文件,這里給出一個(gè)參考:
description:?your_task_name
resources:
??agent_label:?rtx3090
??slots:?1
bind_mounts:
??-?host_path:?/mnt/dl/lvyufeng/
????container_path:?/run/determined/workdir/lv/
environment:
??image:?determinedai/environments:cuda-11.1-pytorch-1.9-lightning-1.3-tf-2.4-gpu-0.16.3
??environment_variables:
??-?http_proxy=your_proxy
??-?https_proxy=your_proxy
以上涵蓋了開啟任務(wù)所需的基本設(shè)置,包括:
description: 任務(wù)名 resources: 要開啟任務(wù)的GPU類型(對(duì)應(yīng)label)和數(shù)量(對(duì)應(yīng)slots) bind_mounts: 掛載分布式存儲(chǔ)到docker容器內(nèi),host_path為物理機(jī)路徑(這是為什么我上面讓所有agent設(shè)置同一個(gè)路徑的原因),container_path為容器內(nèi)路徑,建議使用/run/determined/workdir/xxx, 因?yàn)閚otebook默認(rèn)路徑為/run/determined/workdir/這樣進(jìn)入即可使用。 environment: docker容器的環(huán)境配置,包括使用的鏡像和環(huán)境變量。
完成后,可以選擇開啟notebook或者cmd終端,這取決于使用者的習(xí)慣。
#?notebook
det?notebook?start?--config-file?config.yaml
#?shell
det?shell?start?--config-file?config.yaml
這里還有一個(gè)比較實(shí)用的用法,VSCode配合Shell進(jìn)行遠(yuǎn)程調(diào)試,可以參考官網(wǎng)文檔使用:
https://docs.determined.ai/latest/features/commands-and-shells.html#visual-studio-code
自定義Docker鏡像
安裝和使用都OK之后,部分同學(xué)會(huì)有自定義Docker鏡像的需求,即修改:
environment:
??image:?determinedai/environments:cuda-11.1-pytorch-1.9-lightning-1.3-tf-2.4-gpu-0.16.3
自定義Docker鏡像可以把自己需要的環(huán)境打包,如我個(gè)人需要的ROUGE包或者M(jìn)indSpore環(huán)境,均可以通過自定義鏡像完成,后續(xù)直接pull自己的鏡像即可。
由于Determined官方其實(shí)給出了很多個(gè)版本的cuda和框架的組合,這里先給出鏈接供大家直接使用:
https://hub.docker.com/r/determinedai/environments/tags
大多數(shù)常用的環(huán)境都已經(jīng)打包好,這里就不多說了。下面說一下自定義鏡像的方法:
1. 克隆官方environments倉庫
git?clone?https://github.com/determined-ai/environments
2. 添加想要安裝的環(huán)境相關(guān)命令
cd?det_dockerfile_scripts
touch?your_script.sh
#?add?install?instructions?to?your_script.sh
3. 修改Dockerfile
nano?Dockerfile-base-gpu
#?add?`RUN?/tmp/det_dockerfile_scripts/your_script.sh`
4. 參考Makefile里的命令打包Docker鏡像,然后上傳到dockerhub
這里不給出Docker鏡像打包的教程,如有需求可以自行搜索,determined官方已經(jīng)給出了非常完整的打包腳本,根據(jù)readme修改和運(yùn)行即可。
結(jié)語
實(shí)驗(yàn)室用個(gè)GPU不容易,總之用Determined屬于一勞永逸,后續(xù)再來新人隨便在Docker容器里造,也沒多大關(guān)系,如果你們還在苦哈哈的一起用同一臺(tái)物理機(jī),時(shí)不時(shí)因?yàn)榄h(huán)境崩潰導(dǎo)致人也崩潰了。
另外,環(huán)境搞不好從來不是research做不下去的理由,現(xiàn)在的調(diào)參俠們可能真的連裝環(huán)境這種基礎(chǔ)技能都沒有,也能吃大組紅利刷頂會(huì),何其哀哉!大概就這樣吧。

推薦閱讀
?? ?我家小孩,長(zhǎng)這樣??? ?獲獎(jiǎng)了!????我,從高考到程序員的成長(zhǎng)之路
