Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么要使用tf.train.Server并行执行多个tf.Session()?_Python_Tensorflow_Parallel Processing_Multiprocessing_Distributed Computing - Fatal编程技术网

Python 为什么要使用tf.train.Server并行执行多个tf.Session()?

Python 为什么要使用tf.train.Server并行执行多个tf.Session()?,python,tensorflow,parallel-processing,multiprocessing,distributed-computing,Python,Tensorflow,Parallel Processing,Multiprocessing,Distributed Computing,并行执行多个tf.Session()的正式方法是使用tf.train.Server,如中所述。另一方面,以下内容适用于Keras,根据需要,可以在不使用tf.train.Server的情况下修改为Tensorflow 第一种方法比第二种方法快吗?我有一个用第二种方法编写的代码,由于我的算法(AlphaZero)的性质,一个GPU应该运行许多进程,每个进程都执行微小批量的预测 设计用于集群内的分布式计算,当需要在不同节点之间通信时。当培训分布在多台机器上或在某些情况下分布在一台机器上的多个GPU上

并行执行多个
tf.Session()
的正式方法是使用
tf.train.Server
,如中所述。另一方面,以下内容适用于Keras,根据需要,可以在不使用tf.train.Server的情况下修改为Tensorflow

第一种方法比第二种方法快吗?我有一个用第二种方法编写的代码,由于我的算法(AlphaZero)的性质,一个GPU应该运行许多进程,每个进程都执行微小批量的预测

设计用于集群内的分布式计算,当需要在不同节点之间通信时。当培训分布在多台机器上或在某些情况下分布在一台机器上的多个GPU上时,这尤其有用。从文件中:

进程内TensorFlow服务器,用于分布式培训

tf.train.Server
实例封装了一组可以参与分布式训练的设备和
tf.Session
目标。服务器属于集群(由
tf.train.ClusterSpec
指定),并对应于命名作业中的特定任务服务器可以与同一集群中的任何其他服务器通信

使用
多处理生成多个进程。进程
不是Tensorflow意义上的集群,因为子进程之间没有交互。此方法易于设置,但仅限于一台机器。既然你说你只有一台机器,这可能不是一个有力的论据,但是如果你计划扩展到一个机器集群,你必须重新设计整个方法

因此,tf.train.Server
是一个更通用、更可扩展的解决方案。此外,它允许通过一些非平凡的通信组织复杂的培训,例如异步梯度更新。训练速度是否更快在很大程度上取决于一项任务,我不认为在一个共享的GPU上会有显著差异

仅供参考,以下是服务器代码的外观(图间复制示例):

#指定集群的体系结构
集群=tf.train.ClusterSpec({
“ps”:[192.168.1.1:1111'],
“工人”:[192.168.1.2:1111',
'192.168.1.3:1111']
})
#解析命令行以指定机器
job_type=sys.argv[1]#作业类型:“worker”或“ps”
task_idx=sys.argv[2]#索引ClusterSpec中定义的worker或ps列表中的作业
#创建TensorFlow服务器。这就是机器的通信方式。
服务器=tf.train.server(集群,作业名称=作业类型,任务索引=任务idx)
#参数服务器由远程客户端更新。
#将不会超出此if语句。
如果作业类型=‘ps’:
server.join()
其他:
#工人专用
使用tf.device(tf.train.replica_device_setter)(worker_device='/job:worker/task:'+task_idx,
cluster=cluster):
#在这里构建您的模型,就像您只使用一台机器一样
通过
使用tf.Session(server.target):
#在这里训练你的模特
通过

非常感谢您详细、有用的回答!现在我看到,在可预见的未来,服务器方法对我来说是不必要的,在此期间,我必须坚持使用单个GPU/机器。
def _training_worker(train_params):
    import keras
    model = obtain_model(train_params)
    model.fit(train_params)
    send_message_to_main_process(...)

def train_new_model(train_params):
    training_process = multiprocessing.Process(target=_training_worker, args = train_params)
    training_process.start()
    get_message_from_training_process(...)
    training_process.join()