英伟达在推广其H20的时候,会强调其FP8推理和A100的FP16推理的性能是一样的。实测效果也还不错。
一、我说的量化
我们知道两个事实:
大多数HF的模型格式,都是FP16的:
2.量化我们一直在做,bnb动态量化; AWQ、GPTQ的量化等等。这个和英伟达的在H20上宣称的FP8量化推理有什么区别呢?
首先,我们常做的量化,其实主要是针对模型的静态文件。我们详细来来说。
从一个较高层次的分类来看,模型量化的手段通常可以分为两大类:量化感知训练(Quantization-Aware Training, QAT)和后训练量化(Post-Training Quantization, PTQ)。
量化感知训练(QAT): 在模型训练过程中模拟量化的效果,使模型在训练时就考虑到量化带来的误差。通常能够产生更高精度的量化模型,因为模型参数在训练时就适应了量化的约束。
后训练量化(PTQ): 在模型训练完成后应用的量化方法,不需要重新训练模型。
LLM 有三种流行的量化方法:GPTQ、bitsandbytes 和 AWQ。这几种都属于后训练量化(PTQ)。
具体来说:权重量化将模型的权重(weights)和偏置(biases)从高精度(如 FP32 或 FP16)转换为低精度(如 INT8、INT4 或 FP8)。
如果使用训练后量化的方法是:在模型训练完成后,使用量化工具对权重进行转换。这通常包括确定量化参数(如缩放因子和零点)并应用到权重上。
存储:量化后的权重被保存到模型的静态文件中(如 .pth、.onnx、.pb 等),从而减少模型的存储空间和内存带宽需求。
模型量化以后,在进行推理的时候,默认还是用FP16,这其中有个反量化的过程。
那么问题来了:
针对微软的Phi3,HF上默认是FP16,1.直接使用FP16进行推理 2.AWQ四位量化的Phi3模型使用FP16进行推理,那么这两种情况有什么区别么?
1和2之间的区别在于,2在显存开销要小得多。4位张量在推理期间的前向传递过程中只会短暂地反量化。在现有主流TGI、vLLM的推理框架中,我们也不需要也不能指定用4位推理,关键那样的话推理的精度也不准。所以说,使用量化模型进行推理时,是以float16进行,模型的必要张量会即时反量化。
二、NVIDIA说的量化
而英伟达在H20说的FP8推理,其实算是一个端到端的8位量化推理。这就要求必须要保证推流过程中的精度,而且越大的模型,使用FP8进行推理,精度越难以保持。这有三个要求:
1.首先需要GPU卡支持FP8推理(底层tensor core支持),H100支持FP8。A100不支持FP8只支持int8。
其次,并不是所有推理引擎都支持FP8推理,tensorrt支持。vLLM最近正在开发对FP8的支持。
最后,如果要使用8位推理,必须加载一个FP8模型。例如,Llama 3.1 405B有一个由Meta制作的FP8版本:https://huggingface.co/meta-llama/Llama-3.1-405B-FP8。
三、4/8位量化模型16位推理的意义
意义是显然的:
省运行内存
省模型文件存储空间
由于模型小,传送也快。
更多AI知识,参考: