书生浦语实战营第五节课:LMDeploy量化部署实践 - robinlubin12/InternLM2-OpenCamp GitHub Wiki
大模型部署面临的硬件部署要求是阻挡普通人本地化实践的重大障碍,看完下图,首先是FPO浮点型计算能力(GPU配置)、其次是内存需求动辄10Gb的缓存。32个tokens 可能多组合不了一个完整的中文语句。实际情况中输出Tokens的量是无法预估的。
不能找到满足条件的硬件环境,就改变自身,把模型进行处理,例如裁剪、蒸馏、量化(浮点运算转整数、其它离散形式、QLORA、纠正一个认识,量化本质是改变访存比,计算还是浮点,存储是整数)
LMDeploy介绍
LMDeploy涵盖了 LLM 任务的全套轻量化、部署和服务解决方案。 这个强大的工具箱提供以下核心功能
- 高效推理引擎 TurboMind:基于 FasterTransformer,我们实现了高效推理引擎 TurboMind,支持 InternLM、LLaMA、vicuna等模型在 NVIDIA GPU 上的推理。
- 交互推理方式:通过缓存多轮对话过程中 attention 的 k/v,记住对话历史,从而避免重复处理历史会话。
- 多 GPU 部署和量化:提供了全面的模型部署和量化支持,已在不同规模上完成验证。
- persistent batch 推理:进一步优化模型执行效率。 对比下:vLLM是伯克利大学LMSYS组织开源的大语言模型高速推理框架,旨在极大地提升实时场景下的语言模型服务的吞吐与内存使用效率。vLLM是一个快速且易于使用的库,用于 LLM 推理和服务 LMDeploy 支持 TurboMind 和 Pytorch 两种推理后端。运行lmdeploy list可查看支持模型列表, LMDeploy支持的模型:
配置Conda虚拟环境,安装0.3版本的LMDeploy
pip install lmdeploy[all]==0.3.0
推理引擎+模型文件(TurboMind模型、HF模型) ----达到LLM的运行效果
托管在HuggingFace社区的模型通常采用HuggingFace格式存储,简写为HF格式。
但是HuggingFace社区的服务器在国外,国内访问不太方便。国内可以使用阿里巴巴的MindScope社区,或者上海AI Lab搭建的OpenXLab社区,上面托管的模型也通常采用HF格式。 TurboMind是LMDeploy团队开发的一款关于LLM推理的高效推理引擎,它的主要功能包括:LLaMa 结构模型的支持,continuous batch 推理模式和可扩展的 KV 缓存管理器。
TurboMind推理引擎仅支持推理TurboMind格式的模型。因此,TurboMind在推理HF格式的模型时,会首先自动将HF格式模型转换为TurboMind格式的模型。该过程在新版本的LMDeploy中是自动进行的,无需用户操作。实验过程中会体验Transformer库运行HF模型,Transformer库是Huggingface社区推出的用于运行HF模型的官方库
~~运行模型,chat,可以看到模型文件格式转换
问答效果截图
运行transformer时候错误,检查pip list 发现 “transformers 4.38.2”,是因为当时的LMdeploy还没有安装完,安装LMdeploy过程会安装transformers的。
如何优化 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/models/internlm2-chat-1_8b --cache-max-entry-count 0.5
改第一部分“模型参数本身占用的显存”,转为4bit全重量化,LMDeploy使用AWQ算法,实现模型4bit权重量化(运行时间较长,请耐心等待。量化工作结束后,新的HF模型被保存到internlm2-chat-1_8b-4bit目录。部分网站提供4bit模型文件下载)。
lmdeploy chat /root/models/internlm2-chat-1_8b-4bit --model-format awq
lmdeploy chat /root/models/internlm2-chat-1_8b-4bit --model-format awq --cache-max-entry-count 0.01
叠加内存缩小后,很容易报错
LMDeploy的其它模块运行起来,除了上面的推理引擎、模型库加载、对话模式。
启动了API服务器:lmdeploy serve api_server -h
lmdeploy serve api_server \
/root/models/internlm2-chat-1_8b \
--model-format hf \
--quant-policy 0 \
--server-name 0.0.0.0 \
--server-port 23333 \
--tp 1
//--tp TP GPU number used in tensor parallelism
测试需要端口转发,本地windows打开Powershell 执行命令:
ssh -CNg -L 23333:127.0.0.1:23333 [email protected] -p 42298 <你的ssh端口号>
熟悉的swagger UI,可以简单了解下发布了哪些接口,参数设置接口,聊天
启动另外一个Treminal窗口,运行Gradio,一个web交互聊天UI前端
lmdeploy serve gradio http://localhost:23333 \
--server-name 0.0.0.0 \
--server-port 6006
转发端口命令更改下:
ssh -CNg -L 6066:127.0.0.1:6066 [email protected] -p 42298
体验下,这个基模能力(gradio 很难关闭,找到进程ID,kill -9 ID)
切换使用Python代码调用推理引擎/模型库
from lmdeploy import pipeline //引入lmdeploy的pipeline模块 \
pipe = pipeline('/root/internlm2-chat-1_8b') //从目录“./internlm2-chat-1_8b”加载HF模型 \
response = pipe(['Hi, pls intro yourself', '上海是'])
//运行pipeline,这里采用了批处理的方式,用一个列表包含两个输入,lmdeploy同时推理两个输入,产生两个输出结果,结果返回给response \
print(response) //输出response
通过python代码,设置推理引擎参数,向TurboMind后端传递参数
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)
输出内容有差异,英文短了一些,中文反而长了些
由上述代码联想,model_config里的参数,大部分是可以python动态设置的,试一下max_batch_size =64 啊 2024-04-09 19:14:20,778 - lmdeploy - WARNING - model_config:
[llama]
model_name = internlm2
tensor_para_size = 1
head_num = 16
kv_head_num = 8
vocab_size = 92544
num_layer = 24
inter_size = 8192
norm_eps = 1e-05
attn_bias = 0
start_id = 1
end_id = 2
session_len = 32776
weight_type = int4
rotary_embedding = 128
rope_theta = 1000000.0
size_per_head = 128
group_size = 128
max_batch_size = 128
max_context_token_num = 1
step_length = 1
cache_max_entry_count = 0.01
cache_block_seq_len = 64
cache_chunk_size = -1
num_tokens_per_iter = 0
max_prefill_iters = 1
extra_tokens_per_iter = 0
use_context_fmha = 1
quant_policy = 0
max_position_embeddings = 32768
rope_scaling_factor = 0.0
use_dynamic_ntk = 0
use_logn_attn = 0
不理解原理,max_batch_size =64的时候,没有对应英文输出Response了......
关于LMDeploy与Transformer库的推理速度差异,实际就是TurbMind和transformer推理引擎的能力差异。