设计工具
应用

为高效的 AI 模型训练架构系统

Wes Vaske | 2019 年 6 月

如何架构系统,实现更高效的 AI 模型训练

2018 年 12 月,英特尔、Google 和 NVIDIA 提交了 MLPerf 首批基准测试结果。这些结果衡量了不同机器学习算法在提交者各种硬件上的性能,衡量标准是训练模型使其达到准确度阈值所需的时间。然而,尽管这些提交结果包含了丰富的信息,但官方在描述主要计算资源之外的系统方面仍然有所欠缺。

考虑到这一点,我一直在美光存储客户实验室进行相同的基准测试,希望更好地了解深度学习训练带给系统资源的压力。美光致力于追求内存和存储创新,帮助客户极大地改进数据的移动、访问和分析。本篇文章将概述我的测试发现,更多的结果很快会和大家见面。

我用来进行这些测试的系统是 SuperMicro SYS-4029GP-TVRT 服务器。这是一台 8-GPU 服务器,GPU 计算性能几乎与 NVIDIA DGX-1 相当。主要规格参数包括:

  • 2 个英特尔至强 Platinum 8180M CPU
    • 28 个内核,支持频率 2.5 GHz
  • 3TB 美光 DRAM
    • 24 个 128GB DDR4 2666 MHz DIMM
  • 8 个 NVIDIA V100 GPU
    • SXM 外形尺寸
    • 每个 GPU 搭载 32GB HBM2 内存
    • GPU 之间采用 NVLink Cube Mesh 互联
  • 8 个 7.68TB 美光 9300 Pro NVMe 硬盘通过 RAID-10 配置用于数据集

操作系统是安装了所有更新的 Ubuntu 18.04.2,测试使用 NVIDIA 针对其 v0.5.0 提交结果提交的代码中定义的 docker 容器完成。

我想要解答的第一个问题是,MLPerf 的提交结果是否可重现。由于 MLPerf 仍在大力开发中,证明测试结果可重现是该过程的重要一步。

MLPref 测试结果

我自己的测试结果印证了 NVIDIA 提交的结果。这并不令人意外或具有突破性,但它很重要。

在剖析实际测试结果之前,请允许我先简单介绍一下我对这些应用运行基准测试的其中一个过程。由于可用于基准测试的数据集很小,我限制了容器在训练期间可以访问的内存量,确保文件系统缓存无法容纳整个数据集。如果我不限制内存,应用会在第一个训练周期将数据集读取到内存,之后所有后续周期都将从文件系统缓存中获取数据,而不会对磁盘执行任何读取操作。

虽然这对应用运行来说是理想的情况(有足够的内存可以容纳整个数据集),但这是相当不现实的。基准测试使用的最大数据集是用于图像分类基准测试的 ImageNet 数据集,大小为 136GB。在美光,我们有大小达到好几个 TB 的训练数据集,我们的客户也表示他们发现了同样的事情,那就是,生产数据集比这些基准测试中使用的数据集要大得多。

虽然我不能更改这些基准测试使用的数据集,但我可以更改系统的配置方式,使测试结果更能代表现实情况。

我们来看看限制容器内存的做法是否有效。在不限制内存的情况下,我看到的平均磁盘吞吐量几乎可以忽略不计。但是,在我将每个容器可以访问的内存限制在一定量,使内存只能容纳一小部分数据集后,我看到的磁盘利用率截然不同(注意,这两张图表的纵轴比例尺不同)

图:不限制内存与限制内存时的平均磁盘吞吐量

对于图像分类测试,我们看到,在限制容器可以访问的内存量后,磁盘利用率提高了 61 倍。(这很有意义,因为训练过程长达 62 个周期,如果采用不限制内存的配置,系统将只需在第一个周期从磁盘读取数据集。)

好了,现在我们知道限制容器可用的内存会改变磁盘利用率,但这对训练流程的性能有什么影响呢? 事实证明,只要有速度足够快的存储,这对应用的影响就可以忽略不计:

MLRef 测试结果

这个结果比最初看起来要重要得多。我们所展示的是,只要存储能跟得上训练速度,就能完全发挥 GPU 的效能(取决于软件堆栈),即使在数据集太大、本地内存无法容纳整个数据集的情况下也是如此。

前面我们谈论了存储,接下来我们看看系统的其余部分:

CPU 利用率

这里列出的 CPU 利用率未经过归一化。这意味着 500% 大致相当于 5 个内核得到了 100% 利用(或 10 个内核得到了 50% 利用)。

运行这些注重 GPU 的应用仍然会对训练服务器中的 CPU 造成压力。根据具体应用的不同,这些数据可能表明您可以少用 CPU,也可能表明您需要使用高端 CPU。不管怎样,一定要了解您的工作负载,这样才能最好地架构自己的 AI 训练服务器。

图:GPU 内核和内存利用率

