Kubernetes已经成为云原生应用编排、管理的事实标准, 越来越多的应用选择向Kubernetes迁移。人工智能和机器学习领域天然的包含大量的计算密集型任务,开发者非常愿意基于Kubernetes构建AI平台,充分利用Kubernetes提供的资源管理、应用编排、运维监控能力。
然而基于Kubernetes构建一个端到端的AI计算平台是非常复杂和繁琐的过程,它需要处理很多个环节。如图1所示,除了我们熟知的模型训练环节之外还包括数据收集、预处理、资源管理、特性提取、数据验证、模型的管理、模型发布、监控等环节。对于一个AI算法工程师来讲,他要做模型训练,就不得不搭建一套AI计算平台,这个过程耗时费力,而且需要很多的知识积累。
Kubeflow诞生于2017年,Kubeflow项目是基于容器和Kubernetes构建,旨在为数据科学家、机器学习工程师、系统运维人员提供面向机器学习业务的敏捷部署、开发、训练、发布和管理平台。它利用了云原生技术的优势,让用户更快速、方便的部署、使用和管理当前最流行的机器学习软件。
目前Kubeflow 1.0版本已经发布,包含开发、构建、训练、部署四个环节,可全面支持企业用户的机器学习、深度学习完整使用过程。
如下图所示:
通过Kubeflow 1.0,用户可以使用Jupyter开发模型,然后使用fairing(SDK)等工具构建容器,并创建Kubernetes资源训练其模型。模型训练完成后,用户还可以使用KFServing创建和部署用于推理的服务器。再结合pipeline(流水线)功能可实现端到端机器学习系统的自动化敏捷构建,实现AI领域的DevOps。
既然有了Kubeflow,是不是在Kubernetes上进行机器学习、深度学习就一帆风顺了呢?答案是否定的。我们知道Kubeflow在调度环境使用的是kubernetes的默认调度器。而Kubernetes默认调度器最初主要是为长服务设计的,对于AI、大数据等批量和弹性调度方面还有很多的不足。主要存在以下问题:
资源争抢问题
TensorFlow的作业包含Ps和Worker两种不同的角色,这两种角色的Pod要配合起来完成整个作业,如果只是运行一种角色Pod,整个作业是无法正常执行的,而默认调度器对于Pod调度是逐个进行的,对于Kubeflow作业TFJob的Ps和Worker是不感知的。在集群高负载(资源不足)的情况下,会出现多个作业各自分配到部分资源运行一部分Pod,而又无法正执行完成的状况,从而造成资源浪费。以下图为例,集群有4块GPU卡,TFJob1和TFJob2作业各自有4个Worker,TFJob1和TFJob2各自分配到2个GPU。但是TFJob1和TFJob2均需要4块GPU卡才能运行起来。这样TFJob1和TFJob2处于互相等待对方释放资源,这种死锁情况造成了GPU资源的浪费。
亲和调度问题
分布式训练中,Ps和Worker存在很频繁的数据交互,所以Ps和Worker之间的带宽直接影响了训练的效率。 Kubernetes默认调度器并不考虑Ps和Worker的这种逻辑关系,Ps和Worker是被随机调度的。如下图所示,2个TFJob(1个Ps + 2 Worker),使用默认调度器,有可能会出现(a)、(b)、(c)三种情况的任意一种情况,我们知道(c)才是我们最想要的调度结果。因为在(c)中,Ps和Worker可以利用本机网络提供传输效率,缩短训练时间。
Volcano是一款构建于Kubernetes之上的增强型高性能计算任务批量处理系统。作为一个面向高性能计算场景的平台,它弥补了kubernetes在机器学习、深度学习、HPC、大数据计算等场景下的基本能力缺失,其中包括gang-schedule的调度能力、计算任务队列管理、task-topology和GPU亲和性调度。另外,Volcano在原生kubernetes能力基础上对计算任务的批量创建及生命周期管理、fair-share、binpack调度等方面做了增强。Volcano充分解决了上文提到的Kubeflow分布式训练面临的问题。
Volcano更多信息请参见:https://github.com/volcano。
Kubeflow和Volcano两个开源项目的结合充分简化和加速了Kubernetes上AI计算进程。当前已经成为越来越多用户的最佳选择,应用于生产环境。Volcano目前已经应用于华为云CCE、CCI产品以及容器批量计算解决方案。未来Volcano会持续迭代演进,优化算法、增强调度能力如智能调度的支持,在推理场景增加GPU Share等特性的支持,进一步提升kubeflow批量训练和推理的效率。
下面将展示如何基于Kubeflow和Volcano,并使用MNIST数据集轻松的完成数字图像分类模型的分布式训练。
单击左侧栏目树中的“插件管理”,在“插件市场”页签下单击Volcano插件下方的“安装插件”,在安装插件页面的“基本信息”步骤中选择要安装的集群和Volcano插件版本,单击“下一步:规格配置”。
Volcano插件无可配置参数,直接单击“安装”,等待安装任务完成。
sudo mkdir /mnt/pv{1..4}
export KF_NAME=<your choice of name for the Kubeflow deployment> export BASE_DIR=<path to a base directory> export KF_DIR=${BASE_DIR}/${KF_NAME} export CONFIG_URI="https://raw.githubusercontent.com/kubeflow/manifests/v1.0-branch/kfdef/kfctl_k8s_istio.v1.0.2.yaml"
tar -xvf kfctl_v1.0.2_<platform>.tar.gz chmod +x kfctl mv kfctl /usr/local/bin/
cd ${KF_DIR} kfctl apply -V -f ${CONFIG_URI}
git clone https://github.com/kubeflow/examples.git
pip3 install jupyter notebook jupyter notebook --allow-root
kind: TFJob metadata: name: {train_name} spec: schedulerName: volcano tfReplicaSpecs: Ps: replicas: {num_ps} template: metadata: annotations: sidecar.istio.io/inject: "false" spec: serviceAccount: default-editor containers: - name: tensorflow command: ... env: ... image: {image} workingDir: /opt restartPolicy: OnFailure Worker: replicas: 1 template: metadata: annotations: sidecar.istio.io/inject: "false" spec: serviceAccount: default-editor containers: - name: tensorflow command: ... env: ... image: {image} workingDir: /opt restartPolicy: OnFailure
kubectl apply -f mnist.yaml
等待训练作业完成,通过Kubeflow的UI可以查询训练结果信息。至此,我们就完成了一次简单的分布式训练任务。Kubeflow的借助TFJob简化了作业的配置。Volcano通过简单的增加一行配置就可以让用户启动组调度、Task-topology等功能来解决死锁、亲和性等问题,在大规模分布式训练情况下,可以有效的缩短整体训练时间。
TOP云 (west.cn)6月27日消息,前两天我们报道了四字母 域名 ksaq.com以一口价2...
本文汇总了Alibaba Cloud Linux 2已支持的功能和内核接口。 Alibaba Cloud Linux...
方物服务器虚拟化产品由Fronware vSever和 Fronware vCenter两部分软件组成,vSe...
操作场景 本章节介绍在绑定弹性公网 IP 后,登录黑石服务器。 操作步骤 获取登录...
很多时候,我们已经看到学生在为工作而选择一种有价值的编程语言的困境中挣扎。...
一、介绍 Kafka在世界享有盛名,大部分互联网公司都在使用它,那么它到底是什么...
本文转载自微信公众号「PythonMind」,作者dongfanger。转载本文请联系PythonMin...
本教程介绍如何使用弹性伸缩生命周期挂钩挂起ECS实例,并结合运维编排服务OOS的...
1. 功能介绍? 云平台各个产品的性能总览均需要登录对应的运维工具查看 在提供相...
调用InitializeEHPC创建E-HPC服务的关联角色。 调试 您可以在OpenAPI Explorer中...