LMDeploy 量化部署 LLM 实践 | shmaur

shmaur
2024-06-08
-
-

作业

  1. 配置 LMDeploy 运行环境
  2. 以命令行方式与 InternLM2-Chat-1.8B 模型对话
  3. 设置KV Cache最大占用比例为0.4,开启W4A16量化,以命令行方式与模型对话
  4. 设置KV Cache最大占用比例为0.4,开启W4A16量化,以命令行方式与模型对话
  5. 使用W4A16量化,调整KV Cache的占用比例为0.4,使用Python代码集成的方式运行internlm2-chat-1.8b模型。
  6. 使用 LMDeploy 运行视觉多模态大模型 llava gradio demo。

目标

      了解部署方法,进行不同的量化会有什么样的结果;启动服务端API并通过不同途径进行访问成功。

 

一、大模型部署方法

模型剪枝(Pruning)

 

知识蒸馏

量化

 

二、LMDeploy简介

LMDeploy 由 MMDeploy 和 MMRazor 团队联合开发是涵盖了 LLM 任务的全套轻量化、部署和服务解决方案。核心功能包括高效推理、可靠量化、便捷服务和有状态推理。

高效的推理:LMDeploy开发了Continuous Batch,Blocked K/ Cache,动态拆分和融合,张量并行,高效的计算kernel等重要特性。InternLM2推理性能是vLLM的 1.8 倍。
可靠的量化:LMDeploy支持权重量化和k/v量化。4bit模型推理效率是FP16下的2.4倍。量化模型的可靠性已通过OpenCompass评测得到充分验证。
便捷的服务:通过请求分发服务,LMDeploy 支持多模型在多机、多卡上的推理服务.
有状态推理:通过缓存多轮对话过程中Attention的k/v,记住对话历史,从而避免重复处理历史会话。显著提升长文本多轮对话场景中的效率。

LMDeploy 核心功能

 

安装 LMDeploy

studio-conda -t lmdeploy -o pytorch-2.1.2

conda activate lmdeploy

pip install lmdeploy[all]==0.3.0

 

(作业)配置 LMDeploy 运行环境

 

LMDeploy模型量化(lite)

主要包括 KV8量化和W4A16量化。总的来说,量化是一种以参数或计算中间结果精度下降换空间节省(以及同时带来的性能提升)的策略。

计算密集(compute-bound): 指推理过程中,绝大部分时间消耗在数值计算上;针对计算密集型场景,可以通过使用更快的硬件计算单元来提升计算速度。

访存密集(memory-bound): 指推理过程中,绝大部分时间消耗在数据读取上;针对访存密集型场景,一般通过减少访存次数、提高计算访存比或降低访存量来优化。

常见的 LLM 模型由于 Decoder Only 架构的特性,实际推理时大多数的时间都消耗在了逐 Token 生成阶段(Decoding 阶段),是典型的访存密集型场景。

那么,如何优化 LLM 模型推理中的访存密集问题呢? 我们可以使用KV8量化和W4A16量化。KV8量化是指将逐 Token(Decoding)生成过程中的上下文 K 和 V 中间结果进行 INT8 量化(计算时再反量化),以降低生成过程中的显存占用。W4A16 量化,将 FP16 的模型权重量化为 INT4,Kernel 计算时,访存量直接降为 FP16 模型的 1/4,大幅降低了访存成本。Weight Only 是指仅量化权重,数值计算依然采用 FP16(需要将 INT4 权重反量化)。

 

设置最大KV Cache缓存大小

KV Cache是一种缓存技术,通过存储键值对的形式来复用计算结果,以达到提高性能和降低内存消耗的目的。

lmdeploy chat /root/internlm2-chat-1_8b  # --cache-max-entry-count参数的效果。首先保持不加该参数(默认0.8
lmdeploy chat /root/internlm2-chat-1_8b --cache-max-entry-count 0.5  # 改变--cache-max-entry-count参数,设为0.5。
lmdeploy chat /root/internlm2-chat-1_8b --cache-max-entry-count 0.01  # --cache-max-entry-count参数设置为0.01,约等于禁止KV Cache占用显存

这样做的代价是会降低模型推理速度

 

使用W4A16量化

MDeploy使用AWQ算法,实现模型4bit权重量化。推理引擎TurboMind提供了非常高效的4bit推理cuda kernel,性能是FP16的2.4倍以上。它支持以下NVIDIA显卡:

图灵架构(sm75):20系列、T4
安培架构(sm80,sm86):30系列、A10、A16、A30、A100
Ada Lovelace架构(sm90):40 系列

