当前位置:首页 > 杂谈 > 正文内容

人工智能模型的分布式训练技术

2025-04-09 20:49:39杂谈51

<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">12月20日,在第二届算力网络与数字经济发展论坛上,“上海算力交易平台2.0”正式发布,该平台由国家(上海)新型互联网交换中心牵头建设,依托先进的算网大脑技术、可靠的“星火·链网”区块链技术,紧跟“东数西算”等国家战略在算力网络发展导向的重要布局,积极落实《算力基础设施高质量发展行动计划》“算力浦江”行动计划重点任务,为企业提供便捷、灵活的流量交换服务,目前已累计接入通算资源6334.859P,超算资源102.024P,智算资源1816.987P。</p>
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">算力已经成为数字经济时代的关键推动力。《“十四五”数字经济发展规划》中明确提出要加快实施“东数西算”工程,通过推动云网协同发展,提升数据中心跨网络、跨地域数据交互的能力,对算力进行合理调度和优化配置,随着人工智能的迅猛发展,对算力的需求正在持续扩大,例如大模型训练等各类新型需求也在不断涌现,准确的认清需求,并从需求中发现并抓住机会,有助于算力网络建设参与方更好的找准定位、发挥价值,本文对人工智能模型的分布式训练这一技术机遇进行介绍,为大家揭开其中隐藏的挑战和机遇。</p>
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><strong style="color: blue;">1. 算力荒:大模型绕不开的大难题</strong></p>
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">自从ChatGPT引爆大模型发展热潮,众多科技企业前赴后继,纷纷投入大模型研发中,这波创业浪潮中鲜有小微初创企业的身影,甚至一些堪称“准独角兽”规模的企业,也仅集中在大模型的下游应用创新或微调中,大模型背后的神经网络技术早已颇为普及;国内拥有众多专业人才,有能力独立完成模型的设计、搭建和训练。</p>
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">由此,一类观点认为:大模型创新的主要门槛并不在算法与技术,而在于训练一个大模型、完成思路验证和检验所需的超大规模算力,算力,成为这条赛道的一面墙。</p>
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><strong style="color: blue;">2. 面向大模型的分布式方法论</strong></p>
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">当单点能力不足成为主要瓶颈后,大家总会去思考集群化、分布式的解决之道,从“东数西算”工程和“全国一体化算力网络”,到云边端协同一体化计算框架,再到群智计算以及Web3激励式计算聚合等,我们总能窥见“聚少成多”的底层逻辑。</p>
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">相比于传统计算任务,让分布式系统适配于大模型规模的神经网络训练却绝非一件简单的事,尤其是把分布式协作的范围从单个集群内部的局域网内协作,放大到城域网、广域网范围下多个中远距离集群间协作,所产生的挑战将更加复杂。</p>
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">接下来我们将从与分布式训练的两个核心部分入手,介绍模型的分布式训练,对这一挑战建立认识:</p>
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><strong style="color: blue;">2.1 分布式训练的前提:神经网络模型的分割与并行化训练</strong></p>
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">神经网络训练有前后依赖、相互耦合的特性,导致其并行化存在天然困难,以一个最基本的三层神经网络结构为例,其训练流程通常包含前向推理和反向传播两个步骤:在前向推理过程中,数据由输入层输入,在层间逐级计算传递,并在最后由输出层输出结果,随后,我们计算推理得到的结果与真实结果之间的误差,由输出层将该误差反向逐级传播计算,直到输入层,由此,我们可以得到每一层中每个参数的梯度,并由优化器根据梯度更新参数,在这一过程中,每一层的计算都依赖于其前一层(或后一层)的数据。</p><img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" style="width: 100%; margin-bottom: 20px;">
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">图1 经典的神经网络训练流程</p>
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">在这样的架构下,“模型平行方法”(Model parallelism)与“数据平行方法”(Data parallelism)是当下两种分布式训练的主要思路:</p>
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><strong style="color: blue;">2.1.1 模型平行方法</strong></p>
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">该类方法将神经网络模型分割,由不同计算节点负责不同部分的计算,每个计算节点拥有不同的参数或模型层,通过这种方法,单个节点的参数量减少,然而由于神经网络各层次间前后依赖的特性,模型平行法有时需要计算节点的“串行化”,因此相关研究往往着眼于“流水线(Pipeline)”的搭建,把切分后的模型顺序传送给流水线上的设备进行计算,通过将模型切分为粒度足够小的分片以降低流水线上计算设备的闲置率。</p><img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" style="width: 100%; margin-bottom: 20px;"><img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" style="width: 100%; margin-bottom: 20px;">
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">图2 模型平行方法、其串行化特性以及流水线搭建案例</p>
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">详细而言,模型平行训练一般包括以下几个部分:模型分割、训练流程调度优化、流水线搭建等。</p>
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">为了将训练任务分散到不同计算设备的同时避免过于频繁的数据交换,需要找到适合神经网络架构的模型分割方法,当前的主流方法一般为:层间分割与层内分割。</p>
<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">层间分割是最直观的模型分割方式:由于神经网络模型自身是分层的,可以天然地由不同设备分别负责整个神经网络中一层或多层的训练,层内分割会对神经网络结构进行进一步地细分,不同计算设备分别负责神经网络一层或多层内的部分神经元激活函数计算以及部分矩阵(张量)运算,在层内分割