在阿里雲Kubernetes上使用ENI進行分散式機器學習訓練
概述
模型訓練是機器學習最主要的實踐場景,尤其以使用機器學習框架TensorFlow進行模型訓練最為流行,但是隨著機器學習的平臺由單機變成叢集,這個問題變得複雜了。利用KubeFlow社群的自定義資源TFJob/MPIJob/MxNetJob可以在Kubernetes叢集方便的執行其不同的分散式訓練框架,解決了易用性和訓練生命週期管理的問題。而阿里雲容器服務開源的Arena能讓這一個操作更加簡單直觀。
但是在實踐會中發現如果是以GPU為計算裝置,在多機場景下,網路頻寬和延遲會成為拖累訓練速度的主要瓶頸。所以在實踐中,多數人會選擇放棄使用overlay網路,直接選用HostNetwork,避免vxlan帶來的效能開銷。但是HostNetwork的缺點也顯而易見,一個是埠的管理複雜度,另外一個是主機網路的安全性隱患。
那麼有沒有一個方案能同時兼顧隔離性和效能?阿里雲上的彈性網絡卡是一個很好的選擇,而阿里雲Kubernetes容器服務自研的網路外掛Terway支援將阿里雲的彈性網絡卡分配給Pod,使用者可以很簡單的可以使用到阿里雲的ENI能力。
在本文中,將向您介紹如何利用Arena進行分散式模型訓練
準備Kubernetes叢集
阿里雲容器服務Kubernetes 1.11.2目前已經上線,可以通過容器服務管理控制檯非常方便地快速建立 Kubernetes 叢集,在選擇網路外掛是一定要選擇Terway
。具體過程請參考建立Kubernetes叢集
安裝Arena
安裝Arena的過程可以參考docker run
命令
docker run -itd --name arena -v /:/host -v /root/.kube/config:/root/.kube/config -e KUBECONFIG=/root/.kube/config cheyang/arena:0.1.0-20181101121817-81ac1e3
另外arena
命令支援auto complete,可以執行以下命令增加這種能力
yum install bash-completion -y echo "source <(arena completion bash)" >> ~/.bashrc source <(arena completion bash)"
執行支援阿里雲ENI的Arena命令
- 在提交任務前,可以查詢節點的ip列表,它們是在
192.168.0.0/16
網段
kubectl get no -o=yaml |grep -i address:
- address: 192.168.0.116
- address: 192.168.0.115
- address: 192.168.0.118
- address: 192.168.0.117
- address: 192.168.0.114
2. 下面執行命令的目的是兩機八卡的ResNet-50分散式模型訓練ImageNet,在這種頻寬密集型的網路模型訓練,使用mpijob的分散式訓練模式+Uber的Horovod
框架的效果較好。這裡會使用TensorFlow的Benchmark程式進行測試。
arena submit mpijob --name=tf-eni \
--annotation=k8s.aliyun.com/eni=true \
--workers=2 \
--syncMode=git \
--syncSource=https://github.com/tensorflow/benchmarks.git \
--gpus=8 \
--cpu=50 \
--memory=200Gi \
--env=GIT_SYNC_BRANCH=cnn_tf_v1.9_compatible \
--image=uber/horovod:0.13.10-tf1.9.0-torch0.4.0-py3.5 \
"mpirun --allow-run-as-root -np 16 -oversubscribe --bind-to none -x NCCL_SOCKET_IFNAME=eth0 python code/benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --num_gpus=1 --data_name=imagenet --model=resnet50 --variable_update=horovod --horovod_device=gpu --num_batches=300 --batch_size=128 --optimizer=momentum"
這裡針對彈性網絡卡的配置是添加了一行
--annotation=k8s.aliyun.com/eni=true
3. 任務提交後,查詢到部署任務的Pod也是同在192.168.0.0/16
網段, 實際上它們使用的就是彈性網絡卡
kubectl get po -o=wide -l=release=tf-eni
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
tf-eni-mpijob-launcher-c9px7 1/1 Running 0 16s 192.168.0.136 cn-huhehaote.i-09790vg0alb65q1e9 <none>
tf-eni-mpijob-worker-0 1/1 Running 0 30s 192.168.0.134 cn-huhehaote.i-b4qysu7phen3sah9r <none>
tf-eni-mpijob-worker-1 1/1 Running 0 32s 192.168.0.135 cn-huhehaote.i-b4qysu7phen3sah9s <none>
4. 執行結束檢視日誌
以下日誌為ENI網路配置下效能資料,
----------------------------------------------------------------
300 images/sec: 189.6 +/- 0.8 (jitter = 12.8) 7.843
----------------------------------------------------------------
total images/sec: 3033.57
----------------------------------------------------------------
300 images/sec: 189.6 +/- 0.8 (jitter = 12.7) 7.836
----------------------------------------------------------------
total images/sec: 3033.57
----------------------------------------------------------------
以下為HostNetwork網路的效能資料
----------------------------------------------------------------
300 images/sec: 187.7 +/- 0.8 (jitter = 12.5) 7.807
----------------------------------------------------------------
total images/sec: 3001.91
----------------------------------------------------------------
300 images/sec: 187.6 +/- 0.8 (jitter = 12.9) 7.804
----------------------------------------------------------------
total images/sec: 3001.91
----------------------------------------------------------------
通過對比發現ENI和Host網路配置相比效能上相差無幾。
總結
當雲原生技術擁抱高效能運算領域的時候,一個重要的問題是如何在確保效能不受損失的前提下,更加靈活和安全進行運算。容器服務推出支援Terway網路支援彈性網絡卡,幫助使用者保證安全隔離的前提下,享受著和主機網路一樣的高效能。而利用Arena可以方便的在分散式訓練的場景下享受到這個紅利,歡迎大家阿里雲上的容器服務以及開源機器學習工具Arena。