Submarine:在 Apache Hadoop 中运行深度学习框架

2019 年 1 月 03 日

Submarine:在 Apache Hadoop 中运行深度学习框架

作者: Wangda Tan & Sunil Govindan & Zhankun Tang


(这篇博文由网易杭研的 刘勋周全 协助编写).


原文地址:https://hortonworks.com/blog/submarine-running-deep-learning-workloads-apache-hadoop/


介绍


Hadoop 是用于大型企业数据集的分布式处理的最流行的开源框架,它在本地和云端环境中都有很多重要用途。


深度学习对于语音识别,图像分类,AI 聊天机器人,机器翻译等领域的企业任务非常有用,仅举几例。 为了训练深度学习/机器学习模型,可以利用 TensorFlow / MXNet / Pytorch / Caffe / XGBoost 等框架。 有时需要将这些框架进行组合使用以用于解决不同的问题。


为了使分布式深度学习/机器学习应用程序易于启动,管理和监控,Hadoop 社区启动了 Submarine 项目以及其他改进,例如一流的 GPU 支持,Docker 容器支持,容器 DNS 支持,调度改进等。


这些改进使得在 Apache Hadoop YARN 上运行的分布式深度学习/机器学习应用程序就像在本地运行一样简单,这可以让机器学习工程师专注于算法,而不是担心底层基础架构。 通过升级到最新的 Hadoop,用户现在可以在同一群集上运行其他 ETL / streaming 作业来运行深度学习工作负载。 这样可以轻松访问同一群集上的数据,从而实现更好的资源利用率。



典型的深度学习工作流程:数据从各个终端(或其他来源)汇聚到数据湖中。 数据科学家可以使用笔记本进行数据探索,创建 pipelines 来进行特征提取/分割训练/测试数据集。 并开展深度学习和训练工作。 这些过程可以重复进行。 因此,在同一个集群上运行深度学习作业可以显著提高数据 / 计算资源共享的效率。


让我们仔细看看 Submarine 项目(它是 Apache Hadoop 项目的一部分),请看下如何在 Hadoop 上运行这些深度学习工作。


为什么叫 Submarine 这个名字?


因为潜艇是唯一可以将人类带到更深处的装置设备。B-)



图片由 NOAA 办公室提供海洋勘探与研究,墨西哥湾 2018 年。


SUBMARINE 概览


Submarine 项目有两个部分:Submarine 计算引擎和一套集成 Submarine 的生态系统软件和工具。


Submarine 计算引擎 通过命令行向 YARN 提交定制的深度学习应用程序(如 Tensorflow,Pytorch 等)。 这些应用程序与 YARN 上的其他应用程序并行运行,例如 Apache Spark,Hadoop Map / Reduce 等。


最重要的是我们的有一套集成 Submarine 的生态系统软件和工具,目前包括:


  • Submarine-Zeppelin integration: 允许数据科学家在 Zeppelin 的 notebook 中编写算法和调参进行可视化输出,并直接从 notebook 提交和管理机器学习的训练工作。

  • Submarine-Azkaban integration: 允许数据科学家从 Zeppelin 的 notebook 中直接向 Azkaban 提交一组具有依赖关系的任务,组成工作流进行周期性调度。

  • Submarine-installer: 在您的服务器环境中安装 Submarine 和 YARN,轻松解决 Docker 、Parallel network 和 nvidia 驱动的安装部署难题,以便您更轻松地尝试强大的工具集。



图表说明了 Submarine 的整体构成,底部显示了 Submarine 计算引擎,它只是 YARN 的一个应用程序。 在计算引擎之上,它集成到其他生态系统,如笔记本电脑(Zeppelin / Jupyter)和 Azkaban。


SUBMARINE 能够做什么?


通过使用 Submarine 计算引擎,用户只需提交一个简单的 CLI 命令即可运行单/分布式深度学习训练工作,并从 YARN UI 中获取完整的运行情况。 所有其他复杂性,如运行分布式等,都会由 YARN 负责。 我们来看几个例子:


就像 HELLO WORLD 一样轻松启动分布式深度学习训练


以下命令启动深度学习训练工作读取 HDFS 上 的 cifar10 数据。 这项工作是使用用户指定的 Docker 镜像,与 YARN 上运行的其他作业共享计算资源(如 CPU / GPU /内存)。


