为什么embedding_lookup_sparse和string_to_hash_bucket在tensorflow中运行速度慢,嵌入行数很多

时间:2017-03-22 02:54:23

标签: tensorflow

在tensorflow中,embedding_lookup_sparse根据sp_ids查找嵌入行。我认为它与随机访问类似。然而,当嵌入的形状很大,即10M行时,推理花费的时间比嵌入仅有大约1M行的时间长。我认为,查找阶段和随机访问类似,哈希函数花费的时间常数很快,而且大小也不敏感。我的想法有什么不对吗?有没有什么方法可以优化,以便推断更快?谢谢!

2 个答案:

答案 0 :(得分:1)

你确定它是由embedding_lookup引起的吗?在我的情况下,我还有数百万行要查找。如果我使用GradientDecend优化器,速度非常快。如果我使用亚当或其他人,这是非常缓慢的。可能不是embedding_lookup opr会减慢你的训练速度,而是依赖于params总数的其他opr。

答案 1 :(得分:0)

当表中有很多行时,“ embedding_lookup”的工作速度确实很慢。

您可以通过阅读源代码来找出原因。这是“ embedding_lookup”中的源代码:

image of the source code: variable "np" is the length of table

image of the source code: loop with np

如您所见,这里出现了一个循环,其时间复杂度为O(表长度)。实际上,“ embedding_lookup”使用动态分区将输入数据分为多个ID分区,然后使用此循环将单词向量嵌入每个ID的分区。我认为,无论输入数据有多大,此技巧都可以将时间复杂度固定为O(表长度)。

因此,我认为提高训练速度的最佳方法是每批输入更多样本。