当前位置:   article > 正文

「浦语大模型笔记五」lmdeploy大模型部署量化实践_lmdeploy calibrate

lmdeploy calibrate

   这节课讲解使用lmdeploy工具包对模型部署和量化的相关知识,主讲人是HuggingLLM负责人长琴,课程文档分享连接tutorial/lmdeploy/lmdeploy.md at main · InternLM/tutorial (github.com)

一. lmdeploy本地推理部署

1.1 部署框架

我们把从架构上把整个服务流程分成下面几个模块。

  • 模型推理/服务。主要提供模型本身的推理,一般来说可以和具体业务解耦,专注模型推理本身性能的优化。可以以模块、API等多种方式提供。
  • Client。可以理解为前端,与用户交互的地方。
  • API Server。一般作为前端的后端,提供与产品和服务相关的数据和功能支持。

值得说明的是,以上的划分是一个相对完整的模型,但在实际中这并不是绝对的。比如可以把“模型推理”和“API Server”合并,有的甚至是三个流程打包在一起提供服务。

1.2 TurboMind 推理+命令行本地对话

1.2.1lmdeploy安装
  1. # 解决 ModuleNotFoundError: No module named 'packaging' 问题
  2. pip install packaging
  3. # 使用 flash_attn 的预编译包解决安装过慢问题
  4. pip install /root/share/wheels/flash_attn-2.4.2+cu118torch2.0cxx11abiTRUE-cp310-cp310-linux_x86_64.whl
  5. pip install 'lmdeploy[all]==v0.1.0'
1.2.2 模型转换

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

TurboMind 是一款关于 LLM 推理的高效推理引擎,基于英伟达的 FasterTransformer 研发而成。它的主要功能包括:LLaMa 结构模型的支持,persistent batch 推理模式和可扩展的 KV 缓存管理器。

将本地模型转换成需要的格式

  1. # 转换模型(FastTransformer格式) TurboMind
  2. lmdeploy convert internlm-chat-7b /path/to/internlm-chat-7b
转换完之后可以直接使用lmdeploy进行chat
  1. # Turbomind + Bash Local Chat
  2. lmdeploy chat turbomind ./workspace

一般Huggingface上也有相应格式的文件可以直接chat

  1. # 需要能访问 Huggingface 的网络环境
  2. lmdeploy chat turbomind internlm/internlm-chat-20b-4bit --model-name internlm-chat-20b
  3. lmdeploy chat turbomind Qwen/Qwen-7B-Chat --model-name qwen-7b

1.3 TurboMind推理+API服务

1.启动服务

  1. # ApiServer+Turbomind api_server => AsyncEngine => TurboMind
  2. lmdeploy serve api_server ./workspace \
  3. --server_name 0.0.0.0 \
  4. --server_port 23333 \
  5. --instance_num 64 \
  6. --tp 1

2.我们可以新开一个窗口,执行下面的 Client 命令。如果使用官方机器,可以打开 vscode 的 Terminal,执行下面的命令。

  1. # ChatApiClient+ApiServer(注意是http协议,需要加http)
  2. lmdeploy serve api_client http://localhost:23333

1.4 网页 Demo 演示

  1. # Gradio+ApiServer。必须先开启 Server,此时 Gradio 为 Client
  2. lmdeploy serve gradio http://0.0.0.0:23333 \
  3. --server_name 0.0.0.0 \
  4. --server_port 6006 \
  5. --restful_api True
  1. # Gradio+Turbomind(local)
  2. lmdeploy serve gradio ./workspace

二.模型量化

2.1 KV Cache 量化 

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

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

  1. # 计算 minmax
  2. lmdeploy lite calibrate \
  3. --model /root/share/temp/model_repos/internlm-chat-7b/ \
  4. --calib_dataset "c4" \
  5. --calib_samples 128 \
  6. --calib_seqlen 2048 \
  7. --work_dir ./quant_output

第二步:通过 minmax 获取量化参数。主要就是利用下面这个公式,获取每一层的 K V 中心值(zp)和缩放值(scale)。

  1. zp = (min+max) / 2
  2. scale = (max-min) / 255
  3. quant: q = round( (f-zp) / scale)
  4. dequant: f = q * scale + zp
  5. # 通过 minmax 获取量化参数
  6. lmdeploy lite kv_qparams \
  7. --work_dir ./quant_output \
  8. --turbomind_dir workspace/triton_models/weights/ \
  9. --kv_sym False \
  10. --num_tp 1

第三步:修改配置。也就是修改 weights/config.ini 文件,这个我们在《2.6.2 模型配置实践》中已经提到过了(KV int8 开关),只需要把 quant_policy 改为 4 即可。

2.2 W4A16 量化

W4A16中的A是指Activation,保持FP16,只对参数进行 4bit 量化。使用过程也可以看作是三步。 

第一步:计算minmax同上。

第二步:量化权重模型。利用第一步得到的统计值对参数进行量化,

  1. # 量化权重模型
  2. lmdeploy lite auto_awq \
  3. --model /root/share/temp/model_repos/internlm-chat-7b/ \
  4. --w_bits 4 \
  5. --w_group_size 128 \
  6. --work_dir ./quant_output

 最后一步:转换成 TurboMind 格式

  1. lmdeploy convert internlm-chat-7b ./quant_output \
  2. --model-format awq \
  3. --group-size 128 \
  4. --dst_path ./workspace_quant

三.作业

 3.1基础作业

使用 LMDeploy 以本地对话、网页Gradio、API服务中的一种方式部署 InternLM-Chat-7B 模型,生成 300 字的小故事(需截图)

1.本地对话

2.api

3.网页

3.2进阶作业

1.将第四节课训练自我认知小助手模型使用 LMDeploy 量化部署到 OpenXLab 平台。

 未部署。

2.量化

因为在做量化作业时,lmdeploy已经升级,部分参数发生了改变,所以这里参考某个大佬的文档,给出链接Docs

2.1 KV量化

量化前chat时显存

  1. lmdeploy convert internlm2-chat-7b /root/share/model_repos/internlm2-chat-7b/
  2. lmdeploy chat turbomind ./workspace

获取并计算量化参数

  1. # 计算
  2. lmdeploy lite calibrate /root/share/model_repos/internlm2-chat-7b --calib-dataset 'c4' --calib-samples 128 --calib-seqlen 2048 --work-dir ./quant_output_kv
  3. # 获取量化参数
  4. lmdeploy lite kv_qparams ./quant_output_kv workspace_ori/triton_models/weights/ --num-tp 1

 

打开量化开关,将quant_policy改成4use_logn_attn改成0 

chat,进行显存对比 

2.2 W4A16量化

量化权重模型并转换格式

  1. lmdeploy lite auto_awq /root/share/model_repos/internlm2-chat-7b --w-bits 4 --w-group-size 128 --work-dir ./quant_output_w4
  2. lmdeploy convert internlm2-chat-7b ./quant_output_w4 --model-format awq --group-size 128 --dst-path ./workspace_w4quant

修改参数,chat对比效果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/450282
推荐阅读
  

闽ICP备14008679号