大模型实战营第五次课作业

这是大模型实战营第五次课的作业

基础作业

LMDeploy 部署 InternLM-Chat-7B

  • 转换模型
1
lmdeploy convert internlm-chat-7b /path/to/internlm-chat-7b

将模型转换为TurboMind格式

  • 本地对话

本地对话生成小故事如下

  • RESTful API

API生成小故事如下

  • Gradio Demo

Gradio 生成小故事如下

进阶作业

模型不同量化策略对比

按照教程生成了3个internlm-chat-7b量化模型,对应

不同量化策略占用显存对比如下(max_batch_size = 1, max_len = 512)

量化策略 全量 仅KV Cache 仅W4A16 W4A16 + KV Cache
占用显存最大值:部署 / MB 14718 14686 5756 5724
占用显存最大值:推理 / MB 14854 14726 5824 5760
推理过程占用显存 / MB 136 40 68 36

测试API接口为:/v1/chat/completions

发送的请求参数为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"model": "internlm-chat-7b",
"messages": "请写一个300字左右的小故事",
"temperature": 0.7,
"top_p": 1,
"n": 1,
"max_tokens": 512,
"stop": false,
"stream": false,
"presence_penalty": 0,
"frequency_penalty": 0,
"user": "string",
"repetition_penalty": 1,
"session_id": -1,
"ignore_eos": false
}

可见KV Cache 量化在没有进行参数量化时可大幅减少推理时占用的显存, 而W4A16量化可大幅减少部署时占用显存。

Benchmark推理速度测试

在上一部分生成的3个量化模型基础上进行测试:

  • 测试环境

Nvidia-A100-24G * 1;

Python 3.10

lmdeploy 0.1.0

transformers 4.34.0

  • 测试数据来源

测试benchmark来源Medication QA数据集

  • 测试设计

从原始数据集中随机抽取50个问答对保存为benchmark.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import json
import random


def gen_benchmark(n=50):
with open('./data.jsonl', 'r', encoding='utf-8') as f:
data = json.load(f)
benchmark = []
for _ in range(n):
benchmark.append(random.choice(data))
with open('./benchmark.json', 'w', encoding='utf-8') as f:
json.dump(benchmark, f, ensure_ascii=False, indent=4)


if __name__ == '__main__':
gen_benchmark()

benchmark.json每个问答对的输入测试以下5种推理部署方式

  1. 全量部署

  2. 仅KV Cache 量化

  3. 仅W4A16量化

  4. W4A16+KV Cache

  5. 原生Transformers推理

评价标准为

  1. 生成所有输出的时间(s)

  2. 吞吐率(字符/s)

  3. 平均响应时间(s)

  4. 显存占用最大值 (MB)

测试代码即为教程中提供的示例代码

  • 测试结果
量化策略 全量 全量 仅KV Cache 仅W4A16 KV Cache + W4A16
推理框架 Transformer TurboMind TurboMind TurboMind TurboMind
时间 / s ↓ 229.96 184.93 130.60 78.53 55.83
吞吐率 / (字符 / s) ↑ 98 109 154 291 422
平均响应时间 / s ↓ 4.60 3.70 2.61 1.57 1.12
显存占用最大值 / MB ↓ 15200 14982 14854 6080 5920
  • 结论

KV Cache + W4A16 量化可以达到最大的加速效果

OpenXLab量化部署上次课微调模型

在Nvidia-A10* 1(24G)上部署W4A16 的模型:

点击此处访问

W4A16 + KV Cache量化后模型放飞自我,直接胡乱输出了。所以直接去掉KV Cache。但仅仅参数量化似乎不足以解决模型过拟合问题,模型还是会对所有输入都输出“自我认知”相关内容。