为什么分布式TensorFlow玩具示例需要太长时间?

时间:2017-08-16 21:22:20

标签: python tensorflow distributed-computing tensorflow-gpu

我尝试使用分布式TensorFlow运行一个玩具示例进行一些矩阵乘法和加法。

我的目标是计算 df.groupby(['id','sex'],as_index=False).agg({'age':'min','rank':'min'}).\ merge(df.drop('age',1),on=['id','sex','rank'],how='left') Out[931]: id sex age rank skill 0 1 M 8 1 A 1 2 F 6 3 M 2 3 M 4 1 Q ,其中 (A^n + B^n) A[,] B[,] 矩阵。

我使用公共云上的2台计算机在一台计算机上计算LxL,在第二台计算机上计算A^n,而不是在第一台计算机上再次添加。

当机器只有CPU时 - 我的脚本效果很好 当两者都拥有GPU时 - 它无法在合理的时间内运行!它有很长的潜伏期......

我的问题 - 我的脚本中出错了什么?

请注意,对于machine2(B^n),我使用了task:1,我使用了机器1(server.join())作为此with-in图中的客户端。

task:0

1 个答案:

答案 0 :(得分:-1)

分布式计算是我们新的Universe,或一组并行的

进入此领域的第一步始终具有挑战性。丢失的确定性,在单一计算计算机之前的经验,许多新的挑战,在单节点过程协调中没有类似的问题,从分布式执行时间和分布的新数量级的许多新的惊喜中被认为是合理的(协调,如果不是死锁和/或实时锁定阻塞问题。

感谢您为A[1000,1000];B[1000,1000];n=5添加了一些定量事实~15秒“太长了” - 到目前为止一直很好。

您是否介意添加上述代码更改并在同一个真实基础架构上重新运行实验?

这将有助于其余部分开始工作( W.I.P。此处)。

  

- 感谢您提前运行+发布更新后的事实。

很难通过定量支持的声明继续使用ATM,但是,我的直觉感到怀疑是在这一个:

 def matpow( M, n ):
     return  M if ( n < 1 ) else tf.matmul( M, matpow( M, n - 1 ) )

它使用递归,对于GPU交叉编译器/汇编器分析器而言可能过于深入,并且给定张量尺度,对于数学密集内核微码“快速”的GPU SMX,SMX本地SM_registers(具有大约 22 GPU_CLK s 的延迟(好吧,可能只有8,如果智能优化以从LRU对齐的SM_L1缓存线获取)将不得不溢出到global_MEMORY(因为每个SM都有机会在重复内存访问延迟中存储小于1 KB的方式 - 最友好的SM_Registers,但matmul()绝不会重复使用矩阵的任何单元,因此延迟隐藏永远不会少付比每个global_MEMORY访问+ [PSPACE]缩放..),突然遇到 600 + GPU_CLK延迟惩罚。

While this narrated animation of HPC matmul()提到了典型的CPU / Lx-cache / Memory层次结构,这就是为什么任何 O(N^3) 处理必须在GPU上获得 {{ 1}} 大于SM_registers可能很容易看到(正如你所看到的,想象你在递归中N丢失所有缓存友好性。)

GPU内核可以获得小规模静态SM本地卷积的最佳结果(这个SMX-locality可以实现良好的[数据:SMX本地SM_REG]对齐(并且需要采用零交叉SMX通信)地方(在matmul()处理不是大约7 x 7矩阵的情况下,这种情况不适用于SM_REG-silicon,而且如果努力支付最低限度的必要,则必须启动超级智能的模板对齐体操刚刚GPU本地存储器延迟的总和(如果发生了较差的host2dev / dev2host IO,那么这个故事就会向前发展,还有更多的地方,执行性能无法控制地变得很差)。)

与典型的图像专用内核相比,即使单个matpow()的延迟成本也突然变得非常低落。 (当然,有一些先进的技术,如何绕过这种专门的硅限制,但即使matmul( A, A )成为顶级HPC块矩阵运算的主人,它也只能作为{{ {1}}一旦递归调用进入舞台 - 这甚至会杀死聪明的技巧,因为“stack” - 中间值没有 matmul() ,自动生成的内核代码将支付巨额naive-matmul()惩罚..即使是如此小的尺度,如1000x1000)。

[SPACE]