有没有基于 Trillinos 或 Petsc 线性代数的深度学习库?
使用分布式线性代数进行深度学习
当您谈论分布式线性代数时,我认为这是指节点之间。
这可能不是一个好的设计选择。
你为什么要分发问题?
- 也许它会使训练更快!
- 也许我可以在更大的数据集上学习!
让我们谈谈(1)。
K80 的内部带宽约为480GB/s(千兆字节/秒)。Haswell 架构约为102GB/s。第一代 TPU 的带宽约为34GB/s。
相比之下,许多超级计算机中使用的互连 Infiniband 的带宽仅为25GB/s。
如果我们看一下深度学习模型的屋顶线图,它会提供一些有用的信息:
纵轴是性能,横轴是内存重用(从内存加载后每字节的操作)。
对角线是内核受内存速度限制的区域。水平线表示浮点运算速度的限制。以我所说的速度使用 Infiniband 意味着绘制一条新的对角线:
大致有两组内核:内存受限的(左侧)和计算受限的(右侧)。对于 RHS 上的内核,使它们更快的唯一方法是更快的浮点运算。这就是我们构建 TPU 的原因:物理上不可能以任何其他方式加速内核。
内存绑定内核可以通过两种方式加速:
- 通过增加算术强度(内存重用),从而将它们向上和向右滑动,以便它们被水平屋顶线之一阻挡。
- 通过提高他们所绑定的内存的速度。这通常是通过提高缓存利用率或操作的局部性来实现的。
如您所见,Infiniband 不做这些事情。因此,这种分布式操作不太可能对加速深度学习有用。
第二种可能性呢:训练更大的模型?更大的模型需要更多的训练时间,而且训练成本很高。再加上必须训练得更慢,这是不行的。
将自己限制在单个节点上怎么样?好吧,在这种情况下,有比 PETSc 更简单的库(例如 MKL)来执行相同的操作,因此无需引入 PETSc 依赖项。
为了解决其中一个评论,自 1990 年以来,每个插槽的 FLOPS 以每年约 50-60% 的速度增长,而互连带宽每年仅增长 20%,互连延迟仅以每年约 20% 的速度下降。例如,请参阅此图表:
这意味着,如果您想要获得最佳性能,您需要避免互连,随着时间的推移,这将变得更加真实。面对这种现实,避免通信的算法研究试图找到实现良好性能的方法。在深度学习中,分布式训练方法也有类似的动机。
除了通信的算法成本外,它在能源方面也很昂贵:
总的来说,这些趋势也在改变我们设计计算机的方式。例如,Summit将每个节点的大量计算能力聚集在一起以降低成本。
既然你对 ResNet 感兴趣,你可能想看看这个 repo: https ://github.com/steffi7574/LayerParallelLearning
它基于“parallel-in-layer”的思想,使用 XBraid 来分布层。它不完全是 PETSc 或 Trillinos,但很接近。
我研究了分布式学习,更具体地说,模型并行性,它与分布式线性代数有关。但我无法找到一个好的 ML 框架来做到这一点。例如,在任何 ML 框架中实现该 repo 中描述的可扩展算法都是非常具有挑战性的。