介绍

我们在模型开源模型平台下载模型的时候会经常看着这些参数 FP32、FP16、TF32、BF16 等参数。这个其实是指的GGUF模型的量化级别。量化级别决定于模型根据质量和准确性定义的值 (ggml_type)。 在 GGUF 规范中,值列表如下
image.png
GGUF 自身又有多种格式,主要区别在于浮点数的位数和量化的方式。
不同的格式会影响模型的大小、性能和精度,一般来说,位数越少,量化越多,模型越小,速度越快,但是精度也越低。
在HuggingFace中可以看到如下格式:
image.png

命名解释:“Q”+用于存储权重(精度)的位数+特定变体
Q(Quantization)
Q2、Q3、Q4、Q5、Q6 分别表示模型的量化位数。例如,Q2 表示 2 位量化,Q3 表示 3 位量化,以此类推
量化位数越高,模型的精度损失就越小,但同时模型的大小和计算需求也会增加
特定变体:量化方案的类型,采用了不同的量化方案来处理 attention.wv、attention.wo 和 feed_forward.w2 张量,量化方案见上表
q2_k: Uses Q4_K for the attention.vw and feed_forward.w2 tensors, Q2_K for the other tensors
q3_k_l: Uses Q5_K for the attention.wv, attention.wo, and feed_forward.w2 tensors, else Q3_K
q3_k_m: Uses Q4_K for the attention.wv, attention.wo, and feed_forward.w2 tensors, else Q3_K
q3_k_s: Uses Q3_K for all tensors
q4_0: Original quant method, 4-bit
q4_1: Higher accuracy than q4_0 but not as high as q5_0. However has quicker inference than q5 models
q4_k_m: Uses Q6_K for half of the attention.wv and feed_forward.w2 tensors, else Q4_K
q4_k_s: Uses Q4_K for all tensors
q5_0: Higher accuracy, higher resource usage and slower inference

q5_1: Even higher accuracy, resource usage and slower inference
q5_k_m: Uses Q6_K for half of the attention.wv and feed_forward.w2 tensors, else Q5_K
q5_k_s: Uses Q5_K for all tensors
q6_k: Uses Q8_K for all tensors
q8_0: Almost indistinguishable from float16. High resource use and slow. Not recommended for most users

模型训练中不同精度的问题

首先对比FP32和FP64,由于一个FP32浮点数只占32位,和FP64比有明显的优势:

  • 减少存储使用:模型训练显存大小是关键,FP32只占用一半的存储,同样的GPU可以训练更大的模型,或者同样的模型batch_size可以更大;
  • 提高训练速度:同样的两个数进行计算,FP32由于位数少,计算量更小,可以降低计算时间。

同样的道理适用于FP16和FP32的对比,但是否意味着我们都使用FP16就行了?当然不是,主要原因是位数少同时有两个劣势:

  • 位数少时精度比位数多时低,可能导致准确度不够;
  • 位数少时表示的范围比位数多时要小,可能导致数据溢出,装不下了。

混合精度

既然FP32和FP16长短各有优缺点,那我们就可以采取混合使用的方法,在模型训练的不同步骤使用不同的精度:

image.png

  • 把神经网络权重参数由初始化的FP32转为FP16;
  • 用FP16进行前向和后向计算,并进行梯度计算;
  • 把FP16的梯度转为FP32;
  • 使用FP32的梯度和学习率learning rate相乘;
  • 使用FP32更新网络权重,得到FP32的更新后的权重。

以上步骤不断循环进行。简单来讲就是使用梯度更新权重的时候用FP32,因为梯度乘上学习率后一般数值都比较小,使用FP32能防止精度不够。

混合使用精度的时候,有一个损失缩放”的技术,在反向计算前,将得到的损失扩大一个倍数,避免数据太小精度不够变为0了,扩大后在FP16可表达的范围内,反向计算后,再把梯度缩小同样的倍数,确保最后数值是对的。


汝何不上九霄
4.8k 声望1.6k 粉丝