【发布时间】: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