【问题标题】:Bad performance for hogwild-style SGD in tensorflow's word2vectensorflow 的 word2vec 中 hogwild 风格的 SGD 性能不佳
【发布时间】:2016-01-19 16:10:11
【问题描述】:

Tensorflow 的梯度下降优化器 GradientDescentOptimizer 默认不使用锁定。如果在多个线程中并行调用优化器——例如google's word2vec example——我们会得到一个 hogwild 风格的无锁异步优化模式。

理论上,每次更新的数量(例如 word2vec 中每秒的字数)应该几乎是线性扩展的。但是,在 word2vec 示例中,如果 CPU 超过三个或四个,则性能并没有提升。使用 16 或 32 个内核几乎没有任何改进。也有较大的 batch_size,例如 512。CPU 使用率上升,但根据 htop 部分用于内核操作。

现在我想知道开销来自哪里?如果事情没有锁定,为什么我们不能至少获得一点性能提升?

PS:让我们把准确性放在一边。 word2vec.py 的大批量是个坏主意,我只是举个例子...

【问题讨论】:

  • 关于不同任务的多个 CPU 的不良扩展有一些讨论,一种理论是它是由线程池锁定引起的:github.com/tensorflow/tensorflow/issues/583
  • 是的,我知道那个帖子。看起来拉取请求仍在等待中......太糟糕了......
  • 你有没有想过如何提高你的 CPU 利用率?

标签: optimization machine-learning tensorflow word2vec


【解决方案1】:

当您谈论“增加核心数量”时,我假设您正在增加“并发步骤”的数量。即使在 TensorFlow 中运行一个并发步骤,也会尝试使用系统上的所有内核。如果这不是你的意思,请告诉我。

不保证通过增加并发步骤数可以获得更好的性能。只有在单个图的执行中存在可以由其他图的工作来填补的空白时,并发步骤才真正有帮助。如果所有内核总是很忙,增加并发步骤不会提高每秒处理的样本数。

可能是 word2vec 中使用的内核可以更好地并行化(更有效地使用系统上可用的内核),或者总体上更优化。

【讨论】:

  • 是的,我的意思是“并发步骤”。因此,我想这是操作内并行化(不确定 word2vec 操作在多大程度上受益。主要是 matmul 和逻辑损失)和增加并发步骤之间的冲突,作为强制互操作并行化的一种形式。也许我应该玩一下 intra_op_parallelism_threads。
  • 是的,请记住 word2vec_o​​ptimized.py 示例使用自定义编写的内核专门优化 word2vec 操作 - 使用原始操作的较慢版本不会将那么多工作融合在一起,所以你如果您关心速度,最好暂时尝试 word2vec_o​​ptimized。
  • 好吧,如果您只需要 word2vec wordembeddings,那么 word2vec_o​​ptimized 就可以了。如果你想扩展模型,这是非常不方便的,因为它通过对梯度进行硬编码来规避整个图的反向传播机制。然而,为了准确,这个技巧是关键,因为 skipgram 操作可以对 batch 数据点进行真正的 mini-batch-free 更新。 word2vec 对于深度学习框架来说可能很浅。
猜你喜欢
  • 1970-01-01
  • 2016-11-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多