LMDeploy 大模型量化部署实践
kishiokon
2024年01月28日 21:30

大模型在部署任务中,往往呈现内存开销大,动态shape等特点,给部署带来了一系列挑战

为了降低设备压力和提升吞吐量,可以尝试采用flashattention这种访存优化,权重量化以及连续批等技术

LMDeploy框架就提供了部署全流程解决方案,包括权重量化和kvcache,turbomind推理引擎等

大模型由于decoder only和迭代生成特性,属于访存密集型场景,计算并不是瓶颈,将权重进行量化大幅降低了访存成本,同时节省显存并提高了推理速度

同时,针对推理,lmdeploy框架还提供了turbomind引擎,其支持连续批处理,高性能cuda kernel和 paged attention等技术,相比vllm等框架呈现出了推理速度的优势

## 服务部署

使用 TurboMind 推理模型需要先将模型转化为 TurboMind 的格式,目前支持在线转换和离线转换两种形式。在线转换可以直接加载 Huggingface 模型,离线转换需需要先保存模型再加载。

lmdeploy chat turbomind internlm/internlm-chat-20b-4bit --model-name internlm-chat-20b lmdeploy chat turbomind Qwen/Qwen-7B-Chat --model-name qwen-7b

上面两行命令分别展示了如何直接加载 Huggingface 的模型

我们也可以直接启动本地的 Huggingface 模型:

lmdeploy chat turbomind /share/temp/model_repos/internlm-chat-7b/  --model-name internlm-chat-7b

这会启动一个本地对话界面。

离线转换可以使用如下命令:

lmdeploy convert internlm-chat-7b  /root/share/temp/model_repos/internlm-chat-7b/

执行完成后将会在当前目录生成一个 `workspace` 的文件夹。这里面包含的就是 TurboMind 和 Triton “模型推理”需要到的文件。

模型转换完成后,我们就具备了使用模型推理的条件

实践中可以将turbomind作为后端来开启网页应用

lmdeploy serve gradio ./workspace

lmdeploy 还支持 Python 直接与 TurboMind 进行交互:

from lmdeploy import turbomind as tm

# load model model_path = "/root/share/temp/model_repos/internlm-chat-7b/" tm_model = tm.TurboMind.from_pretrained(model_path, model_name='internlm-chat-20b') generator = tm_model.create_instance() # process query query = "你好啊兄嘚" prompt = tm_model.model.get_prompt(query) input_ids = tm_model.tokenizer.encode(prompt) # inference for outputs in generator.stream_infer(         session_id=0,         input_ids=[input_ids]):     res, tokens = outputs[0] response = tm_model.tokenizer.decode(res.tolist()) print(response)

## 模型量化

KV Cache 量化是将已经生成序列的 KV 变成 Int8,使用过程一共包括三步:

第一步:计算 minmax。主要思路是通过计算给定输入样本在每一层不同位置处计算结果的统计情况。

lmdeploy lite calibrate \

  --model  /root/share/temp/model_repos/internlm-chat-7b/ \   --calib_dataset "c4" \   --calib_samples 128 \   --calib_seqlen 2048 \   --work_dir ./quant_output

这里利用数据集给出kvcache的统计信息,第二步:通过 minmax 获取量化参数。

lmdeploy lite kv_qparams \

  --work_dir ./quant_output  \   --turbomind_dir workspace/triton_models/weights/ \   --kv_sym False \   --num_tp 1

第三步:修改配置。也就是修改 `weights/config.ini` 文件,接下来就可以正常运行前面的各种服务了