Kubernetes:在异构GPU集群上分布式深度学习
作者:MapR数据科学家孟东
深度学习是一类机器学习算法,可以学习多个数据级别的表示层次,潜在地降低了可以解决难题的模型生产难度。在最困难的问题中,这种下降表现为可以做什么的进步。在更简单的问题中,可能会导致性能提高或建模过程更简单。现在许多深度学习应用已经超越了人类的表现,如图像识别或棋类竞技。还有更多的其他著名使用案例,使得深度学习成为了这些最有能力系统的一部分,包括语音识别,文本识别,机器翻译和自动驾驶。
做这些表现的很大部分是源于机器学习数学运算的不断进展,至少有一部分是由于原始计算性能的提高以及使用该性能技术的改进。
许多企业已经开始探索以分布式培训和服务于集群的深度学习的方法。许多人选择构建一个在研究或开发环境中运行良好的专用GPU HPC集群,但一个共同的问题是,随着培训数据的准备,培训和服务,数据必须在集群之间来回移动。通常情况下,有多个模型训练集群会使数据运动问题变得更糟。这种数据运动本身就是一项巨大的成本,但是将数据存储在多个位置会导致管理用于训练深度学习模型的数据和管理的研究、开发与生产之间的模型的高度复杂性。
本文将概述一些我们用来使分布式深度学习更容易培训和服务的技术。我们在包含异构GPU和CPU资源的环境中执行此操作。一个关键的结果是分布式深度学习培训工作流程可以变得更简单。还将介绍如何利用流式架构在GPU上实现全局实时深度学习应用。
深度学习模型的分布式培训
我们发现以下功能对于构建更简单的机器学习和服务管道来说,既是必要也是充分的:
无论是存储在流,表格还是文件中的所有数据都可以使用传统的基于目录的路径名称树进行组织和访问。
所有数据都以完全分布式存储,但可以从任何授权的计算机上使用相同的路径名访问。
所有数据都可以通过标准的POSIX文件操作访问。
卷可用于允许目录结构,根据这些目录内容的存储位置进行管理。
所有数据访问的性能都达到或接近硬件限制。相关限制将是非本地数据的网络带宽和计算过程本地数据的本地磁盘速度。
数据要求
我们提出的分布式深度学习解决方案有三层,底层是数据层,由数据服务管理,使你能够为培训数据创建专用卷,并为组织提供将深度学习开发,培训和部署更贴近其数据的机会。数据层应该支持安全,快照和镜像等企业功能,以确保你的数据在企业环境中的安全性和高度可管理性。
中间层是编排层,建议使用Kubernetes来管理GPU/CPU资源,并以pod为单位启动参数服务器和培训工作人员进行深度学习任务。中间层还应该支持异构集群,你可以使用CPU节点为模型提供服务,同时使用GPU节点来训练模式。高级功能将支持使用不同GPU卡标记节点的功能,以便你可以在较旧的GPU卡上启动优先级较低的任务,并在较新的卡上启动优先级较高的任务。
顶层是应用层。在这一层,支持深度学习工具(如Tensorflow)用于利用模型输出,然后将其放入部署中。一个最佳设计是将存储在相同计算节点的网络邻域中的容器中的特定分布式训练作业的训练数据存储,以减少网络拥塞。需要支持像Docker这样的容器技术和Kubernetes等编排技术,以分布式的方式部署Tensorflow等深度学习工具。通过相同的概念,你可以为CPU/GPU计算的目的共同定位数据。通过水平扩展的底层数据,数据可以通过高速数据流连续供应给GPU,并防止计算资源不足。
部署应用
在我们提出的分布式深度学习解决方案中,通常有5个步骤将你的深度学习应用投入生产。
1.修改Tensorflow应用以添加分布式服务器,有许多方法可以在Tensorflow中启用数据并行。在Tensorflow中,同步训练和graph replication是更实用的方法,例如,我们可以添加如下代码片段:
其中ps/worker hostname, job_name, task_index可以通过用于启动Kubernetes pods的YAML文件传入。也可以将代码放在分布式数据系统中,并在启动Kubernetes作业时将其安装到多个pods中。
2.准备培训数据并将其加载到分布式数据系统上,最好的演示方法是为不同的深度学习应用创建专用逻辑卷,以便更好地管理它。
3.选择要使用的容器镜像,例如,我们使用最新的Tensorflow GPU镜像,这些容器将受益于对完全分布式数据系统的本地访问。
4.编写一个YAML文件来创建Kubernetes作业,我们要安装所需的Nvidia库,Tensorflow应用程序,持久性和检查点的目标文件夹以及使用的训练数据。在这里,我们可以轻松创建挂载到分布式文件系统卷的持久性卷,并授予多个Pod访问连接到此持久性卷的持久性卷声明。
5.如果结果令人满意,请检查结果是否持续,并进一步部署模型。
额外的挑战
实时深度学习训练和推理的部分挑战在于快速,可靠的数据分布。随着广播技术的进步,我们将继续提高视频质量,这也促使深度学习技术迎头赶上。诸如压缩感知(compressed sensing)之类的技术可以潜在地用于减少流端的负载。深度学习模型可用于重构低维空间的特征,从而使实时视频应用中的压缩感知成为可能。
此外,通过分布式培训,与Yarn和Mesos相比,Kubernetes更适合托管在线应用。