作者|呂昱峰
來源 | 知乎
地址 | https://zhuanlan.zhihu.com/p/422462131
本文僅作學術分享,若侵權請聯繫後臺刪文處理
所謂工欲善其事,必先利其器。做深度學習相關的任務,GPU不可或缺,但是等到買了一堆卡,配置好了裸機之後,問題也就接踵而來了。由於是經驗總結,也不避諱什麼,相信下面的情況各個組裡的同學都有遇到過:
實驗室多人混用一個物理機,來個小白裝庫分分鐘給你把環境乃至系統搞崩了;
沒有清晰的存儲區域劃分,/root或者/home/user_name 代碼數據亂放,隨時滿;
多人使用一臺物理機需要搶佔;
實驗室新人不敢讓他碰環境,老人又不想當運維;
有的人愛在終端起任務,有的人愛開notebook寫;
。。。。
環境穩定!環境穩定!環境穩定!重要的事情說三遍!沒有人希望公用的環境時不時的崩了,而且高校基本上不存在運維的人(名義上招進來實際在幹啥相信同學們也知道)。
兼容性好,即可以滿足各種版本的Nvidia-driver+CUDA+框架的組合。為什麼?因為你要復現別人的代碼啊,起碼要跑一下吧,作者能給開源就不錯了,不會給你持續更新,你只能裝人家readme要求的版本。這時候物理機裝著一大堆的環境,不斷升級降級,換誰不崩潰。
升級+維護簡單。理由也很簡單,因為沒有運維。
屏蔽物理機權限(開docker鏡像),誰剛來都可能是小白,但誰也都不希望小白給自己瞎整,甚至給小白擦屁股。
任務式管理。如果遇上需要搶佔顯卡的情況,能夠排隊。相信一起共用物理機的同學都體會過kill和被kill進程的「快感」。
Determined是一家國外創業公司做的集群管理+可視化作業+模型調優一體的解決方案,當然這裡我選擇它的原因主要還是集群管理。從2019年開始我就在各處找合適的方案,期間也用過微軟的OpenPAI,基本能夠滿足上述的1,2,4,5。但是難受就難受在環境依賴一大堆,科學上網只要不穩,升個級要費上好幾天。手動改了一些shell腳本替換成國內源,但是更新了幾個大版本要跟著改,實驗室就我一個人會升級,就很難頂。
下面再說說為什麼Determined是完美解決方案:
安裝只需要一個Python包,pip install一下就OK了。包括升級也是一行搞定,省事。
作業系統隨便apt update/upgrade, nvidia-driver隨便升級最新版,不影響使用。
只有docker本身pull鏡像依賴科學上網。
前面提到的所有GPU管理的需求都能滿足。
說白了,安裝簡單,升級沒限制,用起來舒適。
Determined安裝這裡就事無巨細的把所有的安裝步驟都寫一下,當然官網文檔其實寫的已經很清楚了,先放個連結:
https://docs.determined.ai/latest/sysadmin-deploy-on-prem/index.html
下面開始進行安裝步驟說明:
1. 安裝全新的Ubuntu系統,建議選擇18.04或20.04的長期維護版。
為什麼選擇Ubuntu?CentOS官方已經放棄了,另外apt直裝nvidia-driver非常友好,非要用run包的請繞道。
2. 安裝Docker
這裡給出兩個安裝方式,首先是determined官方給的方式(注意此方式需要科學上網):
sudo apt-get update && sudo apt-get install -y software-properties-commoncurl -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-cesudo systemctl reload dockersudo usermod -aG docker $USER或者:
sudo apt install docker.io3. 安裝nvidia-container-toolkit
用於Docker容器內調用GPU(注意需要科學上網)
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.listsudo apt-get update
sudo apt-get install -y --no-install-recommends nvidia-container-toolkitsudo systemctl restart docker4. 配置docker代理,方便後續pull鏡像能夠順利
創建配置文件目錄和配置文件
sudo mkdir -p /etc/systemd/system/docker.service.dsudo touch /etc/systemd/system/docker.service.d/http-proxy.conf添加HTTP_PROXY環境變量。其中[proxy-addr]和[proxy-port]分別改成實際情況的代理地址和埠:
[Service]Environment="HTTP_PROXY=http://[proxy-addr]:[proxy-port]/"Environment="HTTPS_PROXY=https://[proxy-addr]:[proxy-port]/"更新配置並重啟Docker
systemctl daemon-reloadsystemctl restart docker
最後查看一下是否生效
輸出中包含如圖的HTTP PROXY和HTTPS PROXY即可。
4. 安裝Determined
至此安裝準備工作完成,下面進行集群配置。
先放一個Determined的AWS部署圖,本地部署結構也是類似的:
可以看到Determined集群節點由一個Master和無數個Agent構成,其中Master作為Client訪問入口,即通過網頁、CLI等方式發起請求,通過Master發送到agents進行調度。此外還需要有獨立的存儲位置。
這裡給出一套簡單的集群配置:
Master節點1個,簡單的server,不需要GPU
存儲節點1個,具體空間自定,建議不小於4T(可與Master為同一節點)
Agent節點若干,GPU伺服器,建議將同型號卡分組
萬兆交換機連接,保證網絡存儲速度。
首先將所有節點連接到同一區域網,並按照上面的安裝教程安裝給所有機器安裝依賴環境(Master和存儲節點不需要安裝nvidia相關的內容)
然後啟動Master節點:
det deploy local master-up一般直接啟動即可,web訪問埠為8080,有具體配置需求可以參考詳細配置文檔。
然後配置GPU節點,這裡需要將不同型號的卡進行分組,需要配置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_proxyhttps_proxy: ip_of_proxy這裡主要配置3個內容:
完成後,所有agent節點使用如下命令啟動:
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注意最後的版本號要和安裝的determined版本號對應,一般為最新。
除此之外,還需要講存儲節點進行分布式存儲的配置,一般可以採用NFS或者Ceph,這裡給出NFS的配置教程和Ceph官方文檔,可參考配置,具體步驟不再贅述:
https://docs.ceph.com/en/pacific/
https://ubuntu.com/server/docs/service-nfs
注意:所有Agent掛載存儲到同一位置,如/mnt/data,才能保證任意任務都可以使用同一配置啟動。
Determined主要有兩種使用方式,Web和CLI。其中web可以直接通過Master節點IP:8080進行訪問,具體界面如下:
可以直接通過網頁端創建任務(不推薦)。
這裡詳細介紹CLI的用法,因為網頁端創建任務無法自定義存儲路徑和加載的Docker鏡像,靈活度十分受限。
1. 在終端機安裝determined,pip install determined即可
2. 在環境變量配置MASTER節點IP
nano ~/.bashrc# 添加如下內容:# export DET_MASTER=ip_of_your_master_nodesource ~/.bashrc
3. 使用determined cli創建任務
首先需要登錄:
admin用戶可以管理用戶添加刪除,具體參考用戶管理文檔。
然後寫一個開啟任務的yaml配置文件,這裡給出一個參考:
description: your_task_nameresources: agent_label: rtx3090 slots: 1bind_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
以上涵蓋了開啟任務所需的基本設置,包括:
description: 任務名
resources: 要開啟任務的GPU類型(對應label)和數量(對應slots)
bind_mounts: 掛載分布式存儲到docker容器內,host_path為物理機路徑(這是為什麼我上面讓所有agent設置同一個路徑的原因),container_path為容器內路徑,建議使用/run/determined/workdir/xxx, 因為notebook默認路徑為/run/determined/workdir/這樣進入即可使用。
environment: docker容器的環境配置,包括使用的鏡像和環境變量。
完成後,可以選擇開啟notebook或者cmd終端,這取決於使用者的習慣。
# notebookdet notebook start --config-file config.yaml# shelldet shell start --config-file config.yaml
這裡還有一個比較實用的用法,VSCode配合Shell進行遠程調試,可以參考官網文檔使用:
https://docs.determined.ai/latest/features/commands-and-shells.html#visual-studio-code
安裝和使用都OK之後,部分同學會有自定義Docker鏡像的需求,即修改:
environment: image: determinedai/environments:cuda-11.1-pytorch-1.9-lightning-1.3-tf-2.4-gpu-0.16.3
自定義Docker鏡像可以把自己需要的環境打包,如我個人需要的ROUGE包或者MindSpore環境,均可以通過自定義鏡像完成,後續直接pull自己的鏡像即可。
由於Determined官方其實給出了很多個版本的cuda和框架的組合,這裡先給出連結供大家直接使用:
https://hub.docker.com/r/determinedai/environments/tags
大多數常用的環境都已經打包好,這裡就不多說了。下面說一下自定義鏡像的方法:
1. 克隆官方environments倉庫
git clone https://github.com/determined-ai/environments2. 添加想要安裝的環境相關命令
cd det_dockerfile_scriptstouch 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官方已經給出了非常完整的打包腳本,根據readme修改和運行即可。
實驗室用個GPU不容易,這篇文章不面向新來的小白,主要給老師和管伺服器的師兄師姐們看看。總之用Determined屬於一勞永逸,後續再來新人隨便在Docker容器裡造,也沒多大關係,如果你們還在苦哈哈的一起用同一臺物理機,時不時因為環境崩潰導致人也崩潰了,可以參考一下這篇文章。另外,環境搞不好從來不是research做不下去的理由,現在的調參俠們可能真的連裝環境這種基礎技能都沒有,也能吃大組紅利刷頂會,何其哀哉!大概就這樣吧。
關於我們MLNLP(機器學習算法與自然語言處理) 是由國內外自然語言處理學者聯合構建的民間學術社區,目前已經發展為國內外最大的自然語言處理社區之一,匯聚超過50w訂閱者,旗下包括萬人頂會交流群、AI臻選匯、AI英才匯以及AI學術匯等知名品牌,旨在促進機器學習,自然語言處理學術界、產業界和廣大愛好者之間的進步。社區可以為相關從業者的深造、就業及研究等方面提供開放交流平臺。歡迎大家關注和加入我們。