我们很高兴推出 INTELLECT-1,这是第一次分散训练运行 100 亿参数模型,邀请任何人贡献算力并参与。这使我们更接近开源 AGI 的目标。
最近,我们发布了 OpenDiLoCo,这是一个开源实现和扩展 DeepMind 的分布式低通信(DiLoCo)方法的项目,使全球范围内的人工智能模型分散训练得以实现。我们不仅重现并开源了这项工作,并且成功地将其规模扩大到 10 亿参数大小。
现在我们 进一步将规模提升 10 倍至 100 亿参数规模,比原始研究提升了约 25 倍。 这使我们进入了我们的 总体规划 中的第三步:协同训练前沿的开放基础模型:从语言模型、智能体到科学模型。
我们的目标是逐步解决分散训练问题,确保 AGI 将是开源的、透明的和可访问的,防止少数中心化实体控制 AGI 并加速人类进步。
启动合作伙伴和支持者
我们非常激动并且感谢能够有像 Hugging Face、SemiAnalysis、Arcee、Hyperbolic、Olas、Akash、Schelling AI 等领先的开源人工智能机构加入我们并为这次分散训练提供算力支持。
如何贡献算力
现在任何人都可以通过我们的平台贡献资源来推进开源人工智能的发展,未来还将更容易地使用他们自己的硬件。
- 控制台 https://app.primeintellect.ai/intelligence (观看分散训练并贡献算力)
- 代码:https://github.com/PrimeIntellect-ai/Prime
分散训练的范式转变
正如 Anthropic 共同创始人 Jack Clark 所强调的,还没有任何模型能够在全球分布式工作者之间以 100 亿参数的规模高效训练。我们最初的 OpenDiLoCo 训练突破了 10 亿参数的大关,并且通过 INTELLECT-1,我们正在达到新的分散训练规模水平。
有没有过分布式训练规模超过 100 亿参数的情况?我读过的所有关于分布式训练的论文(例如 OpenDiLoCo)似乎都只涉及大约 10 亿参数的语言模型。
— Jack Clark (@jackclarkSF) 2024 年 8 月 3 日
DiLoCo 能够在互连性差的设备上训练人工智能模型。这种方法允许在不同的“岛屿”中进行数据并行训练,仅需每几百个步骤同步一次伪梯度。这显著降低了通信频率(最多降低 500 倍),从而减少了分布式训练所需的带宽要求。
Prime:我们的分散训练框架
自从我们最初开源以来,我们在分布式训练框架方面进行了两方面的改进:
1. 算法改进
很多基于我们 OpenDiLoCo 工作的改进表明,在进一步减少通信需求方面具有很大的前景。特别是我们在伪梯度量化实验中,已经将带宽需求降低了最高 2000 倍,结合了伪梯度的 int8 量化以及每 500 步与外层优化器同步。这些结果在较小规模下已经很有效,我们对将其放大到更大模型规模感到兴奋。
2. 可扩展的分散训练框架
分布式训练是一个工程和研究上的挑战。实现跨分布式数据中心的容错 训练 是今天即使是最大的人工智能实验室也正在努力解决的问题。
我们很高兴宣布发布一个新的分散训练框架称为 Prime。Prime 支持容错训练、允许动态增加/减少计算资源,并优化一个全球分布的 GPU 网络中的通信和路由。
该框架构成了我们开源技术栈的基础,旨在支持我们自身和其他超越 OpenDiLoCo 的分散训练算法。通过构建这一基础设施,我们旨在推动全球分布式 AI 训练的可能性边界。
主要功能:
- ElasticDeviceMesh 用于容错训练:
- 在 Prime 中,我们添加了一种新的分布式抽象叫做 ElasticDeviceMesh,它封装了用于跨互联网进行容错通信的动态全局进程组以及用于节点或数据中心内通信的本地进程组。
- ElasticDeviceMesh 管理全局进程组在节点加入或离开时的重设大小。不同于标准的 torch 分布式中的 DeviceMesh,在这种情况下,进程组发生故障会崩溃并需要冷重启以重设进程组大小。
- 为了判断何时重设进程组大小,我们使用心跳机制来发现死节点并将其从进程组中移除。发生故障的节点将尝试尽力发出死亡信号以快速失败其心跳检测,从而节省其他节点等待超时的时间。
- 异步分布式检查点
- 由于模型体积庞大,检查点操作可能是一个耗时的操作,在我们的测试节点上花费时间长达 20 分钟。如果这个过程阻塞了主要训练流程,则会影响我们的计算资源利用率。
- 为最大限度地减少阻塞时间,我们首先将检查点保存至 /dev/shm 中,这是一个基于 RAM 的文件系统。此操作更快,一旦检查点创建完毕,即可解除对主要训练流程的阻塞。
- 然后使用两个子进程异步地将检查点从 /dev/shm 中复制到磁盘上的检查点目录,并上传至远程位置。
- 实时检查点恢复
- 想要在训练中途加入的节点需要能够获取最新的模型和优化器状态,这样才能加入训练。它们必须在此操作在一个外层步骤之间的窗口时间内完成,否则,它们将接收到过期的检查点。
- 为了快速完成这一过程,我们将加入节点的请求指向那些正在托管一个 sidecar HTTP 服务器的对等节点,这台服务器提供来自 /dev/shm 最新检查点的服务。
- 一旦加入的节点下载并初始化好模型后,就会跳过内部步骤,并带着零伪梯度加入到外层步骤。这是为了防止加入节点阻塞现有运行中的节点。如果加入节点也执行了内部步骤,那么它将因为下载和加载检查点所需时间而延迟进入外层步骤,从而降低集群的整体计算利用率。
- 自定义 Int8 全局规约核
- 在我们的实验中,我们发现可以对伪梯度执行 int8 量化而不影响损失曲线。这意味着如果我们用 int8 而不是 fp32 进行伪梯度通信,可以将每个外层步骤的全局规约负载大小减少 4 倍。
- 但是我们需要用 fp32 积累规约结果,在全局规约期间对其去量化和重新量化中间结果。这不被任何集体通信库所支持。
- 因此我们使用 C++ 实现了一个完全管线化的环规约核,并通过torch库 JIT 编译为自定义算子。
- 但是,鉴于所需执行的量化工作量,使用 torch 操作(quantize_per_tensor、scatter_add、index 等)过于缓慢,导致目标网络带宽利用率不足 4 Gbps。
- 于是我们使用 C++ 实现了自己的多线程 uint8 操作,提高了量化速度 60 多倍。
- 最大化带宽利用:
- 通过对 DiLoCo 伪梯度在节点内部进行分片,可以通过同时打开多个连接来最大化网络带宽利用率,从而在执行全局规约时显著提高传输速度。这一改进使部分节点的传输速度提升了 8 倍。
- 依赖公共 IP 转发在某些计算提供商中会导致差或者不稳定的 p2p 带宽。为了解决这一问题,我们采用了 VPN 技术以优