为什么模型卡片里的weight_scale_inv即使用fp32存储,也还是存在尾数?

#33
by Ali1234588 - opened

模型卡片里的weight_scale_inv使用fp32存储,并且仍存在尾数。如果将权重反量化回bf16,weight_scale_inv是否还要做ceil_to_ue8m0处理?

根据

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,不知道这个该怎么解释。
image.png

image.png

是的,这点我也很疑惑

Sign up or log in to comment