在SkyForm ECP上运行深度学习框架

■ 文/ 天云软件  张伟、马巍娜

深度学习框架简介

近两年随着AlphGo的走红,深度学习技术已然成为最流行技术中的佼佼者,各种开源的深度学习框架也层出不穷,其中Tensorflow、MXNet和Caffe等凭借易部署、易上手、灵活性高等特点大大降低了深度学习技术的入门门槛。

Tensorflow、MXNet和Caffe的简单对比如下表:

se01

随着训练任务的复杂度不断提高,训练数据的规模不断扩大,深度学习框架的集群方案受到用户越来越多的关注。在大规模的集群环境下,对所有的机器、任务等进行管理是一项繁琐的工作,尤其是TensorFlow,每次启动任务必须登录到每台机器上执行启动命令,这种使用方式尤为不便。容器集群技术为简化这些工作提供了新的思路。

SkyForm ECP简介

SkyForm ECP是一个开放的、基于容器技术的应用集群管理平台。SkyForm ECP内置丰富的容器镜像及通用中间件基础服务,结合强大的应用编排功能,可以帮助企业在已有的IT基础架构之上快速构建出大规模具有弹性的应用系统,提高业务效率,降低IT成本,从繁杂的基础架构管理中解脱,更加专注于业务。

SkyForm ECP把每一种深度学习框架看做一个应用模板封装在应用市场中,通过配置一些自定义参数,可以一键创建符合自己需求的深度学习框架集群。

TensorFlow与SkyForm ECP集成

TensorFlow中的Training主要包括三种资源,ps,worker,TensorBoard。其中ps和worker对应的是SkyForm ECP中的batch job,它们使用集群内部的IP地址进行通信组建集群,在计算任务结束后会自动退出,释放所占用的资源。对于worker节点,其中运行的计算任务结束后会自动退出,ps节点使用tensorflow中提供的fifoqueue监听worker,worker节点全部退出后ps节点会自动退出。chef woker(通常是task_index=0的节点)节点会输出训练好的模型、训练过程中产生的log等数据。

TensorBoard是SkyForm ECP中的一个RC实例,有对应的service对外部提供服务。它可以加载训练任务中产生的log,用来展示训练过程中的数据变化、记录训练过程中的图像、音频等等。

Tensorflow-Serving也是SkyForm ECP中的一个RC实例,它用来加载训练好的模型,将训练好的机器学习模型部署到线上,使用 gRPC 作为接口接收外部调用。同时Tensorflow-Serving支持模型热更新与自动模型版本管理。

整体的框架如下图所示:

se02

整体的工作流程是一个循环迭代的过程,主要包括启动训练任务、保存模型、提供服务、优化Code、重新训练等几个阶段。

se03

具体的流程细节如下图所示:

se04

准备工作:创建共享存储,上传训练代码、训练数据到共享存储的特定目录。

    Step 1. 启动训练任务。指定需要的ps个数、资源大小等信息,worker个数、资源大小等信息,以及TensorBoard提供service的信息。(如果只有部分ps或者worker启动,已经启动的组件会持续等待其它组件正常启动,然后执行训练任务。TensorBoard是一个独立的组件,不受其它组件影响)。

    Step 2. 保存训练好的模型、输出日志等信息到共享存储上。

    Step 3. Tensorflow-serving加载训练好的模型(模型版本是1),对外提供服务。

    Step 4. 外部用户通过Tensorflow-serving接口提交请求,获取响应结果。

    Step 5. 开发人员通过反馈优化训练代码。

    Step 6. 使用优化后的代码重新提交训练任务。

    Step 7. 保存新的模型和输出日志等信息到共享存储上。

    Step 8. Tensorflow-serving热加载新版本的模型(模型版本是2),对外提供服务。

    Step 9. 外部用户通过Tensorflow-serving接口提交请求,Tensorflow-serving内部使用模型版本2处理请求。

MXNet与SkyForm ECP集成

MXNet和SkyForm ECP集成的原理与TensorFlow类似,此处不做过多介绍。需要注意的是MXNet可以使用ssh、mpirun等方式组建集群, SkyForm ECP平台使用的是ssh方式,在MXNet的基础镜像要配置ssh免密钥登录,在启动任务的时候指定使用ssh方式组建集群。

运行结果展示

本节以TensorFlow为例,展示深度学习框架在SkyForm ECP上的运行结果。

1、准备工作,上传代码和训练数据到共享存储:

se05

2、创建TensorFlow集群:

在应用市场中选择TensorFlow,修改自定义参数(包括启动命令、使用的共享存储、是否启动TensorBoard、ps和worker的副本数、每种资源的资源需求等):

se06

se07

测试例子中选择的Tensorflow模板版本是0.1.0,启用TensorBoard,部署成功后可以看到应用下包含TensorBoard,tensorflow-ps和tensorflow-worker三个子服务,其中TensorBoard的类型是replication controller,包含一个外部端口可以从外部访问服务,tensorflow-ps和tensorflow-worker的类型是job,ps的副本数和worker的副本数都是2。

se08

3、使用TensorBoard外部端口访问服务:

se09

4、在应用市场中选择TensorFlow Serving,修改自定义参数(包括副本数、日志文件目录等),启动TensorFlow Serving(可动态扩缩Serving的副本数):

se10

5、测试model:

se11

—END—