分享
第 05 章:数值精度与显存账本
输入“/”快速插入内容
第 05 章:数值精度与显存账本
用户200
用户200
用户8169
用户8169
5月21日修改
经过上一章,咱们已经知道训练和推理在显存开销上完全是两套逻辑了。但之前我们在算账的时候,其实一直隐藏了一个大前提:也就是每个数字到底占多大地方?
你看白板上这个精密的“显存计算器”,左边那一排长短不一的色块,代表的就是深度学习里的“精度”。精度这事儿说白了,就是计算机用几个字节(Byte)来记住一个数字。给的字节越多,数字就记得越准、范围越大,但同时显存也被吃得越狠。
作为 AI Infra 工程师,你每天的工作其实就是在天平的两端做取舍:怎么在保证模型变笨得不太明显的前提下,尽量用更少的字节把它塞进有限的显卡里。把下面这几种精度的账算明白了,你就能对任何模型做到心里有数。
一、一个数字占几个字节:FP32 到 INT4 的阶梯
咱们先来看看这几种最常见的精度规格。
最上面那条深蓝色的长条是 FP32(单精度浮点),足足占了 32 个格子(也就是 4 个字节)。这是以前深度学习的标配,特别准。往下看,蓝色的 FP16 和浅蓝的 BF16 都被砍掉了一半,只占 16 个格子(2 个字节)。
再往下,为了极致的省空间,大家开始用整数:绿色的 INT8 只占 1 个字节,而最极端的橙色 INT4,一个数字只分配半个字节。
你看右边算出来的显存差距:如果存 1 亿个参数,用 FP32 需要 400MB,但用 INT4 只要 50MB。在实际工程里,把这些倍数关系(4B、2B、1B、0.5B)当乘法口诀背下来,算显存的时候就能做到秒出答案。
二、FP16 vs BF16:范围 vs 精度的取舍
这里得专门聊聊 FP16 和 BF16,这两个家伙虽然都占 2 个字节,但内部的构造可大不一样,这是面试的绝对高频考点。
你看左边的 FP16,它把更多的格子留给了“尾数”(也就是小数部分),所以它记得很准,但代价是“指数”范围很小,算出来的数稍微大一点就溢出了(爆掉)。如果你用它来做训练,经常得配合 Loss Scaling 这种打补丁的技巧。
再看右边的 BF16,它非常聪明地把“指数”拉宽到了和 FP32 一模一样的程度!这就意味着,凡是 FP32 能装下的天文数字,BF16 也绝对装得下,训练起来极其稳定,根本不担心溢出。虽然它的小数部分被砍掉了很多(精度变低了),但大语言模型(LLM)其实对这种微小的精度丢失并不敏感。所以现在在大模型训练里,BF16 已经是绝对的标配了。
三、一个参数 × 字节数 = 权重显存