赞
踩
大模型的特点:
显存开销大、需要缓存大量的kv、数据长度不统一(动态shape)、请求数量不固定,token逐个生成
因此,对应的大模型部署挑战有:
硬件设备 | 巨大的存储开销 |
训练推理 | token的加速生成、内存的有效管理利用、动态shape的处理 |
服务 | 系统响应时间的降低、系统吞吐量的提升 |
LMDeploy:
是一个用于压缩、部署、服务 LLM 的工具包,由 MMRazor 和 MMDeploy 团队开发,英伟达设备上部署的全流程解决方案,其包括模型轻量化、推理和服务。
它具有以下核心功能:高效的推理引擎、交互式推理模式、量化。
主要说一下量化,因为后面主要有对量化进行课程实践。
量化的主要目的是减小显存占用,提升运行速度。
这里附上机智流的Llama3教程链接:
按照之前的章节,下载配置好必要的环境、权重等。
- # 创建镜像并下载依赖
- conda create -n llama3 python=3.10
- conda activate llama3
- conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia
-
- # 安装git
- mkdir -p ~/model
- cd ~/model
- apt install git git-lfs -y
-
- # 获取权重模型
- git clone https://code.openxlab.org.cn/MrCat/Llama-3-8B-Instruct.git Meta-Llama-3-8B-Instruct
安装 LMDeploy并运行
- conda activate lmdeploy
-
- # 安装
- pip install -U lmdeploy[all]
-
- # 运行
- lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct
之后就可以在终端界面进行对话:
通过设置KV Cache得以实现。
模型在运行时,占用的显存可大致分为三部分:模型参数本身占用的显存、KV Cache占用的显存,以及中间运算结果占用的显存。KV Cache便是以空间换时间,当输入序列非常长的时候,需要缓存非常多K和V。
LMDeploy的KV Cache管理器可以通过设置--cache-max-entry-count参数,控制KV缓存占用剩余显存的最大比例。默认的比例为0.8。
显存使用查询
- # 如果你是InternStudio 就使用
- # studio-smi
- nvidia-smi
当不设置参数时(默认0.8)
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct/
当设置参数为0.5时
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct/ --cache-max-entry-count 0.5
当设置参数为0.1时
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct/ --cache-max-entry-count 0.1
显存占用降低,代价就是模型推理速度的降低。
激活感知的量化,属于weight-only仅权重量化方法。通过保护更“重要”的权重不进行量化,从而在不进行训练的情况下提高准确率。
W4A16的含义是参数4bit量化,激活时是16bit。(后续会开章节进一步学习LMDeploy)
只需要一个命令便可以进行W4A16的量化:
- lmdeploy lite auto_awq \
- /root/model/Meta-Llama-3-8B-Instruct \
- --calib-dataset 'ptb' \
- --calib-samples 128 \
- --calib-seqlen 1024 \
- --w-bits 4 \
- --w-group-size 128 \
- --work-dir /root/model/Meta-Llama-3-8B-Instruct_4bit
参数说明:
/root/model/Meta-Llama-3-8B-Instruct为待量化的模型所在的路径
calib-dataset | 指定用于校准量化模型的数据集 |
calib-samples | 从校准数据集中使用的样本数量 |
calib-seqlen | 校准时序列的长度 |
w-bits | 权重量化的位宽。这里的4表示模型的权重将被量化为4位表示 |
w-group-size | 参数指定了权重分组的大小 |
work-dir | 量化后的模型和相关文件将被保存的位置 |
之后使用chat功能运行量化后的模型:
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct_4bit --model-format awq
值得说明的是,KV量化和W4A16量化可以同步进行,对比之前单单的0.1的KV量化:
lmdeploy chat /root/model/Meta-Llama-3-8B-Instruct_4bit --model-format awq --cache-max-entry-count 0.1
效果拔群!
封装API接口服务,供客户端使用。
使用以下命令启动API服务器,使用量化后的Meta-Llama-3-8B-Instruct_4bit模型:
- lmdeploy serve api_server \
- /root/model/Meta-Llama-3-8B-Instruct_4bit \
- --model-format awq \
- --quant-policy 0 \
- --server-name 0.0.0.0 \
- --server-port 23333 \
- --tp 1
参数说明:
model-format | 模型的格式,这里使用的是awq,之前原模型的话是hf |
quant-policy | 量化策略,优化模型的大小和精度 |
server-name | 服务器主机名 |
server-port | 监听端口号 |
tp | 并行数量(GPU数量) |
打开http://localhost:23333便可以查看接口的具体使用说明:
但因为服务端在远端,想要真正使用对应服务,本地需要做SSH端口转发,即本地打开cmd窗口,输入命令;
ssh -CNg -L 23333:127.0.0.1:23333 {username}@{hostname} -p {远程服务器端口号}
在客户端运行命令:
lmdeploy serve api_client http://localhost:23333
之后可以直接在窗口进行对话
这里使用python的gradio模块
- conda activate lmdeploy
-
- pip install gradio==3.50.2
-
- lmdeploy serve gradio http://localhost:23333 \
- --server-name 0.0.0.0 \
- --server-port 6006
之后访问地址http://localhost:6006,就可以与模型进行对话:
4、LMDeploy运行视觉多模态大模型Llava-Llama-3
- # 安装依赖
- pip install git+https://github.com/haotian-liu/LLaVA.git
-
- # 新建一个py文件
- vi pipeline_llava.py
之后复制代码进去
- from lmdeploy import pipeline, ChatTemplateConfig, TurbomindEngineConfig
- from lmdeploy.vl import load_image
-
- # 图片分辨率较高时请调高session_len
- backend_config = TurbomindEngineConfig(session_len=8192)
-
- pipe = pipeline('xtuner/llava-llama-3-8b-v1_1-hf',
- chat_template_config=ChatTemplateConfig(model_name='llama3'),
- 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.text)
运行py文件可以得到结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。