Parallel processing 内部有tensorflow聚集的tensorflow映射\u fn未并行化

Parallel processing 内部有tensorflow聚集的tensorflow映射\u fn未并行化,parallel-processing,tensorflow,Parallel Processing,Tensorflow,我正在编写的代码有点奇怪,但相当简单,我已经将其简化为一个基本的虚拟案例,在这个案例中,问题突然出现 要点是我有一个矩阵,其中元素实际上是第二个矩阵的索引,在本例中是最近邻,每一行表示一个“查询”,每一列表示一个邻居。我需要抓取这些索引所指向的实际样本,并将它们放入3D张量中(是的,如果两个“查询”共享一个邻居,则会出现重复项) 随机生成值的示例代码演示了以下问题 randIndices = tf.random_uniform([1000,10],0,1000,dtype = tf.int32)

我正在编写的代码有点奇怪,但相当简单,我已经将其简化为一个基本的虚拟案例,在这个案例中,问题突然出现

要点是我有一个矩阵,其中元素实际上是第二个矩阵的索引,在本例中是最近邻,每一行表示一个“查询”,每一列表示一个邻居。我需要抓取这些索引所指向的实际样本,并将它们放入3D张量中(是的,如果两个“查询”共享一个邻居,则会出现重复项)

随机生成值的示例代码演示了以下问题

randIndices = tf.random_uniform([1000,10],0,1000,dtype = tf.int32)
randSamples2= tf.random_uniform([1000,6],0,1)

output = tf.map_fn(lambda x: tf.gather(randSamples2,x),randIndices, dtype = tf.float32)
编辑:我已经重写了我的特定应用程序,将查询展平,在没有“循环”的情况下对其使用聚集,然后在操作完成后重新调整输出。对100000个“样本”和10000组10个索引执行此操作大约需要1毫秒,因此这对我来说不再是问题,但我仍然很好奇为什么它会这样做

我使用以下方法对此进行了分析:

这就是剖析器给我的。

仔细看一看乱七八糟的东西。操作应该是并行的,但不是。

将其与在matmul上执行相同分析的结果进行比较:

randSamples = tf.random_uniform([100,1000,1000],0,1)
randWeights = tf.random_uniform([1000,100],0,1)
output = tf.map_fn(lambda x: tf.matmul(x,randWeights), randSamples)
这就是我使用聚集函数的目标。

是什么阻止tensorflow并行化此操作?似乎任何两个聚集操作都不需要任何关于彼此的知识才能正常运行,因此这似乎是一个“令人尴尬”的并行问题

randSamples = tf.random_uniform([100,1000,1000],0,1)
randWeights = tf.random_uniform([1000,100],0,1)
output = tf.map_fn(lambda x: tf.matmul(x,randWeights), randSamples)