量化W8A8和W8A16是什么?


1. 什么是量化

量化技术是一种用来减少模型大小和提高推理速度的技术。量化指的是将模型的参数从高精度表示(如常见的32位浮点数FP32)转换到更低精度的整数表示,以节省内存带宽和计算资源。

2. W8A8 和 W8A16

“W8A8” 和 “W8A16” 是两种不同的量化策略,具体如下:

(1)W8A8 :指的是权重(Weight)使用8位整数(INT8)量化,激活值(Activation)也使用8位整数量化。这种量化方式通常会显著减少模型大小,并且在某些情况下可以保持相当高的准确性。SmoothQuant 是一种实现了 W8A8 量化的技术,它能够在保持较高准确性的前提下,将模型的权重和激活值都降低到 INT8 精度。

(2)W8A16 :指权重使用8位整数量化,但是激活值仍然保留较高的精度,通常是使用16位浮点数(FP16)或者混合精度(Mixed Precision)。这种方式相比于 W8A8,可能会提供更好的模型准确性,但是代价是在激活值上保留了更高的精度,因此可能不会像 W8A8 那样大幅度减少内存使用。

选择哪种量化方式取决于多种因素,包括模型的具体需求、硬件支持、以及对推理速度和准确性的权衡。在实际应用中,可能需要根据具体的场景来选择最适合的量化策略。例如,如果部署环境对内存带宽有严格限制,那么 W8A8 可能是更好的选择;而如果模型准确性是首要考虑的因素,则可能需要使用 W8A16 或其他更高精度的量化方案。

3. W8A8 量化

3.1 权重量化

(1)确定量化范围:找到权重的最大绝对值,作为量化范围的参考。
(2)选择量化级别:确定使用8位量化,即256个离散值。
(3)计算量化参数

  • 缩放因子 s c a l e scale scale s c a l e = m a x _ v a l u e / 127 scale = max\_value / 127 scale=max_value/127,这里127是因为8位整数范围是从-128到127
  • 零点 z e r o _ p o i n t zero\_point zero_point:对于对称量化,零点通常设置为128(无符号)或0(有符号)

(4)应用量化

  • 对于每个权重 w w w,计算量化后的值 q q q q = r o u n d ( w / s c a l e ) + z e r o _ p o i n t q = round(w / scale) + zero\_point q=round(w/scale)+zero_point
  • q q q 限制在8位整数范围内,即 q = c l i p ( q , − 128 , 127 ) q = clip(q, -128, 127) q=clip(q,128,127)

3.2 激活量化

(1)校准:使用校准数据集来确定激活值的最大和最小值。
(2)计算量化参数

  • 缩放因子 s c a l e scale scale s c a l e = ( m a x _ v a l u e − m i n _ v a l u e ) / 255 scale = (max\_value - min\_value) / 255 scale=(max_valuemin_value)/255
  • 零点 z e r o _ p o i n t zero\_point zero_point z e r o _ p o i n t = r o u n d ( ( 0 − m i n _ v a l u e ) / s c a l e ) zero\_point = round((0 - min\_value) / scale) zero_point=round((0min_value)/scale)

(3)应用量化

  • 对于每个激活值 a a a,计算量化后的值 q q q q = r o u n d ( a / s c a l e ) + z e r o _ p o i n t q = round(a / scale) + zero\_point q=round(a/scale)+zero_point
  • q q q 限制在8位整数范围内,即 q = c l i p ( q , 0 , 255 ) q = clip(q, 0, 255) q=clip(q,0,255) q = c l i p ( q , − 128 , 127 ) q = clip(q, -128, 127) q=clip(q,128,127),取决于是否使用无符号整数

4. W8A16 量化

4.1 权重量化

(1)确定量化范围:找到权重的最大绝对值,作为量化范围的参考。
(2)选择量化级别:确定使用8位量化,即256个离散值。
(3)计算量化参数

  • 缩放因子 s c a l e scale scale s c a l e = m a x _ v a l u e / 127 scale = max\_value / 127 scale=max_value/127
  • 零点 z e r o _ p o i n t zero\_point zero_point:零点通常设置为128(无符号)或0(有符号)。

(4)应用量化

  • 对于每个权重 w w w,计算量化后的值 q q q q = r o u n d ( w / s c a l e ) + z e r o _ p o i n t q = round(w / scale) + zero\_point q=round(w/scale)+zero_point
  • q q q 限制在8位整数范围内,即 q = c l i p ( q , − 128 , 127 ) q = clip(q, -128, 127) q=clip(q,128,127)

4.2 激活量化

(1)校准:使用校准数据集来确定激活值的最大和最小值。
(2)计算量化参数

  • 缩放因子 s c a l e scale scale s c a l e = ( m a x _ v a l u e − m i n _ v a l u e ) / 65535 scale = (max\_value - min\_value) / 65535 scale=(max_valuemin_value)/65535
  • 零点 z e r o _ p o i n t zero\_point zero_point z e r o _ p o i n t = r o u n d ( ( 0 − m i n _ v a l u e ) / s c a l e ) zero\_point = round((0 - min\_value) / scale) zero_point=round((0min_value)/scale)

(3)应用量化

  • 对于每个激活值 a a a,计算量化后的值 q q q q = r o u n d ( a / s c a l e ) + z e r o _ p o i n t q = round(a / scale) + zero\_point q=round(a/scale)+zero_point
  • q q q 限制在16位整数范围内,即 q = c l i p ( q , 0 , 65535 ) q = clip(q, 0, 65535) q=clip(q,0,65535) q = c l i p ( q , − 32768 , 32767 ) q = clip(q, -32768, 32767) q=clip(q,32768,32767),取决于是否使用无符号整数。

欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;

欢迎关注知乎/CSDN:SmallerFL

也欢迎关注我的wx公众号(精选高质量文章):一个比特定乾坤

在这里插入图片描述

### Q4 Q8 的含义 在大模型领域,Q4 Q8 表示不同的量化精度级别。具体来说: - **Q4** 指的是 INT4 量化,即将浮点数权重转换为 4 位整数表示。这种量化方式显著减少了模型的存储需求并提高了推理速度,但可能会带来一定的精度损失[^2]。 - **Q8** 则指的是 INT8 量化,即使用 8 位整数来近似原始浮点权值。相比 Q4,Q8 提供更高的数值精度,通常伴随着更大的模型尺寸稍慢一些的执行效率。 对于实际应用中的选择取决于具体的业务需求以及对吞吐量与延迟的不同偏好。例如,在追求高吞吐量的同时能够接受一般水平延迟的情况下,可以选择 W8A8 方案;而对于那些更看重低延迟的应用,则更适合采用 W4A16 设置[^1]。 ```python import numpy as np def quantize_weights(weights, q_level='int8'): """ Quantizes the given weights to either int4 or int8. Args: weights (np.ndarray): Original floating-point model weights. q_level (str): The target quantization level ('int4' or 'int8'). Returns: np.ndarray: Quantized integer weights. """ if q_level == 'int4': scale_factor = np.max(np.abs(weights)) / ((2**(4)-1)/2) return np.round((weights / scale_factor)).astype(np.int8).clip(-8, 7) elif q_level == 'int8': scale_factor = np.max(np.abs(weights)) / ((2**(8)-1)/2) return np.round((weights / scale_factor)).astype(np.int8) # Example usage with dummy data dummy_weights = np.random.randn(100, 100) quantized_int4 = quantize_weights(dummy_weights, 'int4') print(f"Quantized Weights using {q_level}: \n", quantized_int4[:5]) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmallerFL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值