TensorFlow做为深度学习领域最火的框架之一,一直被广大深度学习和机器学习应用者及爱好者推崇。但是做为不断快速更新迭代的框架,每个版本较之前版本,都有较大改动。往往苦了使用TensorFlow的广大拥趸,经常出现升级了版本或者api后,不知道如何使用。本文讨论的是困惑很多程序员的——如何在TensorFlow 1.3版本高层Api使用分布式的问题。
一、低层api里面,分布式使用方式
TensorFlow给出的低层api,分布式的使用方式比较清楚,具体如下:
# Create a cluster from the parameter server and worker hosts.
cluster=tf.train.ClusterSpec({"ps":ps_hosts,"worker":worker_hosts})
# Create and start a server for the local task.
server=tf.train.Server(cluster,
job_name=FLAGS.job_name,
task_index=FLAGS.task_index)
二、高层api,例如:DNNLinearCombinedClassifier。到了高层api的使用里面,尴尬了,因为从接口的参数里面,没有显式的传入ClusterSpec的参数。
通读DNNLinearCombinedClassifier源码发现,分布式的实现方式,是通过其config参数传进去的配置来实现的。
具体方式如下:
首先创建一个tf.contrib.learn.RunConfig的实例,具体如下:
run_config = tf.contrib.learn.RunConfig(model_dir=FLAGS.output,
save_summary_steps=20,
save_checkpoints_steps=100,
gpu_memory_fraction=0.3)
然后在创建DNNLinearCombinedClassifier的实例的时候,传入RunConfig实例,具体如下:
estimator = tf.estimator.DNNLinearCombinedClassifier(
linear_feature_columns=base_columns + crossed_columns,
dnn_feature_columns=deep_columns,
dnn_hidden_units=[128, 64],
linear_optimizer=tf.train.FtrlOptimizer(
learning_rate=0.1,
l1_regularization_strength=0.01,
l2_regularization_strength=0.0
),
dnn_optimizer=tf.train.AdamOptimizer(
learning_rate=0.01
),
config=run_config
)
如此配置,然并卵,因为还是没有发现如何传入worker和ps的信息。于是通读tf.contrib.learn.RunConfig代码,发现在其父类ClusterConfig中有线索,worker和ps的信息,是通过读取系统环境变量里面的TF_CONFIG值获取到的,如下代码:
config=json.loads(os.environ.get('TF_CONFIG')or'{}'),
于是终于get到解决该问题的最后一步,需要在系统环境变量里面设置TF_CONFIG参数,python代码实现配置方式如下:
os.environ["TF_CONFIG"] = json.dumps({
'environment': 'cloud', # tf.contrib.learn.Environment.CLOUD
'cluster': {
'master': hosts,
'ps': ps_hosts,
'worker': worker_hosts,
},
'task': {
'type': job_name,
'index': FLAGS.task_index,
},
})
Bingo,问题解决,如果有问题,欢迎留言~
网友评论