机器学习工程与系统
分布式训练(distributed training)
/ dis-TRIB-yoo-ted TRAY-ning /
分布式训练,就是把一次训练任务摊到许多芯片、乃至许多台机器上,好让它在合理时间内跑完。设想一本巨大的账簿,一位会计要算上一整年才能合计完。雇上一百名会计,每人发一沓页面,让他们时不时核对一下各自的累计数——同样的活,如今几天就完了。把会计换成 GPU 或 TPU,把账簿换成神经网络的参数,这就是分布式训练。
难点在于协调。每块芯片各自在自己那一份上计算,然后它们必须就一个共享的结果达成一致,这意味着要在彼此之间、不停地通过网络来回搬运数字。这种通信纯属额外开销:时间花在「交流」而非「计算」上。所以芯片翻倍,速度从来到不了翻倍;过了某个点,再加芯片甚至会拖慢进度,因为芯片花在同步上的时间,比花在干活上的还多。工程师拼命想让通信与计算彼此重叠,并尽量压缩需要交换的数据量。
为什么这很重要:最大的那些模型根本没有别的训练办法——它们大得塞不进单块芯片的内存,在单台设备上更要算上几辈子。分布式训练正是让今天前沿模型成为可能的东西。但要把它做好,是真的很难:一台慢吞吞或宕掉的机器,就能让整个集群停摆;成本随着每一个「芯片小时」一路累加;而在铺开到数百个节点上的任务里排查问题,远比在一台计算机上修程序要棘手得多。
用 256 块 GPU 训练,理想情况下应比用一块快 256 倍。可现实里你也许只看到 200 倍:缺掉的那 56 倍,都消失在每一步之后芯片间同步参数所耗的时间里了。
接近线性,却永远不会完全线性——通信开销,是你总得缴的那笔税。
机器越多,并不总意味着训练越快。存在一个边际收益递减的临界点:在那里,让所有机器保持同步的代价,会盖过多出来那双手带来的好处。手艺在于找到那个甜点,而不是一味往问题上砸硬件。
又称
另见