赞
踩
这节课讲解使用lmdeploy工具包对模型部署和量化的相关知识,主讲人是HuggingLLM负责人长琴,课程文档分享连接tutorial/lmdeploy/lmdeploy.md at main · InternLM/tutorial (github.com)。
我们把从架构上把整个服务流程分成下面几个模块。
值得说明的是,以上的划分是一个相对完整的模型,但在实际中这并不是绝对的。比如可以把“模型推理”和“API Server”合并,有的甚至是三个流程打包在一起提供服务。
- # 解决 ModuleNotFoundError: No module named 'packaging' 问题
- pip install packaging
- # 使用 flash_attn 的预编译包解决安装过慢问题
- pip install /root/share/wheels/flash_attn-2.4.2+cu118torch2.0cxx11abiTRUE-cp310-cp310-linux_x86_64.whl
- pip install 'lmdeploy[all]==v0.1.0'
使用 TurboMind 推理模型需要先将模型转化为 TurboMind 的格式,目前支持在线转换和离线转换两种形式。在线转换可以直接加载 Huggingface 模型,离线转换需需要先保存模型再加载。
TurboMind 是一款关于 LLM 推理的高效推理引擎,基于英伟达的 FasterTransformer 研发而成。它的主要功能包括:LLaMa 结构模型的支持,persistent batch 推理模式和可扩展的 KV 缓存管理器。
将本地模型转换成需要的格式
- # 转换模型(FastTransformer格式) TurboMind
- lmdeploy convert internlm-chat-7b /path/to/internlm-chat-7b
转换完之后可以直接使用lmdeploy进行chat
- # Turbomind + Bash Local Chat
- lmdeploy chat turbomind ./workspace
一般Huggingface上也有相应格式的文件可以直接chat
- # 需要能访问 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
1.启动服务
- # ApiServer+Turbomind api_server => AsyncEngine => TurboMind
- lmdeploy serve api_server ./workspace \
- --server_name 0.0.0.0 \
- --server_port 23333 \
- --instance_num 64 \
- --tp 1
2.我们可以新开一个窗口,执行下面的 Client 命令。如果使用官方机器,可以打开 vscode 的 Terminal,执行下面的命令。
- # ChatApiClient+ApiServer(注意是http协议,需要加http)
- lmdeploy serve api_client http://localhost:23333
- # Gradio+ApiServer。必须先开启 Server,此时 Gradio 为 Client
- lmdeploy serve gradio http://0.0.0.0:23333 \
- --server_name 0.0.0.0 \
- --server_port 6006 \
- --restful_api True
- # Gradio+Turbomind(local)
- lmdeploy serve gradio ./workspace
KV Cache 量化是将已经生成序列的 KV 变成 Int8,使用过程一共包括三步:
第一步:计算 minmax。主要思路是通过计算给定输入样本在每一层不同位置处计算结果的统计情况。
- # 计算 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
第二步:通过 minmax 获取量化参数。主要就是利用下面这个公式,获取每一层的 K V 中心值(zp)和缩放值(scale)。
- zp = (min+max) / 2
- scale = (max-min) / 255
- quant: q = round( (f-zp) / scale)
- dequant: f = q * scale + zp
- # 通过 minmax 获取量化参数
- lmdeploy lite kv_qparams \
- --work_dir ./quant_output \
- --turbomind_dir workspace/triton_models/weights/ \
- --kv_sym False \
- --num_tp 1
第三步:修改配置。也就是修改 weights/config.ini
文件,这个我们在《2.6.2 模型配置实践》中已经提到过了(KV int8 开关),只需要把 quant_policy
改为 4 即可。
W4A16中的A是指Activation,保持FP16,只对参数进行 4bit 量化。使用过程也可以看作是三步。
第一步:计算minmax同上。
第二步:量化权重模型。利用第一步得到的统计值对参数进行量化,
- # 量化权重模型
- lmdeploy lite auto_awq \
- --model /root/share/temp/model_repos/internlm-chat-7b/ \
- --w_bits 4 \
- --w_group_size 128 \
- --work_dir ./quant_output
最后一步:转换成 TurboMind 格式
- lmdeploy convert internlm-chat-7b ./quant_output \
- --model-format awq \
- --group-size 128 \
- --dst_path ./workspace_quant
使用 LMDeploy 以本地对话、网页Gradio、API服务中的一种方式部署 InternLM-Chat-7B 模型,生成 300 字的小故事(需截图)
1.本地对话
2.api
3.网页
1.将第四节课训练自我认知小助手模型使用 LMDeploy 量化部署到 OpenXLab 平台。
未部署。
2.量化
因为在做量化作业时,lmdeploy已经升级,部分参数发生了改变,所以这里参考某个大佬的文档,给出链接Docs
2.1 KV量化
量化前chat时显存
- lmdeploy convert internlm2-chat-7b /root/share/model_repos/internlm2-chat-7b/
- lmdeploy chat turbomind ./workspace
获取并计算量化参数
- # 计算
- lmdeploy lite calibrate /root/share/model_repos/internlm2-chat-7b --calib-dataset 'c4' --calib-samples 128 --calib-seqlen 2048 --work-dir ./quant_output_kv
- # 获取量化参数
- lmdeploy lite kv_qparams ./quant_output_kv workspace_ori/triton_models/weights/ --num-tp 1
打开量化开关,将quant_policy
改成4
,use_logn_attn
改成0
chat,进行显存对比
2.2 W4A16量化
量化权重模型并转换格式
- lmdeploy lite auto_awq /root/share/model_repos/internlm2-chat-7b --w-bits 4 --w-group-size 128 --work-dir ./quant_output_w4
- lmdeploy convert internlm2-chat-7b ./quant_output_w4 --model-format awq --group-size 128 --dst-path ./workspace_w4quant
修改参数,chat对比效果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。