Apache Zeppelin 的 Submarine 解释器

Hadoop Submarine 是Hadoop 3.1版本中最新推出的机器学习框架子项目。它使得Hadoop能够支持Tensorflow、MXNet、Caffe、Spark等多种深度学习框架,为机器学习算法开发、分布式模型训练、模型管理以及模型发布提供了一个全功能的系统框架,结合Hadoop固有的数据存储和数据处理能力,使数据科学家能够更好地挖掘数据的价值。

一个深度学习算法项目需要数据采集、数据处理、数据清洗、交互式可视化编程调整参数、算法测试、算法发布、算法作业调度、离线模型训练、模型在线服务等多个流程和过程。Zeppelin 是一个基于网页的笔记本,支持交互式数据分析。您可以使用 SQL、Scala、Python 等来制作数据驱动的、交互式的、协作的文档。

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

通过将submarine集成到zeppelin中,我们利用zeppelin的数据发现、数据分析和数据可视化及协作能力,来可视化机器学习模型训练期间的算法开发和参数调整结果。

架构

如上图所示,从系统架构的角度解释了Submarine如何通过Zeppelin开发和建模机器学习算法。

在安装和部署Hadoop 3.1+和Zeppelin之后,submarine将在YARN中为每个用户创建一个完全独立的Zeppelin Submarine解释器Docker容器。该容器包含Tensorflow的开发和运行时环境。Zeppelin服务器连接到YARN中的Zeppelin Submarine解释器Docker容器。允许算法工程师在Zeppelin Notebook中的Tensorflow独立环境中进行算法开发和数据可视化。

算法开发完成后,算法工程师可以直接将算法提交到YARN,在Zeppelin中进行离线传输训练,并通过Submarine的TensorBoard实时展示每个算法工程师的模型训练情况。

你不仅可以完成算法的模型训练,还可以使用Zeppelin中的二十多种解释器。完成模型的数据预处理,例如,你可以在算法笔记中通过Zeppelin中的Spark解释器执行数据提取、过滤和特征提取。

未来,您还可以使用Zeppelin即将推出的Workflow工作流编排服务。您可以在一个Note中完成Spark、Hive数据处理和Tensorflow模型训练。通过可视化等方式将其组织成工作流,并在生产环境中执行作业调度。

概述

如上图所示,从内部实现来看,Submarine 如何结合 Zeppelin 的机器学习算法开发和模型训练。

  1. 算法工程师使用Submarine解释器在Zeppelin中创建了一个Tensorflow笔记本(左图)。

    需要注意的是,您需要在一个Note中完成整个算法的开发。

  2. 你可以在Note的某些段落中使用Spark进行数据预处理。

  3. 在其他段落的笔记本中使用Python进行Tensorflow的算法开发和调试,Submarine在YARN中为您创建了一个Zeppelin Submarine Interpreter Docker容器,该容器包含以下功能和服务:

  • Shell 命令行工具:允许您在 Zeppelin Submarine Interpreter Docker 容器中查看系统环境,安装您需要的扩展工具或 Python 依赖项。
  • Kerberos lib:允许您执行Kerberos身份验证并访问启用了Kerberos身份验证的Hadoop集群。
  • Tensorflow 环境:允许您开发 tensorflow 算法代码。
  • Python 环境:允许你开发 tensorflow 代码。
  • 在Zeppelin中使用Note完成一个完整的算法开发。如果这个算法包含多个模块,你可以在Note的多个段落中编写不同的算法模块。每个段落的标题是算法模块的名称。段落的内容是这个算法模块的代码内容。
  • HDFS 客户端:Zeppelin Submarine 解释器会自动将你在笔记中编写的算法代码提交到 HDFS。

    Submarine 解释器 Docker 镜像 这是 Submarine 为您提供的支持 Tensorflow(CPU 和 GPU 版本)的镜像文件。 并且安装了 Python 常用的算法库。 您还可以在 Submarine 提供的基础镜像上安装您所需的其他开发依赖项。

  1. 当你完成算法模块的开发时,你可以在Note中创建一个新的段落并输入%submarine dashboard。Zeppelin将创建一个Submarine Dashboard。通过选择控制面板中的JOB RUN命令选项,可以将此Note中编写的机器学习算法作为JOB提交到YARN。创建一个Tensorflow模型训练Docker容器,该容器包含以下部分:
  • Tensorflow 环境
  • HDFS客户端将自动从HDFS下载算法文件挂载到容器中,用于分布式模型训练。将算法文件挂载到容器的工作目录路径。

    Submarine Tensorflow Docker 镜像 Submarine 提供了一个支持 Tensorflow(CPU 和 GPU 版本)的镜像文件。并且安装了 Python 常用的算法库。你也可以在 Submarine 提供的基础镜像上安装你需要的其他开发依赖。

