概述
模型训练是机器学习最主要的实践场景,尤其以使用机器学习框架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的过程可以参考安装文档。另外也可以直接在Kubernetes的Master节点运行下面的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。