模型参数、模型存储精度、参数与显存
模型参数量衡量单位
M:百万(Million)
B:十亿(Billion)
1 B = 1000 M 1B = 1000M 1B=1000M
参数存储精度
模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么样的精度去存储。
- 单精度浮点数(FP32):每个参数占用4字节(32位),提供较高的数值精度。
- 半精度浮点数(FP16):每个参数占用2字节(16位),可以节省存储空间和计算资源,但精度有所降低。
- 8位整数(INT8):每个参数占用1字节(8位),主要用于量化模型,进一步减少存储和计算开销,但精度显著降低。
- 双精度浮点数(FP64):每个参数占用8字节(64位),提供最高精度,但存储和计算成本也最高。
参数所占显存
参数显存 = 参数数量 × 每个参数的字节数(B)
这里的 B 指的是字节
总显存 = 参数显存 + 激活值显存 + 梯度显存 + 优化器状态显存
在使用 checkpoint 进行推理的时候,主要计算参数显存。
举例:
一个 7b 参数的模型,参数存储精度为 float16,那么:
- 总参数个数: 7 ∗ 10 9 7 * 10^9 7∗109
- 一个参数所占字节数: 16 / 8 = 2 ( B ) 16 / 8 = 2(B) 16/8=2(B)
- 参数所占总字节数,即参数显存: 7 ∗ 10 9 ∗ 2 = 14 ∗ 10 9 ( B ) = 14 ∗ 10 9 / 1024 / 1024 / 1024 ≈ 14 ( G ) 7 * 10^9 * 2 = 14*10^9(B)= 14*10^9 / 1024 / 1024 / 1024 ≈ 14(G) 7∗109∗2=14∗109(B)=14∗109/1024/1024/1024≈14(G)
简单来看,如果是float16,参数显存就是 参数量*2;如果是 float32,参数显存就是 参数量*4;如果是int8,参数显存就是 参数量*1。