pip install einops==0.7.0  # 依赖库
lmdeploy lite auto_awq \
   /root/internlm2-chat-1_8b \
  --calib-dataset 'ptb' \
  --calib-samples 128 \
  --calib-seqlen 1024 \
  --w-bits 4 \
  --w-group-size 128 \
  --work-dir /root/internlm2-chat-1_8b-4bit   # 执行一条命令,完成模型量化工作
lmdeploy chat /root/internlm2-chat-1_8b-4bit --model-format awq  # Chat功能运行W4A16量化后的模型。

 

lmdeploy chat /root/internlm2-chat-1_8b-4bit --model-format awq --cache-max-entry-count 0.01 # KV Cache比例再次调为0.01,查看显存占用情况

(作业)设置KV Cache最大占用比例为0.4,开启W4A16量化,以命令行方式与模型对话

 

LMDeploy服务(serve)

 

模型推理/服务。主要提供模型本身的推理,一般来说可以和具体业务解耦,专注模型推理本身性能的优化。可以以模块、API等多种方式提供。
API Server。中间协议层,把后端推理/服务通过HTTP,gRPC或其他形式的接口,供前端调用。
Client。可以理解为前端,与用户交互的地方。通过通过网页端/命令行去调用API接口,获取模型推理/服务。

 

启动API 服务器

lmdeploy serve api_server \
    /root/internlm2-chat-1_8b \
    --model-format hf \
    --quant-policy 0 \
    --server-name 0.0.0.0 \
    --server-port 23333 \
    --tp 1
    
   # model-format、quant-policy这些参数是与第三章中量化推理模型一致的;server-name和server-port表示API服务器的服务IP与服务端口;tp参数表示并行数量(GPU数量)

 

客户端连接

通过网页端访问API

网页端架构

 

lmdeploy serve gradio http://localhost:23333  --server-name 0.0.0.0 
 --server-port 6006

(作业)以API Server方式启动 lmdeploy

启动服务端API

客户端执行

 

Python代码集成

Python代码集成运行1.8B模型

conda activate lmdeploy
touch /root/pipeline.py
from lmdeploy import pipeline

pipe = pipeline('/root/internlm2-chat-1_8b')
response = pipe(['Hi, pls intro yourself', '上海是'])
print(response)

代码解读

  • 第1行,引入lmdeploy的pipeline模块 \
  • 第3行,从目录“./internlm2-chat-1_8b”加载HF模型 \
  • 第4行,运行pipeline,这里采用了批处理的方式,用一个列表包含两个输入,lmdeploy同时推理两个输入,产生两个输出结果,结果返回给response \
  • 第5行,输出response

运行结果

向TurboMind后端传递参数

touch /root/pipeline_kv.py
from lmdeploy import pipeline, TurbomindEngineConfig

# 调低 k/v cache内存占比调整为总显存的 20%
backend_config = TurbomindEngineConfig(cache_max_entry_count=0.2)

pipe = pipeline('/root/internlm2-chat-1_8b',
                backend_config=backend_config)
response = pipe(['Hi, pls intro yourself', '上海是'])
print(response)

python /root/pipeline_kv.py

 

(作业)使用Python代码集成的方式运行internlm2-chat-1.8b模型

 

使用LMDeploy运行视觉多模态大模型llava

conda activate lmdeploy

pip install git+https://github.com/haotian-liu/LLaVA.git@4e2277a060da264c4f21b364c867cc622c945874  # 安装llava依赖库

touch /root/pipeline_llava.py
from lmdeploy.vl import load_image
from lmdeploy import pipeline, TurbomindEngineConfig


backend_config = TurbomindEngineConfig(session_len=8192) # 图片分辨率较高时请调高session_len
# pipe = pipeline('liuhaotian/llava-v1.6-vicuna-7b', backend_config=backend_config) 非开发机运行此命令
pipe = pipeline('/share/new_models/liuhaotian/llava-v1.6-vicuna-7b', backend_config=backend_config)

image = load_image('https://raw.githubusercontent.com/open-mmlab/mmdeploy/main/tests/data/tiger.jpeg')
response = pipe(('describe this image', image))
print(response)

 

效果

 

(作业)运行视觉多模态大模型

 

总结

LMDeploy 在推理效率上以及量化都取得了不错的成绩。还可快捷进行请求分发,推理速度也很快。学习到了如何部署以及将服务API化。

 

“您的支持是我持续分享的动力”

微信收款码
微信
支付宝收款码
支付宝

目录关闭