Skip to content

Tensorflow环境搭建及应用规范

Xinjie Chen edited this page Mar 22, 2018 · 3 revisions

整体概述

EasyML1.2.0及以上版本目前能够支持Tensorflow的单机、模型并行、数据并行三种模式的程序运行。

在Docker的EasyML部署安装包中,我们已经提供了Tersorflow环境部署的脚本,大家只需要在容器启动之后,运行hadoop-master容器根目录下的config-tensorflow.sh脚本即可自动进行tensorflow环境的搭建。

本文将针对自行搭建集群的用户介绍EasyML的Tensorflow的环境搭建以及Tensorflow单机、模型并行、数据并行三种模式程序的应用规范

Tensorflow环境搭建

基础环境

  • 保证Tensorflow集群的每台机器安装Python2.7(目前的仅支持python2.7语言规范)、Tensorflow环境
  • 配置Tensorflow账户(可以为root账户,也可以为其他任意账户,保证每台Tensorflow集群机器都包含该账户)
  • 保证Tensorflow集群的每台机器在Tensorflow账户下两两ssh互通(若账户为root,则保证root账户互通,EasyML docker环境默认为root账户),保证在ssh的过程中不能存在warning或者要求用户输入yes的情况
  • 保证每台机器Tensorflow账户能够支持sudo命令
  • 每台机器的shell命令都必须为bash shell,若不是bash shell的按照以下命令进行转换(以Red hat 默认的dash shell为例)
#查看默认 shell
ls -al /bin/sh

#若为Dash则将其切换回bash
sudo ln -fs /bin/bash /bin/sh

特殊环境

  • Tensorflow并行模式所需脚本在EasyML github tensorflow目录中,各脚本含义如下:

    1. check.sh:获得每台机器上的闲置端口
    2. check_port.sh:在 Tensorflow 集群的每台机器上运行 check.sh ,拿到所有的可用端口。为了保证只有一个 check_port.sh 在运行,运行时会添加文件锁
    3. start.py:模型并行时启动 worker 的python 文件
    4. start.sh: 启动start.py脚本
  • 在每台Tensorflow集群上创建/usr/bda/port 目录

  • check_port.sh文件拷贝到每台Tensorflow集群配置Tensorflow账户的根目录下,且配置的账号需要有sudo权限

  • start.pystart.sh文件拷贝到每台Tensorflow集群配置Tensorflow账户的根目录下

  • 指定Tensorflow集群中的任意一台机器为Tensorflow Master,将check.sh拷贝到该机器配置Tensorflow账户的根目录下。

工程配置文件

  • server-config.xml:该文件位于EasyML工程的resources目录下,针对Tensorflow环境,需要根据环境配置修改如下属性:
#Tensorflow集群所有机器的ip,用逗号分隔
<TENSORFLOW CLUSTER>cluster_ip1,cluster_ip2_cluster_ip3...</TENSORFLOW_CLUSTER>	

#任选Tensorflow集群中的一台机器作为tensorflow_master
<TENSORFLOW_MASTER>cluster_ip1</TENSORFLOW_MASTER>

#创建Tensorflow集群账户,可直接用root或yarn账户
<TENSORFLOW_USER>user</TENSORFLOW_USER>

Tensorflow程序应用规范

单机

EasyML对于单机的Tensorflow程序没有限制,只需要满足集群搭建的python版本以及保证集群中的所有集群都安装Tensorflow即可,程序的编写规范与EasyML普通程序上传规范一致

数据分布

数据分布的代码中除了用户规定之外的输入,需要加入两个额外参数,tensorflow集群的 ip 列表以及本机的逻辑标识这两个参数的位置在最后 例如用户需要接受输入文件和模型保存的位置,则 python 文件接受参数的部分可以表示为:

#数据输入与模型保存参数(即EML中的input和output参数)
input_path = sys.argv[1]
model_path = sys.argv[2]

# tensorflow集群ip列表
ip_list = sys.argv[3].split(",")

index = int(sys.argv[4])

index 的具体含义可以参考 tensorflow 数据并行 中 index 的定义。tensorflow 数据并行的具体写法,可以参考 这份代码

模型分布

模型分布的代码中除了用户规定之外的输入,需要加入一个额外参数** commit_ip 表示该任务提交的 ip 节点**,该参数的位置同样在最后 例如用户需要接受输入文件和模型保存的位置,则 python 文件接受参数的部分可以表示为:

input_path = sys.argv[1]
model_path = sys.argv[2]
# 最后一个参数表示提交 ip,该参数的格式为ip:port  如:172.0.0.0:65535
commit_ip = sys.argv[3]

该参数会由 EasyML系统产生,用户不需要输入该参数。

为了让 tensorflow 可以接受提交任务,在初始化 tensorflow 的 session 时,我们需要指定为 grpc 的形式:

with tf.Session(target="grpc://" + commit_ip) as sess:
    # your code here

注意事项

  • 上述模型分布和数据分布所需要的额外参数用户只需要在脚本中接收并使用,具体的参数值EasyML平台会传递给用户,用户无需考虑具体参数值的获取

  • EasyML1.2.0及以上版本的Docker安装包中自带了Tensorflow模型分布和数据分布的示例,当然大家也可访问我们的对外在线服务中的examples示例【示例】CNN_Tensorflow(模型分布)、【示例】CNN_Tensorflow(数据分布)

  • 相关数据分布和模型分布的示例代码可在对外在线服务中的Program->机器学习算法->深度学习目录下下载