word2vec教程示例是否暗示潜在的次优实现



机器规格:

  • 英特尔(R)酷睿(TM)i7-3770 CPU@3.40GHz
  • 16GB内存
  • nvidia TitanX

(顺便说一句word2vec示例(word2vec.py和word2vec_optimized.py)中存在一个错误,如果没有给出设备指令,它将出错。我添加了一个带有tf.device('/cmp:0')的

超参数设置:

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

分析结果:

  • word2vec_optimized.py:171891字/秒(8个线程)

  • word2vec_optimized.py:9258字/秒(8个线程)

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

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

我查看了两个实现的代码,但我不明白为什么标准实现(word2vec.py)比C++手动编码内核(word2vec_kernels.cc)慢20倍

单词2vec_kernel.cc似乎没有做任何特殊的加速操作(它首先进行批量随机采样,然后在单个批次中对样本运行循环)

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

你们有没有做过任何内部评测来找出标准版本的性能瓶颈是什么?性能缺陷会对其他神经网络的训练性能构成威胁吗?

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

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

最新更新