INT4/INT8 KV 缓存#
自v0.4.0版本起,LMDeploy已支持在线键值(kv)缓存量化,采用int4和int8数值精度,使用一种在每头每令牌基础上应用的非对称量化方法。原始的kv离线量化方法已被移除。
直观地说,量化对于增加kv块的数量是有益的。与fp16相比,int4/int8 kv的kv块数量可以分别增加4倍和2倍。这意味着在相同的内存条件下,系统在kv量化后可以支持显著增加的并发操作数量,从而最终提高吞吐量。
然而,量化通常会带来一些模型准确性的损失。我们使用了OpenCompass来评估在应用int4/int8量化后几个模型的准确性。int8 kv保持了准确性,而int4 kv有轻微的损失。详细结果在评估部分中展示。您可以根据您的需求参考这些信息并做出明智的选择。
LMDeploy 推理支持以下 NVIDIA GPU 模型的量化 kv:
Volta架构 (sm70): V100
图灵架构 (sm75): 20系列, T4
安培架构 (sm80, sm86): 30系列, A10, A16, A30, A100
Ada Lovelace 架构 (sm89): 40 系列
Hopper架构(sm90):H100,H200
总之,LMDeploy kv量化具有以下优势:
无数据在线量化
支持所有具有Volta架构(sm70)及以上的NVIDIA GPU型号
KV int8 量化几乎无损精度,而 KV int4 量化的精度在可接受范围内
高效的推理,将int8/int4 kv量化应用于llama2-7b,与fp16相比,RPS分别提高了约30%和40%。
在下一节中,我们将以internlm2-chat-7b
模型为例,介绍kv量化和lmdeploy推理的使用方法。但在开始之前,请确保已安装lmdeploy。
pip install lmdeploy
用法#
通过LMDeploy应用kv量化和推理非常简单。只需设置quant_policy
参数。
LMDeploy 规定 quant_policy=4
代表 4 位 kv,而 quant_policy=8
表示 8 位 kv。
离线推理#
from lmdeploy import pipeline, TurbomindEngineConfig
engine_config = TurbomindEngineConfig(quant_policy=8)
pipe = pipeline("internlm/internlm2_5-7b-chat", backend_config=engine_config)
response = pipe(["Hi, pls intro yourself", "Shanghai is"])
print(response)
服务#
lmdeploy serve api_server internlm/internlm2_5-7b-chat --quant-policy 8
评估#
我们对多个LLM模型应用了LMDeploy的kv量化,并利用OpenCompass评估推理准确性。结果如下表所示:
- |
- |
- |
llama2-7b-chat |
- |
- |
internlm2-chat-7b |
- |
- |
internlm2.5-chat-7b |
- |
- |
qwen1.5-7b-chat |
- |
- |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
数据集 |
版本 |
指标 |
kv fp16 |
kv int8 |
kv int4 |
kv fp16 |
kv int8 |
kv int4 |
kv fp16 |
kv int8 |
kv int4 |
fp16 |
kv int8 |
kv int4 |
ceval |
- |
naive_average |
28.42 |
27.96 |
27.58 |
60.45 |
60.88 |
60.28 |
78.06 |
77.87 |
77.05 |
70.56 |
70.49 |
68.62 |
mmlu |
- |
naive_average |
35.64 |
35.58 |
34.79 |
63.91 |
64 |
62.36 |
72.30 |
72.27 |
71.17 |
61.48 |
61.56 |
60.65 |
triviaqa |
2121ce |
分数 |
56.09 |
56.13 |
53.71 |
58.73 |
58.7 |
58.18 |
65.09 |
64.87 |
63.28 |
44.62 |
44.77 |
44.04 |
gsm8k |
1d7fe4 |
准确率 |
28.2 |
28.05 |
27.37 |
70.13 |
69.75 |
66.87 |
85.67 |
85.44 |
83.78 |
54.97 |
56.41 |
54.74 |
race-middle |
9a54b6 |
准确率 |
41.57 |
41.78 |
41.23 |
88.93 |
88.93 |
88.93 |
92.76 |
92.83 |
92.55 |
87.33 |
87.26 |
86.28 |
种族高度 |
9a54b6 |
准确率 |
39.65 |
39.77 |
40.77 |
85.33 |
85.31 |
84.62 |
90.51 |
90.42 |
90.42 |
82.53 |
82.59 |
82.02 |
有关详细的评估方法,请参考此指南。记得在配置文件中将quant_policy
传递给推理引擎。
性能#
模型 |
键值类型 |
测试设置 |
RPS |
v.s. kv fp16 |
---|---|---|---|---|
llama2-chat-7b |
fp16 |
tp1 / 比例 0.8 / bs 256 / 提示 10000 |
14.98 |
1.0 |
- |
int8 |
tp1 / 比例 0.8 / bs 256 / 提示 10000 |
19.01 |
1.27 |
- |
int4 |
tp1 / 比例 0.8 / bs 256 / 提示 10000 |
20.81 |
1.39 |
llama2-chat-13b |
fp16 |
tp1 / 比例 0.9 / bs 128 / 提示 10000 |
8.55 |
1.0 |
- |
int8 |
tp1 / 比例 0.9 / bs 256 / 提示 10000 |
10.96 |
1.28 |
- |
int4 |
tp1 / 比例 0.9 / bs 256 / 提示 10000 |
11.91 |
1.39 |
internlm2-chat-7b |
fp16 |
tp1 / 比例 0.8 / bs 256 / 提示 10000 |
24.13 |
1.0 |
- |
int8 |
tp1 / 比例 0.8 / bs 256 / 提示 10000 |
25.28 |
1.05 |
- |
int4 |
tp1 / 比例 0.8 / bs 256 / 提示 10000 |
25.80 |
1.07 |
性能数据是通过benchmark/profile_throughput.py
获取的