TensorFlow中的异步计算

Vojtech Letal

最近,我一直在玩TensorFlow,并提到该框架无法使用我所有可用的计算资源。卷积神经网络教程中,他们提到

天真地采用模型参数的异步更新会导致次优训练性能,因为单个模型副本可能会在模型参数的陈旧副本上进行训练。相反,采用完全同步更新将与最慢的模型副本一样慢。

尽管他们在本教程和白皮书中都提到了这一点,但我并未真正找到在本地计算机上进行异步并行计算的方法。可能吗 还是它是TensorFlow发行版本的一部分。如果是,那怎么办?

ry

TensorFlow的开源版本支持异步梯度下降,甚至无需修改图形。最简单的方法是并行执行多个并发步骤

loss = ...

# Any of the optimizer classes can be used here.
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

sess = tf.Session()
sess.run(tf.initialize_all_variables())

def train_function():
  # TODO: Better termination condition, e.g. using a `max_steps` counter.
  while True:
    sess.run(train_op)

# Create multiple threads to run `train_function()` in parallel
train_threads = []
for _ in range(NUM_CONCURRENT_STEPS):
  train_threads.append(threading.Thread(target=train_function))

# Start the threads, and block on their completion.
for t in train_threads:
  t.start()
for t in train_threads:
  t.join()

本示例设置对的NUM_CONCURRENT_STEPS调用sess.run(train_op)由于这些线程之间没有协调,因此它们异步进行。

(目前)实现同步并行训练实际上更具挑战性,因为这需要额外的协调以确保所有副本都读取相同版本的参数,并确保所有副本同时可见。用于CIFAR-10训练多GPU示例通过在训练图中使用共享参数制作“塔”的多个副本,并在应用更新之前显式平均塔上的梯度来执行同步更新。


注意:此答案中的代码将所有计算都放在同一设备上,如果您的计算机中有多个GPU,这将不是最佳选择。如果要使用所有GPU,请遵循多GPU CIFAR-10模型的示例,并创建多个“塔”,并将其操作固定在每个GPU上。该代码大致如下:

train_ops = []

for i in range(NUM_GPUS):
  with tf.device("/gpu:%d" % i):
    # Define a tower on GPU `i`.
    loss = ...

    train_ops.append(tf.train.GradientDescentOptimizer(0.01).minimize(loss))

def train_function(train_op):
  # TODO: Better termination condition, e.g. using a `max_steps` counter.
  while True:
    sess.run(train_op)


# Create multiple threads to run `train_function()` in parallel
train_threads = []
for train_op in train_ops:
  train_threads.append(threading.Thread(target=train_function, args=(train_op,))


# Start the threads, and block on their completion.
for t in train_threads:
  t.start()
for t in train_threads:
  t.join()

请注意,您可能会发现使用“可变范围”方便了塔之间的变量共享。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Tensorflow中的同步与异步计算

来自分类Dev

TensorFlow中的缓存计算

来自分类Dev

条件为异步的异步计算表达式中的“ while”

来自分类Dev

Ember中基于异步数据的计算属性

来自分类Dev

计算DOM中异步脚本的数量

来自分类Dev

Tensorflow 2.0中的梯度计算

来自分类Dev

如何为Ember数据中的异步关联定义计算属性?

来自分类Dev

如何过滤Vuejs中的异步计算数据

来自分类Dev

用于 AWS AppSync 中异步计算的 Graphql 订阅

来自分类Dev

如何实现异步计算?

来自分类Dev

Tensorflow.js计算图像中的黑色像素

来自分类Dev

在tensorflow.js中,如何计算模型输入的梯度?

来自分类Dev

在TensorFlow中手动/稍后计算梯度

来自分类Dev

Tensorflow 的计算时间在非常简单的“for 循环”中逐渐变慢

来自分类Dev

异步计算未捕获OperationCancelledException

来自分类Dev

延迟异步计算可观察

来自分类Dev

带有异步Ember模型的计算属性中的混乱行为

来自分类Dev

如何在计算绑定中返回标头后调用铁 ajax 异步

来自分类Dev

Tensorflow:无效的计算

来自分类Dev

在 WPF 应用程序中而不是在控制台应用程序中存在死锁的异步计算

来自分类Dev

计算批次中的成对距离而无需在Tensorflow中复制张量?

来自分类Dev

在Ocaml异步的延迟计算中使用return

来自分类Dev

FutureTask如何进行异步计算

来自分类Dev

Spring Framework上的多线程(或异步)计算

来自分类Dev

Knockout计算函数内部的异步调用

来自分类Dev

异步CPU读取和GPU + CPU计算

来自分类Dev

React JS异步大量计算

来自分类Dev

使用Python异步来无序计算事物

来自分类Dev

异步等待CPU计算与IO操作的用法?

Related 相关文章

热门标签

归档