在GCP Dataproc的Keras模型上使用分布式Tensorflow

在GCP Dataproc的Keras模型上使用分布式Tensorflow,tensorflow,keras,google-cloud-platform,google-cloud-dataproc,tony,Tensorflow,Keras,Google Cloud Platform,Google Cloud Dataproc,Tony,我对GCPDataproc上的云计算完全陌生。我在创建集群时安装了TonY(Tensorflow on Thread),以便在集群上运行Tensorflow 为了在我的keras模型上运行分布式tensorflow,我在创建tf.train.ClusterSpec部分时遇到了麻烦。似乎只要我创建一个clusterspec,然后使用tf.train.server和tf.session创建一个服务器和一个会话,我就可以使用K.set_会话(session created)为我的keras模型设置会话

我对GCPDataproc上的云计算完全陌生。我在创建集群时安装了TonY(Tensorflow on Thread),以便在集群上运行Tensorflow

为了在我的keras模型上运行分布式tensorflow,我在创建tf.train.ClusterSpec部分时遇到了麻烦。似乎只要我创建一个clusterspec,然后使用tf.train.server和tf.session创建一个服务器和一个会话,我就可以使用K.set_会话(session created)为我的keras模型设置会话。我只是想确定这是否正确?工作节点和ps节点是什么,以及如何将其引用到我在GCP Dataproc中创建的集群中的主节点和工作节点。在创建会话时,tf.train.Server中的参数是否仅为Server.target

# Keras Core
from keras.layers.convolutional import MaxPooling2D, Convolution2D, 
AveragePooling2D
from keras.layers import Input, Dropout, Dense, Flatten, Activation
from keras.layers.normalization import BatchNormalization
from keras.layers.merge import concatenate
from keras import regularizers
from keras import initializers
from keras.models import Model
# Backend
from keras import backend as K
# Utils
from keras.utils.layer_utils import convert_all_kernels_in_model
from keras.utils.data_utils import get_file
from keras.preprocessing.image import ImageDataGenerator
from keras import optimizers
from keras.preprocessing.image import img_to_array, load_img

from keras import backend as K
import numpy as np
import os
import inspect
from tqdm import tqdm
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from keras.callbacks import ModelCheckpoint
import tensorflow as tf
from PIL import Image

#Is worker going to reference to my worker nodes in my cluster and ps 
references to my master node in my cluster?
#Do I put the external addresses of the nodes into their respective lists?
cluster = tf.train.ClusterSpec({"worker": ["35.236.62.93:2222",
                                       "35.236.30.154:2222",
                                       "35.235.127.146:2222"],
                            "ps": ["5.235.95.74:2222"]})
#Is my job name correct as well?
server = tf.train.Server(cluster, job_name="ps")

#Does tf.Session take in server.target as its parameter?
sess = tf.Session(server.target)
K.set_session(sess)

要访问群集配置,请使用TensorFlow代码中的
Cluster\u SPEC
。您可以遵循以下工作示例:

    cluster_spec_str = os.environ["CLUSTER_SPEC"]
    cluster_spec = json.loads(cluster_spec_str)
    ps_hosts = cluster_spec['ps']
    worker_hosts = cluster_spec['worker']
通过使用Cloud Dataproc启动TonY作业,TonY在您的纱线容器中设置了
CLUSTER\u SPEC
环境变量,您可以直接访问该变量,如上所述

您还可以使用
Job\u name
环境变量访问作业名称:

  job_name = os.environ["JOB_NAME"]
您应该能够使用TonY MNIST示例作为示例。请让我们知道这是否适用于您

在Cloud Dataproc中,我们有两个概念:

  • 主人
  • 工人
在Hadoop世界中,它们分别指资源管理器(Master)和节点管理器(Worker)。在本例中,我们有一个云Dataproc集群,由1个主节点和4个工作节点组成:

这将显示群集中的所有虚拟机:

从TensorFlow的角度来看,您可以使用3种主要策略进行分布式机器学习:

  • 镜像策略:多个GPU,单节点
  • CollectiveAllReduceStrategy:多个GPU、多个节点均减少
  • 参数服务器策略:多个GPU、多个节点、参数+工作节点
在您的例子中,当您启动TonY作业时,您似乎引用了后者,因此您将定义一个.xml文件(在本例中为TonY.xml),其中您定义了参数服务器和工作者的数量

<configuration>
 <property>
  <name>tony.application.security.enabled</name>
  <value>false</value>
 </property>
 <property>
  <name>tony.worker.instances</name>
  <value>${worker_instances}</value>
 </property>
 <property>
  <name>tony.worker.memory</name>
  <value>${worker_memory}</value>
 </property>
 <property>
  <name>tony.ps.instances</name>
  <value>${ps_instances}</value>
 </property>
 <property>
  <name>tony.ps.memory</name>
  <value>${ps_memory}</value>
 </property>
</configuration>

tony.application.security.enabled
假的
托尼,工人,实例
${worker_实例}
托尼,工人,记忆
${worker\u memory}
tony.ps
${ps_实例}
托尼·ps·记忆
${ps_内存}
当TonY client将此请求发送到Cloud Dataproc时,默认情况下Dataproc将在任何Dataproc Worker中分配容器(Dataproc master不用于处理)。例如:

<configuration>
 <property>
  <name>tony.application.security.enabled</name>
  <value>false</value>
 </property>
 <property>
  <name>tony.worker.instances</name>
  <value>2</value>
 </property>
 <property>
  <name>tony.worker.memory</name>
  <value>4g</value>
 </property>
 <property>
  <name>tony.ps.instances</name>
  <value>1</value>
 </property>
 <property>
  <name>tony.ps.memory</name>
  <value>2g</value>
 </property> 
</configuration>

tony.application.security.enabled
假的
托尼,工人,实例
2.
托尼,工人,记忆
4g
tony.ps
1.
托尼·ps·记忆
2g
这将需要4个集装箱:

  • 1个应用程序主机
  • 1参数服务器
  • 2个工作服务器
分配取决于资源管理器调度程序。默认情况下,Dataproc使用
DefaultResourceCalculator
,并将尝试在任何Dataproc群集活动工作线程中查找资源

请查看MNIST和Cloud DataProc的当前示例:


您使用的是哪个TF版本?对于最新的TF版本1.13和2.0,您可能需要使用model_to_estimator API访问ParameterServerStrategy查看我们的回购协议,我们使用Keras+Distributed添加了一个新样本。