Saturn:训练大型语言模型和其他神经网络的新方法

Saturn New approach to training large language models and other neural networks.

编者注:Kabir Nagrecha将在2023年秋季的ODSC West 2023担任演讲嘉宾。记得去参加他的演讲,题为“通过联合系统优化,实现开源大型模型微调的民主化”!

模型规模已成为现代深度学习实践中绝对必要的一个方面。亿级参数的大型语言模型(LLM)的成功鼓励从业者推动模型尺寸的极限。研究人员和从业者现在正在构建越来越大、越来越耗内存的模型架构,以提高准确性和模型质量。

但是,这些规模引入了无法忽视的基础设施挑战。模型训练的资源需求急剧增加。如果我们从UCSD和行业合作伙伴的合作中学到了一件事,那就是深度学习任务从来都不是孤立运行的。如果你正在训练一个模型,你可能正在训练十几个——超参数优化、多用户集群和迭代探索都需要进行多模型训练,进一步增加了计算需求。

在本博文中,我们将概述我们在Saturn上的工作,Saturn是我们最近开源的同时训练多个大型模型的工具。Saturn与用于大型模型训练的行业标准工具(如HuggingFace、PyTorch的FSDP、Google的GPipe、FairScale、XFormers等)完美集成。我们将演示Saturn如何在这种新的关键环境中帮助优化执行,降低成本并提高训练效率。

为什么训练大型模型?为什么同时训练多个模型?

“增大模型尺寸确实提高了我们的准确性。这已经成为一个普遍规则——越大越好。”(Saturn行业用户)

最近的研究表明,较大的模型在各种基准测试中的表现更好。

语言模型是少样本学习器(Brown等人,2020年)

因此,如果你想构建最准确的模型来支持你的应用程序,你可能会使用大规模的模型架构——也许是LLaMA模型,也许是GPT-J,甚至是GPT-2。

显然,训练大型模型有足够的动机。但是Saturn的核心理念是同时优化多个大型模型。

“在将任何内容推送到生产之前,我们可能会经历一百个……甚至一千个不同的模型迭代。而且这个过程每天都会重复。”(Saturn用户关于他们的生产流程)

实际中的深度学习几乎总是由多个训练任务组成。行业集群接收来自数百个用户和流程的任务。自动化生产流程可能会触发数十个具有不同配置的训练任务(例如学习率、批量大小、模型架构变体),以找到最准确的一个用于部署。个别研究人员可能会提交多个探索性任务来评估不同的方法。一天结束时,集群可能已经接收到数千个任务来管理。

有一个未解决的问题,涉及大型模型训练和多模型执行的挑战需要解决。Saturn正是专门为此设置进行优化。

Saturn是什么?我该如何使用它?

当同时处理多个大型模型时,有三个关键问题需要考虑。

首先是并行化。大型模型通常需要多个GPU进行内存分布和更高的训练吞吐量。设计并行执行方案是一个挑战——有几十种(甚至上百种!)不同的技术可供选择!FSDP、管道并行、3D并行等等——选择最合适的方案将取决于你的GPU、互联方式、模型架构,甚至是超参数。这是一个难以驾驭的领域,选择错误的方法可能会导致严重的性能影响。

其次是资源分配。在拥有100个GPU和30个提交的任务的集群中,应该如何分配GPU给这些任务?优化吞吐量需要自动找到一个优化的资源分配计划。

第三是调度。为了最小化端到端运行时间,应该如何安排执行顺序?是在模型A之前运行模型B还是在模型C之前运行模型A?

请注意,这些问题都是相互关联的。您使用的资源分配计划将限制时间表,并影响最佳并行选择,反之亦然。因此,我们必须将其作为一个联合问题来解决。

这正是Saturn所做的。使用Saturn,您只需提交一批训练作业,然后观察一个解决所有这些问题的计划自动生成。Saturn对所有作业进行快速分析扫描,然后使用混合整数线性规划求解器生成一个优化的执行计划。它易于扩展和注册新的并行化技术,因此不会因为研究进展而落后。结合一些机制,如高效调度的内省,它能够显著减少批处理多模型作业的运行时间。实践中,我们发现它能够将执行时间和成本降低多达2倍,同时减轻开发人员的工作量。

使用Saturn更高效地运行作业是一个简单的过程。我们的GitHub存储库中包含一个示例工作流程,但这是一个简短的说明。

首先,将您的模型加载/初始化函数包装在Saturn的“Task”结构中。

from saturn import Task
t1 = Task(load_model, load_dataloader, loss_function, hyperparameters)

接下来,使用Saturn的“Library”注册您想要使用的任何并行化技术。

from saturn.library import register
from saturn.core.executors.Technique import BaseTechnique 

class MyExecutor(BaseTechnique):
   def execute(task, gpus, task_id, batch_count):
      # 训练模型
      return
   def search(task, gpus, task_id):
      # 优化任何内部参数
      # 这些参数会自动与提交的任务相关联
      return parameters

register(“my_parallelism”, MyExecutor)

最后,提交任务列表进行分析和执行。

from saturn.trial_runner.PerformanceEvaluator import search
from saturn import orchestrate

search([t1, t2, t3, t4]) # 对每个任务进行分析和评估
orchestrate([t1, t2, t3, t4]) # 协调和管理执行

结论和要点

Saturn能够大幅提速同时训练多个大型模型的工作负载,速度提升超过2倍。它与HuggingFace等标准工具完全兼容。下次您尝试微调LLaMA模型或构建自己的LLM时,考虑使用Saturn来降低成本并加快运行时间!如果您想了解更多信息,可以在这里找到我们关于Saturn的论文。

我们目前正在寻找新的贡献者和用户,如果您对Saturn感兴趣,请考虑访问我们最近在GitHub上开源的存储库,网址为https://github.com/knagrecha/saturn!

关于作者/ODSC West 2023演讲者:

Kabir Nagrecha是加州大学圣地亚哥分校的博士候选人,与Arun Kumar教授和Hao Zhang教授合作。他获得了Meta研究奖学金,以及加州大学圣地亚哥分校Halicioglu数据科学研究所和Jacobs工程学院的奖学金。

Kabir是加州大学圣地亚哥分校有史以来最年轻的博士生,他在17岁开始攻读博士学位。他之前曾与苹果、Meta和Netflix等公司合作,构建了支持Siri和Netflix推荐算法等广泛使用的服务的核心基础设施。

Linkedin: https://www.linkedin.com/in/kabir-nagrecha-952591152/

网站: https://kabirnagrecha.com/