FP8 E4M3 KV 缓存

FP8 E4M3 KV 缓存#

将 KV 缓存量化为 FP8 会减小其内存占用。这会增加可以存储在缓存中的令牌数量,从而提高吞吐量。OCP(开放计算项目 www.opencompute.org)指定了两种常见的 8 位浮点数据格式:E5M2(5 个指数位和 2 个尾数位)和 E4M3FN(4 个指数位和 3 个尾数位),通常简称为 E4M3。E4M3 格式相对于 E5M2 的一个优势是,浮点数以更高的精度表示。但是,FP8 E4M3 的动态范围较小(±240.0 可以表示),通常需要使用更高精度(通常为 FP32)的缩放因子与每个量化张量一起使用。目前,只支持每张量(标量)缩放因子。正在开发支持更细粒度的缩放因子(例如,每通道)。

这些缩放因子可以通过在加载时将可选的量化参数 JSON 传递给 LLM 引擎来指定。如果未指定此 JSON,则缩放因子默认为 1.0。这些缩放因子通常是在通过量化工具(例如 AMD 量化器或 NVIDIA AMMO)运行未量化的模型时获得的。

要安装 AMMO(算法模型优化):

$ pip install --no-cache-dir --extra-index-url https://pypi.nvidia.com nvidia-ammo

研究表明,FP8 E4M3 量化通常只会极大地降低推理精度。最新的硅产品,例如 AMD MI300、NVIDIA Hopper 或更高版本,支持从 fp32、fp16、bf16 等到它们的本机硬件转换。因此,LLM 推理在精度损失最小的前提下得到了极大的加速。

以下是如何启用此功能的示例:

# two float8_e4m3fn kv cache scaling factor files are provided under tests/fp8_kv, please refer to
# https://github.com/vllm-project/vllm/blob/main/examples/fp8/README.md to generate kv_cache_scales.json of your own.

from vllm import LLM, SamplingParams
sampling_params = SamplingParams(temperature=1.3, top_p=0.8)
llm = LLM(model="meta-llama/Llama-2-7b-chat-hf",
          kv_cache_dtype="fp8",
          quantization_param_path="./tests/fp8_kv/llama2-7b-fp8-kv/kv_cache_scales.json")
prompt = "London is the capital of"
out = llm.generate(prompt, sampling_params)[0].outputs[0].text
print(out)

# output w/ scaling factors:  England, the United Kingdom, and one of the world's leading financial,
# output w/o scaling factors:  England, located in the southeastern part of the country. It is known