GPU 利用率方面,我们看到 GPU 处理器的利用率普遍较高,但内存利用率可能相当低,这取决于所运行的基准测试。不过,我建议对这些 GPU 内存利用率数据持保留态度。我认为内存利用率会在很大程度上受到数据集总体大小的影响。虽然我能够限制容器可用的内存,但我无法限制 GPU 内存。

这些算法在训练中使用的参数都经过调优,以便在最短的时间里达到准确度阈值。其中一个主要的可调优参数(批量大小)高度依赖于可用的 GPU 内存以及数据集总体大小。这意味着对于较小的数据集,选择不会利用全部 GPU 内存的较小批量大小可能会使训练更快完成,我想我们会在这里看到这种情况。

前面我们探讨了在单个服务器上隔离运行 AI 应用对系统的要求,虽然结果很值得关注,也为我们提供了在架构系统时可以用到的信息,但这并不能代表全部。在我的测试中,我将所有 MLPerf 数据集都加载到了 AI 训练服务器的本地存储中,总共大约 400GB,然后依次运行每个训练工作负载。

不过,在生产系统中,我们的训练服务器很少会有足够的存储容量来容纳全部训练数据集。AI 服务器的本地存储经常被用作缓存,即,数据集会被加载到缓存中,当模型开始训练时,数据集再从缓存中释放出来。此外,对于顺序训练的模型,下一个模型的数据集应在上一个模型正在训练时加载。

顺序数据摄入与并行数据摄入

我们来看看运行并行数据摄入对基准测试结果的影响。对于下面的数据,我降低了 MLPerf 基准测试的准确度要求,以便每个训练流程都可以更快完成。这能够让我们使用不同的数据摄入参数进行更多的测试迭代。此外,我将比较美光 5200 Pro SATA SSD美光 9300 Pro NVMe SSD(每款硬盘均用 8 个,采用 RAID-10 配置)。

首先,在不运行并行数据摄入时,NVMe 与 SATA 相比如何?

基准测试结果时间

在隔离执行 AI 训练工作负载时,SATA 和 NVMe 硬盘所实现的工作负载性能非常相似。这个结果并不令人意外。考虑到上面的磁盘吞吐量数据,我们很容易得出结论,8 个 5200 SATA 硬盘能够提供足以处理最密集训练工作负载(速度达到 1.2GB/s 的图像分类)的性能。

现在我们来看看在执行模型训练时,数据的摄入速度能有多快。对于下面的图表,我用了 FIO 工具来测试使用“同步 (sync)”IO 引擎处理多个任务时的文件写入。

数据摄入速率

现在的结果明显不同;在执行 AI 模型训练时,NVMe 支持的数据摄入速率要高得多。这清楚地表明,NVMe 支持上面描述的并行数据摄入和模型训练流程。然而,我们需要验证这种大量摄入不会影响训练流程的性能。

图:运行时

从这张图中,我们可以得出以下几个结论:

图像分类虽然是磁盘利用率最高的基准测试,但它对 SATA 或 NVMe 上的并行数据摄入并不敏感。
单级检测器基准测试中,数据摄入对 SATA 的性能造成了很大的影响,使之下降了约 30%。
相反,对象检测基准测试中,NVMe 的性能下降了约 7%,而 SATA 的性能保持不变。
导致这种情况的原因目前尚不清楚,但这并不妨碍我们探索如何减少性能损失。在减少性能损失方面,有两种方法可以尝试:以更大的块大小摄入数据(1MB 对比 128k),以及限制摄入吞吐率。

我们来看看这两种方案在这里提到的两个用例中的效果如何。对于在单级检测器中减少 SATA 性能损失方面,我们得到了以下结果:

图:性能损失减少

通过增加数据摄入的块大小,我们可以减少数据摄入造成的几乎所有性能损失。

接下来是对象检测基准测试:

图:对象检测性能损失减少

这里的情况略有不同。虽然增加块大小确实减少了部分性能损失,但要完全实现应用性能,我们必须降低摄入速率。

那么,从这些基准测试中,我们学到了什么?

  • 训练 AI 模型不仅会给 GPU 带来压力,也会给存储、系统内存和 CPU 资源带来压力。因此,您在架构 AI 系统时,一定要将这些因素都考虑在内。
  • 美光 9300 PRO NVMe SSD 支持的数据摄入速率比企业级 SATA SSD 高得多,有助于实现并行数据科学工作流
  • 大量数据摄入会对模型训练所需时间产生不利影响,这不仅仅与模型训练的读取吞吐量有关。
  • 增加数据摄入的块大小或限制写入吞吐率可减少运行并行数据摄入造成的性能损失。

我们会继续探索 AI 和数据科学应用的性能,明确如何更好地为您的工作负载架构解决方案。一旦对这个不断变化的生态系统有了更多的了解,我们会将相关信息发布到这里。

手里拿着笔记本电脑在走路的人

SMTS Systems Performance Engineer

Wes Vaske

Wes Vaske is a principal storage solution engineer with Micron.