名称 类别 描述
%submarine SubmarineInterpreter 提供Apache Submarine仪表板的解释器
%submarine.sh SubmarineShellInterpreter 提供Apache Submarine shell的解释器
%submarine.python PySubmarineInterpreter 提供Apache Submarine的Python解释器

潜艇外壳

在Zeppelin中使用Submarine Interpreter创建Note后,如果需要,您可以向Note添加一个段落。使用%submarine.sh标识符,您可以使用Shell命令在Submarine Interpreter Docker容器上执行各种操作,例如:

  1. 查看容器中的Python版本
  2. 查看容器的系统环境
  3. 自行安装所需的依赖项
  4. 使用kinit进行Kerberos认证
  5. 在容器中使用Hadoop进行HDFS操作等。

潜艇 Python

您可以在Note中添加一个或多个段落。使用%submarine.python标识符在Python中编写Tensorflow的算法模块。

潜艇仪表盘

在使用%submarine.python编写Tensorflow算法后,您可以在Note中添加一段文字。进入%submarine仪表板并执行它。Zeppelin将创建一个Submarine仪表板。

通过Submarine仪表板,您可以进行Submarine的所有操作控制,例如:

  1. 用法:显示Submarine的命令描述,以帮助开发者定位问题。

  2. 刷新:Zeppelin 将清除您在仪表板中的所有输入。

  3. Tensorboard:您将被重定向到由Submarine为每个用户创建的Tensorboard WEB系统。通过Tensorboard,您可以实时查看Tensorflow模型训练的实时状态。

  4. 命令

  • JOB RUN:选择 JOB RUN 将显示用于提交 JOB 的参数输入界面。
名称 描述
检查点路径 Submarine 为每个用户的 Tensorflow 训练笔记设置了一个独立的检查点路径。保存了该笔记历史的训练数据,用于训练模型数据的输出,Tensorboard 使用此路径中的数据来展示模型。用户无法修改它。例如:`hdfs://cluster1/...`,检查点路径的环境变量名称为 `%checkpoint_path%`,你可以在 `PS Launch Cmd` 和 `Worker Launch Cmd` 中使用 `%checkpoint_path%` 来代替数据路径中的输入值。
输入路径 用户指定Tensorflow算法的数据目录。仅支持启用HDFS的目录。数据路径的环境变量名称为`%input_path%`,您可以在`PS启动命令`和`Worker启动命令`中使用`%input_path%`代替数据路径中的输入值。
PS Launch Cmd Tensorflow Parameter services launch command,例如:`python cifar10_main.py --data-dir=%input_path% --job-dir=%checkpoint_path% --num-gpus=0 ...`
Worker Launch Cmd Tensorflow Worker services launch command,例如:`python cifar10_main.py --data-dir=%input_path% --job-dir=%checkpoint_path% --num-gpus=1 ...`
  • 任务停止

    您可以选择执行JOB STOP命令。停止已提交并正在运行的Tensorflow模型训练任务

  • TensorBoard 启动

    您可以选择执行TENSORBOARD START命令来创建您的TENSORBOARD Docker容器。

  • 停止TENSORBOARD

    您可以选择执行TENSORBOARD STOP命令来停止并销毁您的TENSORBOARD Docker容器。

  1. 运行命令:执行您选择的动作命令
  2. 清理检查点:选择此选项将在每次JOB RUN执行前清除此笔记检查点路径中的数据。

配置

Zeppelin Submarine 解释器提供了以下属性来自定义 Submarine 解释器

