赞
踩
LMDeploy 量化部署 LLM-VLM 实践_哔哩哔哩_bilibili
PDF链接:https://pan.baidu.com/s/1JFtvBWgEGFWJq8pHafvIUg?pwd=6666
提取码:6666
https://github.com/InternLM/Tutorial/blob/camp2/lmdeploy/README.md
RAG范式开发大模型
Xtuner微调大模型
LMDeploy部署大模型
1、计算量巨大
2、内存开销巨大
3、访存瓶颈和动态请求:batchsize访问
1、模型剪枝(Pruning):移除模型中不必要或者多余组件
2、知识蒸馏(Knowledge Distillation,KD):模型压缩,引导轻量化的学生模型
3、量化(Quantization):浮点数转换为整数或者其他离散形式,访储降低。
涵盖了 LLM 任务的全套轻量化、部署和服务解决方案,
1、创建conda环境
conda create -n lmdeploy -y python=3.10
2、安装LMDeploy
激活虚拟环境
conda activate lmdeploy
安装Imdeploy
pip install lmdeploy[all]==0.3.0
3.LMDeploy模型对话(chat)
3.1 Huggingface与TurboMind
HuggingFace:深度学习模型和数据集的在线托管社区,托管模型采用HF格式。modelscope(阿里)、openxlab(上海AI Lab)。
TurboMind:LMDeploy团队开发的LLM推理的高效推理引擎。LLaMa 结构模型的支持,continuous batch 推理模式和可扩展的 KV 缓存管理器。推理HF格式的模型时,会首先自动将HF格式模型转换为TurboMind格式的模型。
3.2 下载模型.
常用的预训练模型
ls /root/share/new_models/Shanghai_AI_Laboratory/
- cd ~
-
- ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/ #软连接
- # cp -r /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/ #拷贝
- ls
3.3 使用transformer运行模型
Transformer库是Huggingface社区推出的用于运行HF模型的官方库。
新建pipeline_transformer.py
touch /root/pipeline_transformer.py
- import torch
- from transformers import AutoTokenizer, AutoModelForCausalLM
-
- tokenizer = AutoTokenizer.from_pretrained("/root/internlm2-chat-1_8b", trust_remote_code=True)
-
- # Set `torch_dtype=torch.float16` to load model in float16, otherwise it will be loaded as float32 and cause OOM Error.
- model = AutoModelForCausalLM.from_pretrained("/root/internlm2-chat-1_8b", torch_dtype=torch.float16, trust_remote_code=True).cuda()
- model = model.eval()
-
- inp = "hello"
- print("[INPUT]", inp)
- response, history = model.chat(tokenizer, inp, history=[])
- print("[OUTPUT]", response)
-
- inp = "please provide three suggestions about time management"
- print("[INPUT]", inp)
- response, history = model.chat(tokenizer, inp, history=history)
- print("[OUTPUT]", response)
运行python代码:
- conda activate lmdeploy
- python /root/pipeline_transformer.py
4.使用LMDeploy与模型对话
使用LMDeploy与模型进行对话的通用命令格式为:lmdeploy chat [HF格式模型路径/TurboMind格式模型路径]
lmdeploy chat /root/internlm2-chat-1_8b
lmdeploy chat -h
5.LMDeploy模型量化(lite)
量化是一种以参数或计算中间结果精度下降换空间节省(以及同时带来的性能提升)的策略。
LLM 模型由于 Decoder Only 架构的特性,实际推理时大多数的时间都消耗在了逐 Token 生成阶段(Decoding 阶段),是典型的访存密集型场景。
KV8量化:将逐 Token(Decoding)生成过程中的上下文 K 和 V 中间结果进行 INT8 量化(计算时再反量化),以降低生成过程中的显存占用。
W4A16量化:将 FP16 的模型权重量化为 INT4,Kernel 计算时,访存量直接降为 FP16 模型的 1/4,大幅降低了访存成本。
Weight Only: 是指仅量化权重,数值计算依然采用 FP16(需要将 INT4 权重反量化)。
6. 设置最大KV Cache缓存大小
KV Cache是一种缓存技术,通过存储键值对的形式来复用计算结果,以达到提高性能和降低内存消耗的目的。
在大规模训练和推理中,KV Cache可以显著减少重复计算量,从而提升模型的推理速度。
当显存空间不足时,也可以将KV Cache放在内存,通过缓存管理器控制将当前需要使用的数据放入显存。
模型在运行时的显存占用:模型参数本身占用的显存、KV Cache占用的显存,以及中间运算结果占用的显存。
--cache-max-entry-count
参数,控制KV缓存占用剩余显存的最大比例。默认的比例为0.8
lmdeploy chat /root/internlm2-chat-1_8b
lmdeploy chat /root/internlm2-chat-1_8b --cache-max-entry-count 0.5
lmdeploy chat /root/internlm2-chat-1_8b --cache-max-entry-count 0.01
显存占用仅为4660MB,代价是会降低模型推理速度。
7. 使用W4A16量化
LMDeploy使用AWQ算法,实现模型4bit权重量化。
推理引擎TurboMind提供了非常高效的4bit推理cuda kernel。它支持以下NVIDIA显卡:
安装依赖库
pip install einops==0.7.0
模型量化:HF模型被保存到internlm2-chat-1_8b-4bit
目录
- 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
使用Chat功能运行W4A16量化
lmdeploy chat /root/internlm2-chat-1_8b-4bit --model-format awq
KV Cache比例再次调为0.01
lmdeploy chat /root/internlm2-chat-1_8b-4bit --model-format awq --cache-max-entry-count 0.01
LMDeploy的lite功能
lmdeploy lite -h
8. LMDeploy服务(serve)
实际中并不是绝对的划分。
8.1. 启动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数量)。
ssh -CNg -L 23333:127.0.0.1:23333 root@ssh.intern-ai.org.cn -p 43158
8.2 命令行客户端连接API服务器
lmdeploy serve api_client http://localhost:23333
8.3 网页客户端连接API服务器
- lmdeploy serve gradio http://localhost:23333 \
- --server-name 0.0.0.0 \
- --server-port 6006
9.Python代码集成
9.1 Python代码集成运行1.8B模型
新建Python源代码文件pipeline.py
。
touch /root/pipeline.py
- 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
9.2 向TurboMind后端传递参数
创建TurbomindEngineConfig,向lmdeploy传递参数。
新建python文件pipeline_kv.py
。
touch /root/pipeline_kv.py
设置KV Cache占用比例
- 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)
10.拓展部分
10.1 使用LMDeploy运行视觉多模态大模型llava
使用pipeline推理llava-v1.6-7b
安装llava依赖库。
pip install git+https://github.com/haotian-liu/LLaVA.git@4e2277a060da264c4f21b364c867cc622c945874
新建一个python文件
touch /root/pipeline_llava.py
- from lmdeploy.vl import load_image #引入用于载入图片的load_image函数
- from lmdeploy import pipeline, TurbomindEngineConfig#引入了lmdeploy的pipeline模块
-
-
- 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)# 创建了pipeline实例
-
- image = load_image('https://raw.githubusercontent.com/open-mmlab/mmdeploy/main/tests/data/tiger.jpeg')#从github下载了一张关于老虎的图片
- response = pipe(('describe this image', image))#输入提示词“describe this image”,和图片,结果返回至response
- print(response)
运行pipeline
python /root/pipeline_llava.py
Llava模型对中文支持性不好
通过Gradio来运行llava模型
touch /root/gradio_llava.py
- import gradio as gr
- 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)
-
- def model(image, text):
- if image is None:
- return [(text, "请上传一张图片。")]
- else:
- response = pipe((text, image)).text
- return [(text, response)]
-
- demo = gr.Interface(fn=model, inputs=[gr.Image(type="pil"), gr.Textbox()], outputs=gr.Chatbot())
- demo.launch()
ssh -CNg -L 7860:127.0.0.1:7860 root@ssh.intern-ai.org.cn -p 43158
10.2 使用LMDeploy运行第三方大模型
Model | Size |
---|---|
Llama | 7B - 65B |
Llama2 | 7B - 70B |
InternLM | 7B - 20B |
InternLM2 | 7B - 20B |
InternLM-XComposer | 7B |
QWen | 7B - 72B |
QWen-VL | 7B |
QWen1.5 | 0.5B - 72B |
QWen1.5-MoE | A2.7B |
Baichuan | 7B - 13B |
Baichuan2 | 7B - 13B |
Code Llama | 7B - 34B |
ChatGLM2 | 6B |
Falcon | 7B - 180B |
YI | 6B - 34B |
Mistral | 7B |
DeepSeek-MoE | 16B |
DeepSeek-VL | 7B |
Mixtral | 8x7B |
Gemma | 2B-7B |
Dbrx | 132B |
10.3 定量比较LMDeploy与Transformer库的推理速度差异
速度测试脚本
新建python文件,命名为benchmark_transformer.py
touch /root/benchmark_transformer.py
- import torch
- import datetime
- from transformers import AutoTokenizer, AutoModelForCausalLM
-
- tokenizer = AutoTokenizer.from_pretrained("/root/internlm2-chat-1_8b", trust_remote_code=True)
-
- # Set `torch_dtype=torch.float16` to load model in float16, otherwise it will be loaded as float32 and cause OOM Error.
- model = AutoModelForCausalLM.from_pretrained("/root/internlm2-chat-1_8b", torch_dtype=torch.float16, trust_remote_code=True).cuda()
- model = model.eval()
-
- # warmup
- inp = "hello"
- for i in range(5):
- print("Warm up...[{}/5]".format(i+1))
- response, history = model.chat(tokenizer, inp, history=[])
-
- # test speed
- inp = "请介绍一下你自己。"
- times = 10
- total_words = 0
- start_time = datetime.datetime.now()
- for i in range(times):
- response, history = model.chat(tokenizer, inp, history=history)
- total_words += len(response)
- end_time = datetime.datetime.now()
-
- delta_time = end_time - start_time
- delta_time = delta_time.seconds + delta_time.microseconds / 1000000.0
- speed = total_words / delta_time
- print("Speed: {:.3f} words/s".format(speed))
python benchmark_transformer.py
touch /root/benchmark_lmdeploy.py
- import datetime
- from lmdeploy import pipeline
-
- pipe = pipeline('/root/internlm2-chat-1_8b')
-
- # warmup
- inp = "hello"
- for i in range(5):
- print("Warm up...[{}/5]".format(i+1))
- response = pipe([inp])
-
- # test speed
- inp = "请介绍一下你自己。"
- times = 10
- total_words = 0
- start_time = datetime.datetime.now()
- for i in range(times):
- response = pipe([inp])
- total_words += len(response[0].text)
- end_time = datetime.datetime.now()
-
- delta_time = end_time - start_time
- delta_time = delta_time.seconds + delta_time.microseconds / 1000000.0
- speed = total_words / delta_time
- print("Speed: {:.3f} words/s".format(speed))
python benchmark_lmdeploy.py
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。