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