yarn jar hadoop-yarn-applications-submarine-<version>.jar job run \–name tf-job-001 –docker_image <your docker image> \–input_path hdfs://default/dataset/cifar-10-data \–checkpoint_path hdfs://default/tmp/cifar-10-jobdir \–num_workers 2 \–worker_resources memory=8G,vcores=2,gpu=2 \–worker_launch_cmd “cmd for worker …” \–num_ps 2 \–ps_resources memory=4G,vcores=2 \–ps_launch_cmd “cmd for ps”
复制代码


通过 TENSORBOARD 访问您所有的训练历史任务


以下命令启动深度学习训练工作读取 HDFS 上的 cifar10 数据。


yarn jar hadoop-yarn-applications-submarine-<version>.jar job run \–name tensorboard-service-001 –docker_image <your docker image> \–tensorboard
复制代码


在 YARN UI 上,用户只需单击即可访问 tensorboard:




在同一 Tensorboard 上查看训练状态和历史记录。


云端数据科学家 NOTEBOOK


想在 GPU 机器上用笔记本编写算法吗? 使用 Submarine,您可以从 YARN 资源池获取云端 notebook。


通过运行以下命令,您可以获得一个 notebook,其中包括 8GB 内存,2 个 vcores 和 4 个来自 YARN 的 GPU。


yarn jar hadoop-yarn-applications-submarine-<version>.jar job run \–name zeppelin-note—book-001 –docker_image <your docker image> \–num_workers 1 \–worker_resources memory=8G,vcores=2,gpu=4 \–worker_launch_cmd “/zeppelin/bin/zeppelin.sh” \–quicklink Zeppelin_Notebook=http://master-0:8080
复制代码


然后在 YARN UI 上,您只需单击一下即可访问笔记本。



SUBMARINE 生态


Hadoop Submarine 项目的目标是提供深度学习场景中的数据(数据采集,数据处理,数据清理),算法(交互式,可视化编程和调优),资源调度,算法模型发布和作业调度的全流程服务支持。


通过与 Zeppelin 结合,很明显可以解决数据和算法问题。 Hadoop Submarine 还将解决 Azkaban 的作业调度问题。 三件套工具集:Zeppelin + Hadoop Submarine + Azkaban 为您提供一个零软件成本的、开放所有源码的随时可用的深度学习开发平台。


SUBMARINE 集成 ZEPPELIN


Zeppelin 是一款基于网络的笔记本电脑,支持交互式数据分析。 您可以使用 SQL,Scala,Python 等来制作数据驱动的交互式协作文档。


在完成机器学习之前,您可以使用 Zeppelin 中的 20 多种解释器(例如 Spark,Hive,Cassandra,Elasticsearch,Kylin,HBase 等)在 Hadoop 中的数据中收集数据,清理数据,特征提取等。 模特训练,完成数据预处理过程。


我们提供 Submarine 解释器,以支持机器学习工程师从 Zeppelin 笔记本中进行算法开发,并直接向 YARN 提交训练任务并从 Zeppelin 中获得结果。


使用 ZEPPELIN SUBMARINE 解释器


你可以在 zeppelin 中创建 submarine 解释器。


在 notebook 的第一行种输入 %submarine.python REPL(Read-Eval-Print Loop,简称 REPL)名称,你就可以开始编写 tensorflow 的 python 算法,你可以在一个 Notebook 中至上而下分段落的编写一个或多个算法模块,分块编写算法结合可视化输出将会帮助你更容易验证代码的正确性。





The zeppelin submarine 解释器会自动将分块编写的算法模块进行合并提交到 submarine 计算引擎中执行。


通过点击 Notebook 中的 YARN LOG 超链接,你将会打开 YARN 的管理页面查看执行的任务。



在 YARN 管理页面中,您可以打开自己的任务链接,查看任务的 docker 容器使用情况以及所有执行日志。



有了这个强大的工具,数据科学家不需要了解 YARN 的复杂性或如何使用 Submarine 计算引擎。 提交 Submarine 训练工作与在笔记本中运行 Python 脚本完全相同。 最重要的是,用户无需更改其已有算法程序即可转换为 Submarine 作业运行。


