MXNet结合kubeflow进行分布式训练
GPU集群配置MXNet+CUDA
為方便控制集群,寫了腳本cmd2all.sh
#!/bin/bash if [ $# -lt 3 ]; thenecho "usage: $0 [type cmds hosts]"echo "for example: ./cmd2all.sh \"cmds\" \"touch t1.txt\" \"gpu1 gpu2\""echo "for example: ./cmd2all.sh \"path\" \"/home/gbxu/CUDA/" \"gpu1 gpu2\""exit -1; fi type=$1 # "cmds" cmds_or_path=$2 # "touch test.txt" #hosts=$3 hosts=(gpu10 gpu11 gpu12 gpu13 gpu14 gpu15 gpu16 gpu17 gpu18) if [$type == "cmds"] thenfor host in ${hosts[@]}dossh $host nohup $cmds_or_path &done fiif [$type == "path"] thenfor host in ${hosts[@]}donohup scp -r $cmds_or_path $host:~/ &done fi使用virtualenv
如果是python3的環(huán)境,需要virtualenv -p /usr/bin/python3 mxnetGPU
使用virtualenv,創(chuàng)建新的virtualenv,并修改.bashrc,使得在每次進(jìn)入終端時(shí)activate虛擬環(huán)境(方便后期分布式運(yùn)行)
嘗試在gpu10安裝
Install NVIDIA Driver
本身已有驅(qū)動(dòng)則該操作不必要。
lspci | grep -i nvidia #查看設(shè)備 modinfo nvidia #查看驅(qū)動(dòng) sudo yum -y remove nvidia-* sudo sh NVIDIA-Linux-x86_64-390.25.run #安裝驅(qū)動(dòng)Install CUDA:
see documents:
- offline安裝,online版本可能出現(xiàn)依賴缺失。
- 所有版本
CUDA是NVIDIA推出的用于自家GPU的并行計(jì)算框架,只有當(dāng)要解決的計(jì)算問(wèn)題是可以大量并行計(jì)算的時(shí)候才能發(fā)揮CUDA的作用。
下載: 見offline安裝
gpu10利用yum local的安裝出現(xiàn)問(wèn)題,后來(lái)下載cuda_9.2.148_396.37_linux.run
sudo sh cuda_9.2.148_396.37_linux.run安裝
并且在安裝(or not, just try)時(shí)同意nvidia驅(qū)動(dòng),并且一路yes和default。
or, add /usr/local/cuda-9.2/lib64 to /etc/ld.so.conf and run ldconfig as root
添加CUDA環(huán)境變量
# export LD_LIBRARY_PATH=/usr/local/cuda/lib64/:$LD_LIBRARY_PATH echo -e "export LD_LIBRARY_PATH=/usr/local/cuda/lib64/:\$LD_LIBRARY_PATH" >> .bashrc # export PATH=$PATH:/usr/local/cuda/bin echo -e "export PATH=\$PATH:/usr/local/cuda/bin" >> .bashrc測(cè)試CUDA
nvcc -V nvidia-smi cd /home/gbxu/NVIDIA_CUDA-9.2_Samples/1_Utilities/deviceQuery make ./deviceQuery # 結(jié)果pass則安裝成功Install cuDNN:
see documents
cuDNN(CUDA Deep Neural Network library):是NVIDIA打造的針對(duì)深度神經(jīng)網(wǎng)絡(luò)的加速庫(kù),是一個(gè)用于深層神經(jīng)網(wǎng)絡(luò)的GPU加速庫(kù)。如果你要用GPU訓(xùn)練模型,cuDNN不是必須的,但是一般會(huì)采用這個(gè)加速庫(kù)。
安裝Prerequisites
see documents
sudo yum -y install build-essential git lapack-devel openblas-devel opencv-devel atlas-develcomplie MXNet
see:documents
git clone --recursive https://github.com/apache/incubator-mxnet.git cd incubator-mxnet make clean_all make -j $(nproc) USE_OPENCV=1 USE_BLAS=openblas USE_CUDA=1 USE_CUDA_PATH=/usr/local/cuda USE_CUDNN=1 USE_DIST_KVSTORE=1 USE_PROFILER=1install MXNet in python
cd python pip uninstall -y mxnet pip install -e .test MXNet in python
python >>> import mxnet as mx >>> a = mx.nd.zeros((2,3), mx.gpu())install python lib
請(qǐng)根據(jù)最后運(yùn)行MXNet任務(wù)時(shí)查缺補(bǔ)漏
pip install numpy requests預(yù)設(shè)編譯參數(shù)
cd到源代碼主目錄,在makefile文件中預(yù)設(shè)編譯參數(shù),
# vim incubator-mxnet/Makefile cmpl:make -j $(nproc) USE_OPENCV=1 USE_BLAS=openblas USE_DIST_KVSTORE=1cmplgpu:make -j $(nproc) USE_OPENCV=1 USE_BLAS=openblas USE_DIST_KVSTORE=1 USE_CUDA=1 USE_CUDA_PATH=/usr/local/cuda USE_CUDNN=1之后使用make指令編譯更為便捷。
make cmplgpu批量安裝環(huán)境
在gpu11-gpu18批量安裝環(huán)境
先用1.sh將數(shù)據(jù)傳到nodes,
- 1.sh
再用2.sh在各nodes運(yùn)行scripts_in_nodes.sh腳本即可。
- 2.sh
- scripts_in_nodes.sh
編譯、安裝MXNet
之后只需在一臺(tái)host上編譯mxnet即可,余下用MXNet的同步機(jī)制即可。
在gpu10上啟動(dòng)訓(xùn)練
- 需要加庫(kù)文件放到同步的文件夾下:
- 然后執(zhí)行命令,該命令會(huì)同步文件夾cluster上啟動(dòng)8個(gè)worker,1個(gè)server
ENJOY
- multiple machines each containing multiple GPUs 的訓(xùn)練見docs
- 其中 dist_sync_device 替代 dist_sync。因?yàn)閏luster為多GPU,見docs
- mxnet-make-install-test.sh
?
?
MXNet 以數(shù)據(jù)并行的方式進(jìn)行單機(jī)多卡訓(xùn)練
?
MXNet 支持在多 CPU 和 GPU 上進(jìn)行訓(xùn)練。其中,這些 CPU 和 GPU 可以分布在不同的服務(wù)器上。
?
一臺(tái) GPU 機(jī)器上的每塊 GPU 都有自己的編號(hào)(編號(hào)從 0 開始計(jì)數(shù))。如果想使用某一塊特定的 GPU 卡,即可以在代碼中直接指定 context(ctx); 也可以在命令行中傳遞參數(shù)–gpus。
?
例如: 如果想在 python 中使用 GPU 0 和 GPU 2,可以使用下面的代碼創(chuàng)建網(wǎng)絡(luò)模型。
?
?
如果多個(gè) GPU 的計(jì)算能力不同,那么可以根據(jù)它們的計(jì)算性能來(lái)劃分工作負(fù)載。比如,如果 GPU 0 是 GPU 2 性能的 3 倍,那么可以提供一個(gè)額外的負(fù)載選項(xiàng) work_load_list=[3, 1]。
?
如果所有其它超參都相同,在多個(gè) GPU 上訓(xùn)練結(jié)果應(yīng)該和單 GPU 上的訓(xùn)練結(jié)果相同。但在實(shí)際應(yīng)用中,由于隨機(jī)存取(隨機(jī)順序或其它 augmentations),使用不同的種子初始化權(quán)重和 CuDNN,結(jié)果可能不同。
?
我們可以控制梯度聚合和模型更新(如執(zhí)行,訓(xùn)練過(guò)程)的位置,通過(guò)創(chuàng)建不同的 KVStore(數(shù)據(jù)通信模塊)。即可以使用 mx.kvstore.create(type)來(lái)創(chuàng)建一個(gè)實(shí)例,也可以使用程序的參數(shù)–kv-store type 來(lái)實(shí)現(xiàn)功能。
?
兩種常用功能
?
-
local: 所有的梯度都拷貝到CPU內(nèi)存完成聚合,同時(shí)在CPU內(nèi)存上完成權(quán)值的更新并拷貝回每個(gè)GPUworker。這種方式主要在于CPU與GPU,主要的性能負(fù)載在于CPU拷貝的負(fù)載。
-
device: 梯度聚合和權(quán)值更新都在GPU上完成。GPU之間的如果支持Peer to Peer通信(PCIe or NVLink),將避免CPU拷貝的負(fù)載,可以大大減輕CPU的負(fù)擔(dān),僅受限于通信帶寬。PCIe 與NVLink通信帶寬不同,NVLink具備告訴的Peer to Peer通信帶寬。
?
注意: 如果有大量的 GPU(比如: >=4),建議使用 device 能獲取更好的性能。
?
MXNet 以數(shù)據(jù)并行的方式進(jìn)行多機(jī)多卡訓(xùn)練
?
在介紹 MXNet 分布式訓(xùn)練之前,先介紹幾個(gè)關(guān)鍵性的概念方便理解 MXNet 的分布式訓(xùn)練:
?
三種進(jìn)程類型
?
-
Worker: worker進(jìn)程會(huì)對(duì)每一批次(batch_size)的數(shù)據(jù)樣本進(jìn)行訓(xùn)練。對(duì)批數(shù)據(jù)進(jìn)行處理之前,workers會(huì)從servers服務(wù)器pull權(quán)重。對(duì)批處理數(shù)據(jù)處理完畢之后workers會(huì)聚合梯度數(shù)據(jù)發(fā)送給servers。(如果訓(xùn)練模型的工作負(fù)載比較高,建議最好不要把worker和server運(yùn)行在相同的機(jī)器上)。
-
Server: 可以運(yùn)行多個(gè)server服務(wù)進(jìn)程,用于存儲(chǔ)模型參數(shù)并與worker進(jìn)行通訊。
-
Scheduler: 一個(gè)調(diào)度器,在集群中負(fù)責(zé)調(diào)度的角色。主要包含: 等待各個(gè)node節(jié)點(diǎn)數(shù)據(jù)的上報(bào)數(shù)據(jù)并讓各個(gè)node節(jié)點(diǎn)知道彼此的存在并互相通訊。
?
進(jìn)程之間的關(guān)系如下圖所示:
?
?
工作流程:
?
1.worker, server 向 scheduler 注冊(cè),獲取相關(guān)的信息。
?
2.worker 從 server 端 pull 參數(shù) w。
?
3.worker 基于參數(shù) w 和數(shù)據(jù)計(jì)算梯度,然后 push 梯度到 server。
?
4.server 更新參數(shù) w。
?
5.反復(fù)執(zhí)行 2-4 過(guò)程。
?
KVStore
?
KVStore 是 MXNet 提供的一個(gè)分布式 key-value 存儲(chǔ),用來(lái)進(jìn)行數(shù)據(jù)交換。KVStore 本質(zhì)的實(shí)現(xiàn)是基于參數(shù)服務(wù)器。
?
-
通過(guò)引擎來(lái)管理數(shù)據(jù)一致性,這使得參數(shù)服務(wù)器的實(shí)現(xiàn)變得簡(jiǎn)單,同時(shí)使得KVStore的運(yùn)算可以無(wú)縫的與其他部分結(jié)合在一起。
-
使用兩層的通訊結(jié)構(gòu),原理如下圖所示。第一層的服務(wù)器管理單機(jī)內(nèi)部的多個(gè)設(shè)備之前的通訊。第二層服務(wù)器則管理機(jī)器之間通過(guò)網(wǎng)絡(luò)的通訊。第一層的服務(wù)器在與第二層通訊前可能合并設(shè)備之間的數(shù)據(jù)來(lái)降低網(wǎng)絡(luò)帶寬消費(fèi)。同時(shí)考慮到機(jī)器內(nèi)和外通訊帶寬和延時(shí)的不同性,可以對(duì)其使用不同的一致性模型。例如第一層用強(qiáng)的一致性模型,而第二層則使用弱的一致性模型來(lái)減少同步開銷。
?
?
通過(guò)調(diào)用 mxnet.kvstore.create()函數(shù)并傳遞 dist 關(guān)鍵字參數(shù)來(lái)開啟分布式訓(xùn)練的 KVStore 模式:
?
?kv = mxnet.kvstore.create(‘dist_sync’)
?
復(fù)制代碼
?
分布式訓(xùn)練模式
?
當(dāng) KVStore 被創(chuàng)建并且包含 dist 關(guān)鍵參數(shù)就會(huì)開啟分布式訓(xùn)練模式。通過(guò)使用不同類型的 KVStore,可以啟用不同的分布式培訓(xùn)模式。具體如下:
?
-
dist_sync: 已同步的方式進(jìn)行分布式訓(xùn)練,在處理每批次(batch)的數(shù)據(jù)時(shí),所有的workers需要使用相同的模型參數(shù)集合。這意味著servers參數(shù)服務(wù)需要接收來(lái)自所有workers模型參數(shù)之后,才能進(jìn)行下一個(gè)批次數(shù)據(jù)的處理。因此在使用這種分布式訓(xùn)練方式時(shí),server參數(shù)服務(wù)需要等到所有的worker處理完畢之后,并且如果其中的某一個(gè)worker異常,會(huì)導(dǎo)致整個(gè)訓(xùn)練的過(guò)程halts。
-
dist_async: 已異步的方式進(jìn)行分布式訓(xùn)練,server參數(shù)服務(wù)只要收到worker的計(jì)算梯度就會(huì)立即更新存儲(chǔ)。這意味著哪個(gè)worker處理完當(dāng)前的批次數(shù)據(jù),就可以繼續(xù)下一批次數(shù)據(jù)的處理。因此該種方式的分布式訓(xùn)練方式比dist_sync要快,但是需要花費(fèi)更多的epochs去收斂。
-
dist_sync_device: 該分布式訓(xùn)練模式與dist_sync訓(xùn)練模式相同,只是dist_sync_device模式會(huì)在多GPUs上進(jìn)行梯度聚合和更新權(quán)重,而dist_sync是在CPU上進(jìn)行這些操作。這種模式比dist_sync要快,因?yàn)镚PU和CPU之前的通信,但是會(huì)占用更多的GPU顯存。
-
dist_async_device: 該模式和dist_sync_device類似,但是是已異步的方式進(jìn)行的。
?
開啟分布式訓(xùn)練
?
MXNet 為了用戶方便的進(jìn)行分布式訓(xùn)練提供了一個(gè) tools/launch.py 腳本。并且支持對(duì)多種類型的集群資源進(jìn)行管理,如: ssh,mpirun,yarn,sge。
?
?
如上圖所示,將代碼 clone 到本地后,進(jìn)入 gluon 目錄,使用 image_classification.py 和 CIFAR10 數(shù)據(jù)集來(lái)對(duì) VGG11 模型進(jìn)行分布式訓(xùn)練。
?
雖然 MXNet 實(shí)現(xiàn)了多機(jī)多卡的分布式訓(xùn)練,但是在資源隔離,資源調(diào)度,資源限制以及大規(guī)模訓(xùn)練時(shí)數(shù)據(jù)共享都是不能滿足需求的,所以接下來(lái)介紹下 MXNet 基于 Kubeflow 的大規(guī)模分布式訓(xùn)練。
?
MXNet 結(jié)合 kubeflow 進(jìn)行分布式訓(xùn)練
?
在將 MXNet 結(jié)合 kubeflow 進(jìn)行分布式訓(xùn)練之前,首先需要安裝 kubeflow 環(huán)境之前已經(jīng)介紹了,這里就不在詳細(xì)說(shuō)明了。當(dāng) kubeflow 基礎(chǔ)環(huán)境部署完成之后,需要針對(duì) MXNet 安裝 mxnet-operator。
?
安裝 mxnet-operator
?
?
安裝完成后,執(zhí)行以下命令,檢驗(yàn) mxnet 是否安裝成功:
?
?kubectl get crd
?
復(fù)制代碼
?
輸出如下內(nèi)容代表 mxnet-operator 安裝成功:
?
?
基于 kubeflow 測(cè)試 MXNet 分布式訓(xùn)練
?
1 準(zhǔn)備測(cè)試的訓(xùn)練鏡像
?
示例代碼: https://github.com/deepinsight/insightface
?
Dockerfile 文件內(nèi)容:
?
?
2 創(chuàng)建分布式網(wǎng)絡(luò)文件系統(tǒng)數(shù)據(jù)卷(cephfs)
?
?
由于我們是基于 kubernetes 的 pv 和 pvc 的方式使用數(shù)據(jù)卷,所有集群中需要事先安裝好 storage-class install,這樣當(dāng)用戶創(chuàng)建 pvc 時(shí),會(huì)通過(guò) storage-class 自動(dòng)的創(chuàng)建 pv。
?
當(dāng)創(chuàng)建好 pv 之后,用戶可以將該數(shù)據(jù)卷 mount 到自己的開發(fā)機(jī)上,并將需要訓(xùn)練的數(shù)據(jù)集移到該數(shù)據(jù)卷。用于之后創(chuàng)建訓(xùn)練 worker pod 的時(shí)候,掛載到 worker 容器中,供訓(xùn)練模型使用。
?
3 創(chuàng)建 mxnet 分布式訓(xùn)練任務(wù)
?
?
4 創(chuàng)建訓(xùn)練任務(wù)
?
?kubectl create -f insightface-train.yaml
?
復(fù)制代碼
?
5 查看任務(wù)運(yùn)行情況
?
?
?
6 查看訓(xùn)練日志的信息
?
登錄到具體的 node 計(jì)算節(jié)點(diǎn)通過(guò) docker logs 命令查看訓(xùn)練的日志:
?
?docker logs -f fc3d73161b27
?
復(fù)制代碼
?
更多資訊或疑問(wèn)內(nèi)容添加小編微信,?回復(fù) “Python” ,領(lǐng)取更多資料哦
? ?? ?
總結(jié)
?
雖然已經(jīng)完成了 mxnet 結(jié)合 kubeflow 實(shí)現(xiàn)大規(guī)模的分布式訓(xùn)練,但是除了功能上的基本跑通,還存在很多因素影響分布式訓(xùn)練的性能,如: GPU 服務(wù)器的網(wǎng)絡(luò)帶寬,普通的我們使用的以太網(wǎng)因?yàn)橥ㄐ叛舆t的原因,會(huì)大大影響多機(jī)擴(kuò)展性。InfiniBand(IB)網(wǎng)絡(luò)和 RoCE 網(wǎng)絡(luò)因?yàn)橹С?RDMA,大大降低了通信延遲,相比之下,20G 的以太網(wǎng)格延遲會(huì)大大提升。當(dāng)然,對(duì)于現(xiàn)有的普通以太網(wǎng)絡(luò),也可以通過(guò)別的方法優(yōu)化通信帶寬的減少,比方說(shuō)梯度壓縮。通過(guò)梯度壓縮,減少通信帶寬消耗的同時(shí),保證收斂速度和精度不會(huì)有明顯下降。MXNet 官方提供了梯度壓縮算法,按照官方數(shù)據(jù),最佳的時(shí)候可以達(dá)到兩倍的訓(xùn)練速度提升,同時(shí)收斂速度和精度的下降不會(huì)超過(guò)百分之一。還有如果使用分布式網(wǎng)絡(luò)文件系統(tǒng)進(jìn)行數(shù)據(jù)集的存儲(chǔ),如果解決吞吐量和網(wǎng)絡(luò)延遲的問(wèn)題。以及本地磁盤是否是 SSD,還是在訓(xùn)練時(shí)是否需要對(duì)大文件的數(shù)據(jù)集進(jìn)行 record.io 文件格式的處理及訓(xùn)練前數(shù)據(jù)集的切分等等問(wèn)題,都需要更進(jìn)一步的處理。
總結(jié)
以上是生活随笔為你收集整理的MXNet结合kubeflow进行分布式训练的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 宽带和流量是分开的吗_为什么现在的手机套
- 下一篇: smbd的安装与使用