大模型实战营第五次课作业
这是大模型实战营第五次课的作业
基础作业
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 | import json |
以benchmark.json
每个问答对的输入测试以下5种推理部署方式
全量部署
仅KV Cache 量化
仅W4A16量化
W4A16+KV Cache
原生Transformers推理
评价标准为
生成所有输出的时间(s)
吞吐率(字符/s)
平均响应时间(s)
显存占用最大值 (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。但仅仅参数量化似乎不足以解决模型过拟合问题,模型还是会对所有输入都输出“自我认知”相关内容。