首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TensorFlow中的异步计算

TensorFlow中的异步计算
EN

Stack Overflow用户
提问于 2015-12-22 15:52:11
回答 1查看 11.2K关注 0票数 12

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

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

尽管在本教程和白纸中都提到了这一点,但我并没有真正找到在本地机器上进行异步并行计算的方法。有可能吗?或者它是TensorFlow发布版本的一部分?如果是,那怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-22 16:21:02

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

代码语言:javascript
复制
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_STEPSsess.run(train_op)调用。由于这些线程之间没有协调,所以它们异步进行。

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

N.B.这个答案中的代码将所有的计算放在同一个设备上,如果您的计算机中有多个GPU,这将不是最优的。如果您想使用所有的GPU,遵循多GPU CIFAR-10型的例子,创建多个“塔”,并将它们的操作固定在每个GPU上。守则大致如下:

代码语言:javascript
复制
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()

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

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34419645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档