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

FutureTask如何进行异步计算

来自分类Dev

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

来自分类Dev

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

来自分类Dev

异步计算未捕获OperationCancelledException

来自分类Dev

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

来自分类Dev

延迟异步计算可观察

来自分类Dev

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

来自分类Dev

异步CPU读取和GPU + CPU计算

来自分类Dev

TensorFlow中的缓存计算

来自分类Dev

Tensorflow中的同步与异步计算

来自分类Dev

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

来自分类Dev

React JS异步大量计算

来自分类Dev

Tensorflow 2.0中的梯度计算

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何实现异步计算?

来自分类Dev

计算DOM中异步脚本的数量

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Tensorflow:无效的计算

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

Related 相关文章

热门标签

归档