当前位置: 华文问答 > 数码

为什么说大模型训练很难?

2021-11-11数码

之前做过一部分预训练的工作,训的模型是7B,13B大小,分享一下个人的感受

首先是训练方面,这两个量级的模型训练起来其实和小模型差不多,参数设置上有两个地方需要注意:一个是学习率需要略小,在e-5这个量级就可以,其次是global_batch需要比较大,一般在2-4M tokens,这样训练起来会比较稳定

对于7B这个量级的模型,一般stage=2,tp=1,zero1=8,因为如果单卡能放下一份模型的参数和梯度就不需要用tp,不然会很慢,这样相当于一张80G卡存一份完整模型参数和部分优化器转态,模型参数占7 * 2 =14G,而优化器状态则分布在单节点的8张GPU内,平均每张卡占7 * (4+4+4+2)/8 =13G,这个就相当于在单节点内做8路数据并行,在seq_len=2048的情况下,单张卡的micro_batch大概可以到8左右,如果不进行梯度累积,global_batch=2M的情况下至少需要128张卡( 8 * 2048 * 128),24h大概能训30-40B tokens,1T tokens大概训一个月左右(凭印象写的,如果有错误欢迎指正),设置好后剩下的就交给时间了,每天上去看一下loss,如果没有机器故障,通常是可以一把从头训到尾的,不需要中间再去调各种参数

而大到千亿这个级别的模型,难度就上来了,会出现一些数值计算/收敛稳定性等各方面的问题,除此之外,机器数量一多起来后故障率就非常高了, 感兴趣可以解了一下GLM 130B训练的分享报告,或者Mate训OPT的logbook ,如Meta这种大厂调度千卡的故障也是非常多的,这是没法避免的

我个人感觉在模型训练之外其实更重要的是数据,在同一scale下,数据质量直接决定了模型性能的上限。模型大家可能会开源,但数据,特别是有价值的数据一般是不会轻易开源的。英文语料数量很大,可以通过严格筛选来得到高质量的diversity语料,而且也已经有很多开源的现成可用的语料数据,比如c4,Pipe,RedPajam,refinedweb。中文早先开源的不多,现在大家也已经开始卷数据了,我了解的一些开源数据有:

  • WuDaoCorpus,200G中文
  • TigerBot,100G中英
  • SkyPile-150B,150B tokens
  • WanJuan ,文本1TGB,应该是目前开源最大的一个了
  • CCI ,104GB文本
  • 但总体规模上比英文还是小很多,而且中文语料的质量也一言难尽,广告,AIGC内容 ,错误的内容,违反安全的内容等各种乱七八糟的数据也很多,所以数据这方面不是一个人两个人就能做的,得需要一个专门的数据团队来专项负责。

    最后一点是,训大模型的试错成本非常高,时间、机器、人力搭进去了,但谁也没法保证训出来的模型效果就一定好,因为数据质量比较难以客观量化,所以炼丹前也很难判断这批数据训出来的模型效果到底如何,风险比较大,只能一边训一般观察模型的状态,如果没有达到预期,只能通过持续添加更高质量的数据来调整。并且按照现在开源模型与日俱增的训练数据量来看,后续开源的基础模型估计都得2T tokens起步了,否则效果难以比肩(按照scaling law来看),开源出来也没太大意义,因为大家不会去用。不过后面开源的模型还是有一定的数据优势的,因为可以用更新的数据来训,而benchmark相对来说是旧的,所以刷分可能相对更容易一些,分不高没法做pr,但分高并不代表模型的水平。

    所以综合来看,训大模型的难不是单点技术上的难,而是系统性的难,需要数据,炼丹师,框架,硬件等几方面人力间的紧密配合,并且围绕着炼丹师的需求来开展工作。这也是为什么创业公司往往更容易做出成果,因为大家目标比较专注一致,执行力就会比较强,而大公司由于各种原因就非常容易互相扯皮。