SUBMARINE 集成 AZKABAN


Azkaban 是一种易于使用的工作流程安排服务,通过 Azkaban 安排 Zeppelin 编写的 Hadoop Submarine Notebook 来安排指定 Notebook 设置某些段落之间的工作流程。


您可以在 Zeppelin 中使用 Azkaban 的作业文件格式,编写具有执行依赖性的多个笔记本执行任务。



Azkaban 能够调度这些通过 zeppelin 编辑好的具有依赖关系的 notebook。




一旦执行了带有 Azkaban 脚本的 notebook,它将被编译为 Azkaban 支持的工作流并提交给 Azkaban 以执行。


HADOOP SUBMARINE 安装程序


由于分布式深度学习框架需要在多个 Docker 容器中运行,并且需要能够协调容器中运行的各种服务,因此需要为分布式机器学习完成模型训练和模型发布服务。 这其中将涉及到多个系统工程问题,如 DNS,Docker,GPU,网络,显卡驱动,操作系统内核修改等,正确部署这些运行环境是一件非常困难和耗时的事情。


我们为您提供了 submarine installer ,用于运行时环境的安装, submarine installer 是一个完全由 Shell 脚本编写,提供了简单易用的菜单化操作方式,您只需要在一台可以联网的服务器上运行,就可以轻松便捷的安装好运行环境。



安装过程中你如果遇见问题,还可以通过我们提供的 安装手册 进行解决。


项目状态


Alpha 版本的解决方案已经合并到 Haodop 主干分支。 3.2.0 版本的一部分仍处于活动开发/测试阶段。Umbrella JIRA: YARN-8135.


Submarine 能够运行在 Apache Hadoop 3.1+.x release 版本上,实际上你只需要安装 Apache Hadoop 3.1 的 YARN 就可以使用完整的 Submarine 的功能和服务,经过我们的实际使用, Apache Hadoop 3.1 的 YARN 可以完全无误的支持 Hadoop 2.7 + 以上的 HDFS 系统。


案例 – 网易


网易杭研大数据团队是 Submarine 项目的主要贡献者之一,主要希望通过 Submarine 来解决机器学习开发和运维过程中遇到的以下问题:


现有计算集群的状态:


  • 网易通过互联网提供在线游戏/电商/音乐/新闻等服务。

  • YARN 集群中运行有 ~ 4k 服务器节点

  • 每天 100k 计算任务


单独部署的 Kubernetes 集群(配备 GPU)用于机器学习工作负载


  • 每天 1000+ 计算学习任务

  • 所有的 HDFS 数据都是通过 Spark、Hive、impala 等计算引擎进行处理


存在的问题:


  • 用户体验不佳


没有集成的操作平台,全部通过手动编写算法,提交作业和检查运行结果,效率低,容易出错。


  • 利用率低


无法重用现有的 YARN 群集资源。


无法集成现有的大数据处理系统(例如:spark,hive 等)


  • 维护成本高(需要管理分离的集群)


需要同时运维 Hadoop 和 Kubernetes 两套操作环境,增加维护成本和学习成本。


网易内部 Submarine 部署情况


  • 积极与 Submarine 社区合作开发,已经验证 20 个 GPU 节点集群上的 Submarine 的可靠性。

  • 计划将来将所有深度学习工作转移到 Submarine 上


其他信息



欢迎大家参与到 Submarine 项目中来!


关于作者


Wangda Tan @ Hortonworks, Engineering Manager of YARN team @ Hortonworks. Apache Hadoop PMC member and committer, working on Hadoop since 2011. Major working field: scheduler / deep learning on YARN / GPUs on YARN, etc.


Xun Liu @ Netease, has been working on Hadoop development for 5 years. Currently in the Netease Hangzhou Research Institute is responsible for the machine learning development team.


Sunil Govindan, Staff Software Engineer @Hortonworks. Contributing to Apache Hadoop project since 2013 in various roles as Hadoop Contributor, Hadoop Committer and a member Project Management Committee (PMC). Majorly working on YARN Scheduling improvements / Multiple Resource types support in YARN etc.


Quan Zhou @ Netease, Senior Big Data Engineer @NetEase, Focusing on Hadoop, yarn, and hive, worked at Cisco since 2013 and joined in NetEase in 2015


