LMDeploy核心功能

模型高效推理 参考命令:Imdeploy chat-h
TurboMind是LMDeploy团队开发的一款关于LLM推理的高效推理引擎。它的主要功能包括:LLaMa结构模型的支持,continuous batch推理模式和可扩展的KV缓存管理器。

模型量化压缩 参考命令:Imdeploy lite-h
W4A16量化(AWQ):将FP16的模型权重量化为INT4,Kernel计算时,访存量直接降为FP16模型的1/4,大幅降低了访存成本。Weight Only是指仅量化权重,数值计算依然采用FP16(需要将INT4权重反化)。

服务化部署 参考命令:Imdeploy serve-h
将LLM封装为HTTP API服务,支持Triton:扩展。

LMDeploy’性能表现

LMDeploy TurboMind引擎拥有卓越的推理能力,在各种规模的模型上,每秒处理的请求数是vLLM的
1.36~1.85倍。在静态推理能力方面,TurboMind4bit模型推理速度(out token/s)远高于FP16/BF16推理。在小batch时,提高到2.4倍。

LMDeploy模型量化(lite)

两个概念:

  • 计算密集(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缓存大小

lmdeploy chat /root/internlm2-chat-1_8b --cache-max-entry-count 0.5

使用W4A16量化

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

这段代码的意思是:调用 lite 量化功能 auto_awq的算法。采用 ptb 数据集,采样128 个数据对, 量化的时候上下文长度是 1024

LMDeploy服务

通过下面命令就可以启动一个服务,提供 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

tp指 GPU数量

运行视觉大模型

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)

这个比较简单,就是多了个读取图片的操作