了解人工智能工作负载的 I/O 需求

Solidigm 和 VAST Data 讨论存储在 AI 数据流水线中的作用

Solidigm 营销和企业传播总监 Roger Corell 和 VAST Data 的系统工程全球副总裁 Subramanian Kartik,讨论了为什么说存储是决定 AI 工作负载性能的关键,以及存储在从开发到实时推理等数据流水线各阶段所发挥的作用。

如欲获得有关 AI 工作负载和存储相关讨论的更多资源,请访问我们的 AI 解决方案和资源页面

 

视频转录文稿

请注意,出于清晰简洁的目的,本转录文本经过编辑

Roger Corell:大家好,我是 Roger Corell。我是解决方案营销和企业传播总监。今天和我一起来到这里的还有 Kartik 博士。首先感谢 Kartik 博士加入与 Solidigm 的这场讨论,我们的主题是存储对人工智能的重要性,我们还将了解 VAST Data 对于 AI 流水线中五个不同阶段的看法,它们是:摄取、数据准备、模型训练、模型检查点和推理。

您能否为我们简单介绍一下这几个阶段,各个阶段的 I/O 特征,以及这些 I/O 特征给每个阶段带来的存储挑战?

Subramanian Kartik:当然。您应该可以想象到,数据的实际摄取完全受到写入的制约。您将从外部来源获取数据。如果您从公开的初始训练集开始,这类数据通常来自云端资源。也可能是来自公司自身的内部资源,一种更传统的类 ETL 流程1。这意味着海量的入站写入,通常是顺序写入,这正是你们2非常擅长的。这也是我们的专长所在。

但是,数据准备实际上有点麻烦,因为数据通常很脏,需要经过一定的标准化处理。需要将不良数据检出。这是一条非常复杂的流水线。

而且严重依赖于 CPU。这涉及海量的读取和写入,但通常受 CPU 而不是 I/O 约束。 而且您经常会有协作项目。因此工作负载看起来有点像 HPC 集群,而不是视图集群。

Corell:您提到了数据准备阶段中的读取和写入。是的,涉及一些写入,但我想我们之前已经讨论过,您会读入海量数据,但通过 ETL,通过数据清洗和规范化等过程,您最终回写的数据比读入的数据要少得多。

Kartik:没错。您的写入量远小于读取量。而且这些通常都以读取为主,这一点毫无疑问。但处理过程也通常是顺序的。尤其是在这一阶段。这与训练中的情况形成鲜明对比。

在训练中,I/O 模式是随机的。I/O 随机化的原因是数据呈现给模型的方式必须是随机的。原因很简单。模型非常聪明。如果您以相同的顺序显示相同的数据,猜猜它们会怎么做?它们会记住数据的顺序。

这非常受限于 GPU。原因是模型非常庞大,需要分布在多个 GPU 上,并且流水线深度都比较大。因此用于并行化的技术非常精妙。跨 GPU 并行化模型是指跨多个 GPU 服务器对流水线进行并行化,并最终对数据访问进行并行化,使这些流水线和模型集的每个集群都可以处理一小部分数据。

这是一个读取密集度非常高的流程。这是数据涌入 GPU 时激起的巨大水花。从 I/O 的角度来看,这并不离谱,因为坦率地说,一旦数据进入 GPU,GPU 就需要进行大量的工作,也就是说,它们往往受到 GPU 的限制。训练阶段剩下的输出就是模型本身。

也就是一组数字。如何进行批处理是我讲过的超参数之一;也就是您的批次应该有多大。这通常与模型大小、GPU 数量、模型部署以及您的做法有关。

而且还有相应的最优化批次大小。有可能小到只有 512 个 token。也可能是这样的几千个 token 大。但基本上,您要做的是以块的形式引入数据。对其进行处理,然后再以块的形式引入下一组数据。您通常在数据加载器和 PyTorch 级进行设置,如果 PyTorch 是您正在使用的框架。

与其他参数相比,这是大语言模型训练器最倾向于优化的一个参数。请注意,这对存储没有实际影响。在训练进行过程中,而不是在检查点期间对存储的读取模式,因为检查点是大块数据的顺序写入,它的工作方式是每个 GPU 一个线程。

在训练期间,读入系统的数据量会间歇式大增。有时系统可能会预先提取一部分数据,将其存入内存,为下一个批次做好准备。但无论如何,很少会出现持续每秒读取 10 GB 或每秒 50 GB 的情况。而是间歇式地出现读取密集状况。

Corell:现在让我们来看看检查点。

Kartik:好的,让我们来看看检查点,来谈谈检查点涉及哪些工作。先警告你一下,Roger。有时候事情会不太顺利。

Corell:没错。(笑)

Kartik:可能会出问题。可能会出哪些问题呢?比方说我有 2000 个 GPU,其中有一个 GPU 罢工了。天哪。或者我的内存出错了。轰。对吧?非常糟糕。某些东西崩溃了。软件出问题了。出了个 bug。应用宕机了。发生这种情况时,不但整个训练会中断,你的全部内容都可能会因为整个 GPU 集群中的一个或数个 GPU 开小差而彻底丢失。

在这一刻,这些作业会运行很长时间。我们请一家韩国公司在 2000 多个 V100 GPU 上用韩文对 GPT 3 进行训练,训练时长长达 6 个月。训练时间为 6 个月,就这一项作业,连续训练 6 个月。