属性名称 属性值 描述
DOCKER_CONTAINER_TIME_ZONE Etc/UTC 设置容器中的时区 |
DOCKER_HADOOP_HDFS_HOME /hadoop-3.1-0 以下3个镜像中的Hadoop路径(SUBMARINE_INTERPRETER_DOCKER_IMAGE、tf.parameter.services.docker.image、tf.worker.services.docker.image) |
DOCKER_JAVA_HOME /opt/java 以下3个镜像中的JAVA路径(SUBMARINE_INTERPRETER_DOCKER_IMAGE、tf.parameter.services.docker.image、tf.worker.services.docker.image) |
HADOOP_YARN_SUBMARINE_JAR Zeppelin服务器上安装的Hadoop-3.1+版本中Submarine JAR包的路径 |
INTERPRETER_LAUNCH_MODE local/yarn 在本地或YARN上运行Submarine解释器实例,本地主要用于Submarine解释器的开发和调试,YARN模式用于生产环境 |
SUBMARINE_HADOOP_CONF_DIR 设置HADOOP-CONF路径以支持多个Hadoop集群环境
SUBMARINE_HADOOP_HOME 在Zeppelin服务器上安装的Hadoop-3.1+以上路径
SUBMARINE_HADOOP_KEYTAB 启用Kerberos认证的Hadoop集群的Keytab文件路径
SUBMARINE_HADOOP_PRINCIPAL 启用Kerberos认证的Hadoop集群的keytab文件的PRINCIPAL信息
SUBMARINE_INTERPRETER_DOCKER_IMAGE 在INTERPRETER_LAUNCH_MODE=yarn时,Submarine使用此镜像创建Zeppelin Submarine解释器容器,为用户创建算法开发环境。 |
docker.container.network YARN的Docker网络名称
machinelearing.distributed.enable 是否使用分布式模式的模型训练JOB RUN提交
shell.command.timeout.millisecs 60000 Submarine解释器容器中shell命令的执行超时设置
submarine.algorithm.hdfs.path 将使用Submarine解释器开发的基于机器的算法保存为文件到HDFS
submarine.yarn.queue root.default Submarine 提交模型训练的 YARN 队列名称
tf.checkpoint.path Tensorflow 检查点路径,每个用户将在此路径下使用用户名创建用户的检查点二级路径。用户提交的每个算法将使用笔记ID创建检查点三级路径(用户的Tensorboard使用此路径中的检查点数据进行可视化显示)
tf.parameter.services.cpu 当Submarine提交模型分布式训练时,应用于Tensorflow参数服务的CPU核心数量
tf.parameter.services.docker.image Submarine 在提交模型分布式训练时为 Tensorflow 参数服务创建镜像
tf.parameter.services.gpu 当Submarine提交模型分布式训练时,应用于Tensorflow参数服务的GPU核心
tf.parameter.services.memory 2G 当Submarine提交模型分布式训练时,Tensorflow参数服务请求的内存资源
tf.parameter.services.num Submarine 用于提交模型分布式训练所使用的 Tensorflow 参数服务数量
tf.tensorboard.enable true 为每个用户创建一个单独的Tensorboard
tf.worker.services.cpu 在提交模型训练时,Submarine 为 Tensorflow 工作服务提交模型资源
tf.worker.services.docker.image Submarine 在提交模型分布式训练时为 Tensorflow worker 服务创建镜像
tf.worker.services.gpu Submarine 在提交模型训练时为 Tensorflow 工作节点服务提交 GPU 资源
tf.worker.services.memory 在提交模型训练时,Submarine 为 Tensorflow 工作节点服务提交模型资源
tf.worker.services.num Submarine 用于提交模型分布式训练的 Tensorflow 工作服务数量
yarn.webapp.http.address http://hadoop:8088 YARN web界面地址
zeppelin.interpreter.rpc.portRange 29914 你需要在SUBMARINE_INTERPRETER_DOCKER_IMAGE配置镜像中导出此端口。用于Zeppelin服务器和Submarine解释器容器之间的RPC通信
zeppelin.ipython.grpc.message_size 33554432 Submarine解释器容器中IPython grpc的消息大小设置
zeppelin.ipython.launch.timeout 30000 Submarine 解释器容器中的 IPython 执行超时设置
zeppelin.python python Submarine解释器容器中python的执行路径
zeppelin.python.maxResult 10000 从Submarine解释器容器返回的Python执行结果的最大数量
zeppelin.python.useIPython false 目前不支持IPython,必须为false
zeppelin.submarine.auth.type simple/kerberos Hadoop是否开启了kerberos认证?

Docker 镜像

Docker 镜像文件存储在 zeppelin/scripts/docker/submarine 目录中。

  1. 潜艇解释器 CPU 版本

  2. 潜艇解释器 GPU 版本

  3. tensorflow 1.10 & hadoop 3.1.2 cpu 版本

  4. tensorflow 1.10 & hadoop 3.1.2 gpu 版本

变更日志

0.1.0 (Zeppelin 0.9.0) :

  • 支持分布式或独立的TensorFlow模型训练。
  • 支持本地运行的潜艇解释器。
  • 支持运行YARN的submarine解释器。
  • 支持在YARN-3.3.0上使用Docker,计划与较低版本的yarn兼容。

错误与联系

  • Submarine 解释器 BUG 如果您遇到此解释器的错误,请在 ZEPPELIN-3856 上创建一个子 JIRA 票证。
  • Submarine 运行问题 如果您遇到 Submarine 运行时的问题,请在 apache-hadoop-submarine 上创建一个 ISSUE
  • YARN Submarine BUG 如果您遇到Yarn Submarine的bug,请在SUBMARINE上创建一个JIRA工单。

依赖

  1. YARN Submarine 目前需要在 Hadoop 3.3+ 上运行
  • hadoop submarine 团队的 git 仓库的 hadoop 版本会定期提交到 hadoop 的代码仓库中。
  • hadoop submarine 团队的 git 仓库版本将比 hadoop 版本发布周期更快。
  • 您可以使用hadoop submarine团队的git仓库中的hadoop版本。
  1. Submarine 运行时环境 你可以使用 Submarine-installer https://github.com/apache/submarine,部署 Docker 和网络环境。

更多

Hadoop Submarine 项目: https://submarine.apache.org/ Youtube Submarine 频道: https://www.youtube.com/channel/UC4JBt8Y8VJ0BW0IM9YpdCyQ