INT4/INT8 KV 缓存

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量化具有以下优势:

  1. 无数据在线量化

  2. 支持所有具有Volta架构(sm70)及以上的NVIDIA GPU型号

  3. KV int8 量化几乎无损精度,而 KV int4 量化的精度在可接受范围内

  4. 高效的推理,将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获取的