Corell:检查点,我想我们之前已经谈到过,检查非常频繁,对吧?NVIDIA 是不是建议以四小时为间隔,之类的?

Kartik:他们之前是这么建议的。现在他们开始变得更激进了一点,但这事实上取决于最终用户。也许每四个小时一次。也许每小时一次。也许每半小时一次。

无论频率如何,关键在于,检查点本质上是捕捉模型以及流水线的整体运行状态,并将其保存到磁盘文件中。

然后,当您需要从任何类型的灾难性事件中恢复时,或者有时您需要回到上个阶段,或者重新处理,因为您的模型训练并没有完全按计划进行,您需要调整我之前提到的那些超参数之一来收敛模型,而且绝对需要有检查点。有关这些检查点的基本法则是:每个参数 14 字节,这样就可以了解检查点状态的大小。因此,如果我有一个像 GPT 3 这样由 1750 亿个参数构成的模型,那么检查点状态的大小为 2.4 TB。如果我的参数模型有 5000 亿个参数,则检查点状态的大小为 7 TB。依此类推。这是一种线性关系。也就是说我每次建立检查点,都会一次性存入那么大的数据。GPT 3 的检查点大小为 2.4 TB,我必须将其写入磁盘。还要以极快的速度进行。

Corell:没错。因为 GPU 在写入过程中处于空闲状态。

Kartik:没错,它处于空闲状态。而且特定于某些部署模型,例如 NVIDIA 建议的那个部署模型。但是,是的,总体而言,有些人开始采用异步检查点,但这些是同步检查点,而且它们会在您转储数据时暂停作业。因此,尽快完成检查点更符合各方的利益。这会占用非常大的容量,因此在设定检查点的频率方面,您需要谨慎决策。但当您实际生成检查点时,要尽可能提高效率。根据 NVIDIA 给出的基本原则,生成检查点的时间不应超过检查点总间隔时间的 5%。 也就是说,如果我每隔一小时检查一次,那么只需要花上一小时的 5% 的时间,也就是大概多久?

Corell:三分钟。

Kartik:三分钟,对。我应该能够在 3 分钟内生成检查点。这是一道简单的计算题。我需要在 3 分钟内写入 2.4 TB。 轰。我算出来了。这就是我需要的带宽。

Corell:这是您的吞吐量。

Kartik:这是您的吞吐量。

Corell:对。解释很到位。有关检查点,您还有需要补充的吗?我们要继续到下个话题了。

Kartik:好。因为检查点并不是唯一重要的问题。要是我不能从检查点进行恢复,那它又有什么用呢?

Corell:现在我们来看看读取。

Kartik:好。读取要比写入繁重得多,因为检查点只涉及一小部分参与训练的 GPU。恢复则是针对所有 GPU,100%。这个数字取决于模型的大小和一些参数,但总体来讲,根据我的计算,读取和写入的比率大约是 8:1。

假设我在三分钟内完成 2.4 TB 的写入。如果我的恢复也仍想在三分钟内完成,则必须读取完 8 倍的数据量。因此读取任务非常繁重。 这与 VAST 架构非常适配,因为我们的读取性能远远优于写入。

这并不意味着我们的写入性能差,而是因为我们的读取性能超乎想象地强悍。 而且,值得再提的是,Solidigm 带来的贡献很大,因为它不会对读取产生耐用性影响。我们可以根据需要进行海量读取,无需担心影响 NAND 的耐用性,这真是棒极了。 值得注意的另一件事是:检查点和恢复是非常不对称的两个流程。恢复是比检查点繁重得多的任务。对于检查点,您需要合适的带宽,但这取决于检查的频率。您需要仔细观察和计算。我有一个非常小巧的用例,如果需要的话,我很乐意与大家分享。

Corell:再次感谢您为我们介绍检查点。下面让我们进入最后一个阶段:推理。

Kartik:从很多方面来看,推理都很有意思,因为推理不受 GPU 限制。为什么?因为训练意味着您的数据必须通过神经网络、模型以及所谓的前向传播过程,然后再通过模型返回,以重新调整权重。后者被称为反向传播过程。 而推理只涉及前向传播,因此速度非常快,超级轻松。

这通常不会受限于 I/O。事实上,我可以视需要持续泵送尽可能多的数据,直到令 CPU 和 GPU 达到饱和状态,但我不需要等待 GPU。而是由 GPU 等待存储。

但是同样,推理的特征是固有的。推理是一个几乎 100% 读取的流程。而且是吞吐量极高的读取,特别是在图像较大的情况下。在少数情况下,模型本身可能会输出图像,例如稳定扩散模型会生成图像、视频等等。 这些类型通常在一定程度上受限于 GPU,因为 GPU 必须构建您要输出的图像。这仍然属于写入,但并不真正受限于写入性能。它们的读取开销则非常大,而这正是您的优势,因为朋友,我们的读取表现真的非常非常优秀。

Corell:非常感谢。祝您在今天剩下的时间里过得开心,感谢您的分享。

Kartik:这是我的荣幸。非常感谢您的邀请。

[1] ETL 是指将来自多个来源的数据合并到数据仓库存储库中的过程。缩写 ETL 代表提取、转换和加载。该过程涉及使用一组规则来清理和组织原始数据,为存储、数据分析和机器学习做好准备。

[2] 此处指的是 Solidigm 公司,以及 VAST Data 在旗下 AI 应用中使用的 Solidigm 固态硬盘。