机器规格:
(顺便说一句 word2vec示例(word2vec.py和word2vec_optimized.py)中存在一个错误,如果没有给出设备指令,它将会遇到错误。我添加一个与tf.device(' / cpu:0')来解决)
超参数设置:
分析结果:
word2vec_optimized.py:171891字/秒(8个主题)
word2vec_optimized.py:9258字/秒(8个主题)
(优化版本与Mikolov的原始实现相当,标准版本明显更慢)
培训期间的CPU利用率大致相同(优化版本略高一些)
我查看了两个实现的代码,我无法弄清楚为什么标准实现(word2vec.py)比C ++手工编写的内核(word2vec_kernels.cc)慢20倍
word2vec_kernel.cc似乎没有做任何特别的事情来加速(它首先进行批量随机抽样,然后在一个批次中对样本进行循环)
word2vec.py版本对我来说似乎不是最优的,它使用标准的tensorflow操作,并且批处理似乎是合适的。
你们有没有做过任何内部分析来弄清楚标准版本的性能瓶颈是什么?性能问题一般会对其他神经网络的训练性能构成威胁吗?
答案 0 :(得分:2)
你们有没有做过任何内部分析来弄清楚标准版本的性能瓶颈是什么? 答:是的。我们做到了。分析导致我们决定编写优化版本。
性能错误一般会对其他神经网络的训练性能构成威胁吗? 答:这是一个复杂的问题,答案取决于情景。我不会做这样的概括。在许多其他模型中(至少对于我玩过的一些模型),计算通常由诸如matmul,卷积等的“重操作”控制。在这些模型中,损失及其梯度的计算相对便宜。另一方面,word2vec非常特殊,因为训练步骤基本上是嵌入查找+丢失的梯度+应用梯度,因为这些操作不是“融合”的,执行这些操作会产生更高的内存带宽。 TF计划开发编译器优化技术,以自动融合这些操作,并在某种程度上避免手动融合操作以优化性能。