word2vec教程示例是否意味着潜在的次优实现?

时间:2015-12-13 09:04:30

标签: tensorflow

机器规格:

  • Intel(R)Core(TM)i7-3770 CPU @ 3.40GHz
  • 16GB RAM
  • nvidia TitanX

(顺便说一句 word2vec示例(word2vec.py和word2vec_o​​ptimized.py)中存在一个错误,如果没有给出设备指令,它将会遇到错误。我添加一个与tf.device(' / cpu:0')来解决)

超参数设置:

  • 默认模型超级参数+8个并发线程
  • 使用text8作为训练数据,使用questions-words.txt作为测试。

分析结果:

  • word2vec_o​​ptimized.py:171891字/秒(8个主题)

  • word2vec_o​​ptimized.py:9258字/秒(8个主题)

(优化版本与Mikolov的原始实现相当,标准版本明显更慢)

培训期间的CPU利用率大致相同(优化版本略高一些)

我查看了两个实现的代码,我无法弄清楚为什么标准实现(word2vec.py)比C ++手工编写的内核(word2vec_kernels.cc)慢20倍

word2vec_kernel.cc似乎没有做任何特别的事情来加速(它首先进行批量随机抽样,然后在一个批次中对样本进行循环)

word2vec.py版本对我来说似乎不是最优的,它使用标准的tensorflow操作,并且批处理似乎是合适的。

你们有没有做过任何内部分析来弄清楚标准版本的性能瓶颈是什么?性能问题一般会对其他神经网络的训练性能构成威胁吗?

1 个答案:

答案 0 :(得分:2)

你们有没有做过任何内部分析来弄清楚标准版本的性能瓶颈是什么? 答:是的。我们做到了。分析导致我们决定编写优化版本。

性能错误一般会对其他神经网络的训练性能构成威胁吗? 答:这是一个复杂的问题,答案取决于情景。我不会做这样的概括。在许多其他模型中(至少对于我玩过的一些模型),计算通常由诸如matmul,卷积等的“重操作”控制。在这些模型中,损失及其梯度的计算相对便宜。另一方面,word2vec非常特殊,因为训练步骤基本上是嵌入查找+丢失的梯度+应用梯度,因为这些操作不是“融合”的,执行这些操作会产生更高的内存带宽。 TF计划开发编译器优化技术,以自动融合这些操作,并在某种程度上避免手动融合操作以优化性能。