Using Ray with TensorFlow

本文档介绍在Ray中使用TensorFlow的最佳实践,包括如何有效地在分布式环境中传递和更新模型权重,避免直接序列化图的效率问题。通过示例展示了在网络间平均权重和数据并行训练的方法,同时提供了故障排除的提示,如处理变量名冲突和避免在不可变图中添加新操作。
摘要由CSDN通过智能技术生成

本文(英版)档介绍了Ray中结合TensorFlow使用的最佳实践。

要查看使用TensorFlow的更多相关示例,请查看A3CResNetPolicy GradientsLBFGS

 

如果在分布式环境中训练深层网络,则可能需要在进程(或计算机)之间运送深层网络。 例如,你可能在一台计算机上更新模型,然后使用该模型在另一台计算机上计算梯度。 但是,运输模型并不总是顺利的。

 

例如,直接尝试序列化TensorFlow图计算会产生不同的结果。 一些示例失败,一些成功(但产生非常大的字符串)。

 

此外,创建TensorFlow计算图可能需要几十秒,因此序列化图并在另一个进程中重新创建它将是低效的。 更好的解决方案是在开始时在每个worker创建相同的TensorFlow图,然后仅在worker之间传递权重。

 

假设我们有一个简单的网络定义(这个定义是从TensorFlow文档中修改的)。

import tensorflow as tf
import numpy as np
x_data = tf.placeholder(tf.float32, shape=[100])
y_data = tf.placeholder(tf.float32, shape=[100])
w = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
y = w * x_data + b
loss = tf.reduce_mean(tf.square(y - y_data))
# 参考API,https://blog.csdn.net/xierhacker/article/details/53174558
optimizer = tf.train.GradientDescentOptimizer(0.5)
grads = optimizer.compute_gradients(loss)
train = optimizer.apply_gradients(grads)
init = tf.global_variables_initializer()
sess = tf.Session()

要提取权重并设置权重,可以使用以下辅助方法。

import ray
variables = ray.experimental.TensorFlowVariables(loss, sess)

TensorFlowVariables对象提供了获取和设置权重以及收集模型中所有变量的方法。

 

现在我们可以使用这些方法来提取权重,并将它们设置回网络中,如下所示。

# First initialize the weights.
sess.run(init)
# Get the weights
weights = variables.get_weights()  # Returns a dictionary of numpy arrays
# Set the weights
variables.set_weights(weights)

注意:如果我们使用如下所示的assign方法设置权重,则每次调用assign都会向图中添加一个节点,并且图形会随着时间的推移而变得难以管理。

w.assign(np.zeros(1))  # This adds a node to the graph every time you call it.
b.assig
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值