日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MXNet结合kubeflow进行分布式训练

發布時間:2025/3/11 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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虛擬環境(方便后期分布式運行)

hosts="gpu10 gpu11 gpu12 gpu13 gpu14 gpu15 gpu16 gpu17 gpu18 " ./cmd2all.sh "cmds" "sudo yum -y install epel-release && sudo yum -y install python-pip && sudo pip install virtualenv && virtualenv mxnetGPU" $hosts ./cmd2all.sh "cmds" "echo \"## gbxu MXnet-GPU\" >> .bashrc" $hosts ./cmd2all.sh "cmds" "echo \"source mxnetGPU/bin/activate\" >> .bashrc" $hosts

嘗試在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安裝
#copy installer && run# 若安裝錯誤需要先卸載 sudo yum -y remove "cuda-*" sudo rm -rf /usr/local/cuda* sudo rpm -i cuda-repo-rhel7-9-2-local-9.2.148-1.x86_64.rpm sudo yum clean all sudo yum -y install cuda

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不是必須的,但是一般會采用這個加速庫。

tar -xzvf cudnn-9.2-linux-x64-v7.1.tgz sudo cp cuda/include/cudnn.h /usr/local/cuda/include sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64 sudo chmod a+r /usr/local/cuda/include/cudnn.h

安裝Prerequisites

see documents

sudo yum -y install build-essential git lapack-devel openblas-devel opencv-devel atlas-devel

complie 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=1

install 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
hosts=(gpu11 gpu12 gpu13 gpu14 gpu15 gpu16 gpu17 gpu18) for host in ${hosts[@]} doecho run 1.sh at $hostscp -r process_data gbxu@$host:~/ done

再用2.sh在各nodes運行scripts_in_nodes.sh腳本即可。

  • 2.sh
hosts=(gpu12 gpu13 gpu14 gpu15 gpu16 gpu17 gpu18) for host in ${hosts[@]} doecho run 2.sh at $hostscp process_data/scripts_in_nodes.sh gbxu@$host:~/process_data/ssh gbxu@$host "cd process_data && nohup ./scripts_in_nodes.sh &" done
  • scripts_in_nodes.sh
sudo yum -y remove "cuda-*" sudo rpm -i cuda-repo-rhel7-9-2-local-9.2.148-1.x86_64.rpm sudo yum clean all sudo yum -y install cuda echo -e "export LD_LIBRARY_PATH=/usr/local/cuda/lib64/:\$LD_LIBRARY_PATH" >> ~/.bashrc echo -e "export PATH=\$PATH:/usr/local/cuda/bin" >> ~/.bashrctar -xzvf cudnn-9.2-linux-x64-v7.1.tgz sudo cp cuda/include/cudnn.h /usr/local/cuda/include sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64 sudo chmod a+r /usr/local/cuda/include/cudnn.hsudo yum -y install build-essential git lapack-devel openblas-devel opencv-devel atlas-develpip install numpy requests # 請根據最后運行MXNet任務時查缺補漏

編譯、安裝MXNet

之后只需在一臺host上編譯mxnet即可,余下用MXNet的同步機制即可。
在gpu10上啟動訓練

  • 需要加庫文件放到同步的文件夾下:
cd incubator-mxnet/example/image-classification echo -e "gpu11\ngpu12\ngpu13\ngpu14\ngpu15\ngpu16\ngpu17\ngpu18\n" > hosts rm -rf mxnet cp -r ../../python/mxnet . cp -r ../../lib/libmxnet.so mxnet
  • 然后執行命令,該命令會同步文件夾cluster上啟動8個worker,1個server
# export DMLC_INTERFACE='ib0'; # ib尚未配置好 python ../../tools/launch.py -n 8 -s 1 --launcher ssh -H hosts --sync-dst-dir /home/gbxu/image-classification_test/ python train_mnist.py --network lenet --kv-store dist_sync --num-epochs 1 --gpus 0

ENJOY

  • multiple machines each containing multiple GPUs 的訓練見docs
  • 其中 dist_sync_device 替代 dist_sync。因為cluster為多GPU,見docs
  • mxnet-make-install-test.sh
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=1 cd python pip uninstall -y mxnet pip install -e . cd ../example/image-classification echo -e "gpu11\ngpu12\ngpu13\ngpu14\ngpu15\ngpu16\ngpu17\n" > hosts rm -rf mxnet # example/image-classification下的 cp -r ../../python/mxnet . cp -r ../../lib/libmxnet.so mxnet export DMLC_INTERFACE='ib0'; python ../../tools/launch.py -n 8 -s 1 --launcher ssh -H hosts --sync-dst-dir /home/gbxu/image-classification_test/ python train_mnist.py --network lenet --kv-store dist_sync --num-epochs 1 --gpus 0

?

?

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进行分布式训练的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。