为什么模型卡片里的weight_scale_inv即使用fp32存储,也还是存在尾数?
#33
by
Ali1234588
- opened
模型卡片里的weight_scale_inv使用fp32存储,并且仍存在尾数。如果将权重反量化回bf16,weight_scale_inv是否还要做ceil_to_ue8m0处理?
+1
根据
https://github.com/vllm-project/vllm/blob/main/vllm/model_executor/layers/quantization/utils/fp8_utils.py
里头的
y_s = tl.math.exp2(tl.ceil(tl.log2(scale_raw))) if use_ue8m0 else scale_raw
来看,这些 ue8m0的scale 是伪量化的 scale,即,既可以用原本的 e4m3 fp8 来运行,也可以用专门适配的 ue8m0 fp8来运行(以达到性能节省的目的)。
这个是我个人的理解,需要有人能够协助提供进一步说明。
伪量化的话,我理解这些scale数值应该是2的幂次?打印出来并不是这样
伪量化的话,我理解这些scale数值应该是2的幂次?打印出来并不是这样
“伪” 既是指它还保留着原本的该有的计算格式,而不是真实的量化格式。
“伪”体现在,它现在这些scale 都已经在2的次幂上取整了,之后可以直接无脑转成整数了,不用再处理这些artifacts,但反过来讲,ue8m0的损失,现在已经产生了,不可逆了。
伪量化的话,我理解这些scale数值应该是2的幂次?打印出来并不是这样
“伪” 既是指它还保留着原本的该有的计算格式,而不是真实的量化格式。
“伪”体现在,它现在这些scale 都已经在2的次幂上取整了,之后可以直接无脑转成整数了,不用再处理这些artifacts,但反过来讲,ue8m0的损失,现在已经产生了,不可逆了。
我下载了一个safetensors权值文件,观察到绝大多数的weight_inv_scale(fp32)的23位尾数都为0,因此可以判断它们确实是UE8M0数据类型。不过我同时发现所有层的self_attn.o_proj.weight_scale_inv的尾数都不是0,不知道这个该怎么解释。
是的,这点我也很疑惑
