使用分布式线性代数进行深度学习

计算科学 并行计算 机器学习
2021-12-21 15:41:17

有没有基于 Trillinos 或 Petsc 线性代数的深度学习库?

2个回答

当您谈论分布式线性代数时,我认为这是指节点之间。

这可能不是一个好的设计选择。

你为什么要分发问题?

  1. 也许它会使训练更快!
  2. 也许我可以在更大的数据集上学习!

让我们谈谈(1)。

K80 的内部带宽约为480GB/s(千兆字节/秒)。Haswell 架构约为102GB/s第一代 TPU 的带宽约为34GB/s

相比之下,许多超级计算机中使用的互连 Infiniband 的带宽仅为25GB/s

如果我们看一下深度学习模型的屋顶线图,它会提供一些有用的信息:

深度学习内核的屋顶线图

纵轴是性能,横轴是内存重用(从内存加载后每字节的操作)。

对角线是内核受内存速度限制的区域。水平线表示浮点运算速度的限制。以我所说的速度使用 Infiniband 意味着绘制一条新的对角线:

使用 Infiniband 进行深度学习内核的 Rooflines

大致有两组内核:内存受限的(左侧)和计算受限的(右侧)。对于 RHS 上的内核,使它们更快的唯一方法是更快的浮点运算。这就是我们构建 TPU 的原因:物理上不可能以任何其他方式加速内核。

内存绑定内核可以通过两种方式加速:

  1. 通过增加算术强度(内存重用),从而将它们向上和向右滑动,以便它们被水平屋顶线之一阻挡。
  2. 通过提高他们所绑定的内存的速度。这通常是通过提高缓存利用率或操作的局部性来实现的。

如您所见,Infiniband 不做这些事情。因此,这种分布式操作不太可能对加速深度学习有用。

第二种可能性呢:训练更大的模型?更大的模型需要更多的训练时间,而且训练成本很高。再加上必须训练得更慢,这是不行的。

将自己限制在单个节点上怎么样?好吧,在这种情况下,有比 PETSc 更简单的库(例如 MKL)来执行相同的操作,因此无需引入 PETSc 依赖项。

为了解决其中一个评论,自 1990 年以来,每个插槽的 FLOPS 以每年约 50-60% 的速度增长,而互连带宽每年仅增长 20%,互连延迟仅以每年约 20% 的速度下降。例如,请参阅此图表:

FLOPS、内存和网络随时间变化的性能

这意味着,如果您想要获得最佳性能,您需要避免互连,随着时间的推移,这将变得更加真实。面对这种现实,避免通信的算法研究试图找到实现良好性能的方法。在深度学习中,分布式训练方法也有类似的动机。

除了通信的算法成本外,它在能源方面也很昂贵:

2010 年数据移动的能源成本:片上与片外

总的来说,这些趋势也在改变我们设计计算机的方式。例如,Summit将每个节点的大量计算能力聚集在一起以降低成本。

既然你对 ResNet 感兴趣,你可能想看看这个 repo: https ://github.com/steffi7574/LayerParallelLearning

它基于“parallel-in-layer”的思想,使用 XBraid 来分布层。它不完全是 PETSc 或 Trillinos,但很接近。

我研究了分布式学习,更具体地说,模型并行性,它与分布式线性代数有关。但我无法找到一个好的 ML 框架来做到这一点。例如,在任何 ML 框架中实现该 repo 中描述的可扩展算法都是非常具有挑战性的。