在阿里云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集群

在阿里云Kubernetes上使用ENI进行分布式机器学习训练

安装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命令

  1. 在提交任务前,可以查询节点的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。

上一篇:Alluxio深度学习实战-1:体验在HDFS上运行PyTorch框架


下一篇:【云栖号案例 | 制造】协鑫光伏上云 为提供企业稳定高效的大数据存储、分析能力