上篇文章链接LLM 参数,显存,Tflops? 训练篇(3) (qq.com)
上上篇文章链接 LLM 参数,显存,Tflops? 训练篇(2) (qq.com)
上上上篇文章链接 LLM 参数,显存,Tflops? 训练篇(1) (qq.com)
书接前文
回忆一下前几篇文章我们主要讲到的:
- 如何精确的推导所有的训练语句或者token过一个模型的所有参数,训练一个epcho需要多少算力
- 推导所有的训练语句或者token过一个模型的所有参数,训练一个epcho需要多少算力
- 如何评估真实场景训练时间
前几篇文章都是围绕着算力也就是TLOPS的需求展开的,这个顺序看起来挺流畅的,也相对好理解。
但是其实真正的项目里,我们训练的第一步大多数情况是要评估我训练一个模型,我最起码需要多少张卡,这是一个标准基线,大多数哥们在面对GPU或者NPU资源的时候往往前期的经历都是以穷哥们儿身份为主,不太可能豪到公司上来就给你2048块卡让你折腾
那我们是怎么知道我训练一个LLM,最起码要几张卡呢?
当然你要是非抬杠,你说我就训练一个7b,然后你batchsize 为1,sequence number为512,GQA就给4个头,那你属实一张24G卡,比如4090,或者X090,就足够训练了
我们肯定不聊这个啊,我们毕竟是严谨的技术类blog
现实世界里,你训练的模型先不考虑其他因素,我们只考虑静态的显存占用
一般来讲你装载模型(主要指训练这块)你模型的参数是以FP16来计算的(A100之后选择BF16的居多,因为防止计算的时候上溢出)
那么由于一个参数被表示为了16位的浮点数,所以它也就占用2个byte ,16bit/2 么
拿我刚才举的那个抬杠的例子,7B的话,你的静态显存占用量,指模型的所有参数被load到显存里,如果以BF16的话,要占据14个G,这一下子想用T4来训练7B的人基本就傻了,我都不跟你谈什么70B,70B要是BF16,静态显存占用就是140G,那现在业界要能装的下的只有AMD 的MI300X(192G)和H200了,这两玩意貌似几乎都没供货.....
那我买不到(主要是买不起)我还不训了吗?
当然不是,这里就涉及到一个概念:模型并行
模型并行其实有两个概念,一个老概念,一个新概念
老概念:简单粗暴,就把模型劈到一个机箱的不同的几块卡上面,比如我有8*A100/80G的,那我就640G了,甚至GPT-3(130B*2也就260个G)我严格意义上讲我都装得下啊
新概念:就是围绕着现代训练体系走的,模型并行单指可以把模型劈开,但是放在哪说到就大了,可以有放在机箱内部的tensor parallel,有跨机箱流水线的pipeline parallel,这两基本上都是NV 的megatron的概念,现在也被普及成事实的标准了,这块其实东西挺多的,我后面需要单开篇幅讲
有了模型并行,我们就可以让单卡没有那么大显存的计算设备通过多卡并行的方式承载更大的模型,来完成装载模型到显存的任务
好的,我想以上的静态显存问题,大家应该都理解了,但是我训练模型就是为了load 我的模型参数到显存吗?
当然不是,我load 模型参数的核心目的是训练参数的权重,这里就涉及到了第二个也是比较麻烦的概念,训练时的Activation显存占用(下节课讲)
本章结束