Zhankun Tang. Staff Software Engineer @Hortonworks. He’s interested in big data, cloud computing, and operating system. Now focus on contributing new features to Hadoop as well as customer engagement. Prior to Hortonworks, he works for Intel.


致谢


Thanks for inputs and contributions from Vinod Vavilapalli, Saumitra Buragohain, Yanbo Liang, Zian Chen, Weiwei Yang, Jeff Zhang ,Zhe Zhang (Linkedin), Jonathan Hung (Linkedin), Keiqiu Hu (Linkedin), Anthony Hsu.


2019 年 1 月 03 日 12:007852

评论 2 条评论

发布
用户头像
想咨询下你们怎么docker和yarn结合的,怎么在不破坏一个container的生命周期下,用docker container替换LinuxContainerExecutor结合的?
2019 年 01 月 04 日 13:04
回复
Submarine 现在运行在 YARN-3.1.X 以上版本, YARN-3.1.X 以上版本已经直接支持 Docker 了,所以不需要替换。
你可以不升级你的 YARN,可以先单独搭建一个 YARN-3.1.X 以上版本的独立环境,通过 Submarine 运行机器学习,访问 HDFS-2.7.X 中的数据。
安装部署 Submarine 的 GPU 运行环境,你可以使用文本中 Submarine-installer 安装工具
https://github.com/hadoopsubmarine/hadoop-submarine-ecosystem/blob/master/submarine-installer
展开
2019 年 01 月 07 日 17:16
回复
没有更多评论了
发现更多内容

MySQL中 int(11)和 int(10) 到底有没有区别?

周三不加班

MySQL 字符宽度 数据库数据类型

开源商业模式促进金融业科技生态的发展

fino星君

开源 金融科技

《零基础学Java》 FAQ 之 1-HelloWorld程序发生了ClassNotFound错误怎么解决

臧萌

Java Hello World !

pip 配置路径要死记硬背?

风起帆扬了

Python Linux windows pip

取舍与可测试

孙苏勇

产品 产品设计 产品开发

从一道面试题来看计算机基础知识的重要性

周三不加班

数组 堆栈 函数栈 函数栈调用

css常见问题总结

靖仙

CSS css3

字节流(InputStream/OutputStream)

Howe

Java 工作流

Python3.6.1官方文档练习——初入江湖(一)

Sicolas Flamel

Python python3.x 入门

一次线上服务高 CPU 占用优化实践

张亚

性能优化 JVM cpu

python 之 「奶茶名字」的词云展示

Sicolas Flamel

Python python 爬虫 python教程

Java并发编程基础--volatile

Java收录阁

volatile 线程

Redis 6.0 新特性-多线程连环13问!

码大叔

redis 多线程 io

业务代码的救星——Java 对象转换框架 MapStruct 妙用

周三不加班

MapStruct 对象转换

《零基础学Java》 FAQ 之 2-Java版本那点事儿

臧萌

Java

Service Worker in Action

xgqfrms

Service Worker Web Worker

聊聊苹果账号的那些事儿

不要艾特我

iphone

Bash 的4种运行模式

Megatron7

bash Linux DevOps Shell

快捷考勤打卡设置

Megatron7

ios

写字工具更新史

Bonaparte

学习 读书笔记

从删库到跑路?

岳老三

产品 职业 产品经理 职业素养 职业道德

maven私服搭建

kcnf

maven

理解 KL 散度的近似

Neil

人工智能 学习 Deep learning Machine Learning

Redis学习笔记(字符串类型)

编程随想曲

redis

利用goaccess分析nginx日志

Megatron7

nginx Linux

Kubernetes 将迎来首个 LTS 版本

倪朋飞

Kubernetes 容器 微服务

Flutter引擎源码解读-内存管理篇

稻子

flutter ios android 跨平台 dart

Graylog部署文档

蚍蜉

Linux 开源 工具 日志分析

各大公司面试题分类整理

吕小毛

后端 面试题

一个平凡程序员的年度总结

小智

程序员 人生

【译】【UX】一个页面可以有多个面包屑导航吗?

Yukun

用户研究 UX 面包屑导航

Submarine:在 Apache Hadoop 中运行深度学习框架-InfoQ