LMDoply部署实战

news/2024/12/22 23:12:12/

        使用LMDeoply部署各类开源大模型,进行推理实践。

一. 环境准备

1. 创建Conda环境

studio-conda -t lmdeploy -o pytorch-2.1.2

2. 安装LMDeploy

激活刚刚创建的虚拟环境。

conda activate lmdeploy

安装0.3.0版本的lmdeploy。

pip install lmdeploy[all]==0.3.0

3. 准备模型

        在InternStudio开发机上,将共享目录下已经下载好的模型,连接到我们的目录下

ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/

二. 运行模型

1. 使用transformer推理模型

创建python 脚本

touch /root/pipeline_transformer.py

输入内容:

import torch
from transformers import AutoTokenizer, AutoModelForCausalLMtokenizer = 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脚本:

python /root/pipeline_transformer.py

记住这种感觉,一会儿体验一下LMDeploy的推理速度,感受一下对比

2. 使用LMDeploy与模型对话

        运行模型:

        lmdeploy chat /root/internlm2-chat-1_8b

        输入你的问题后,按两下回车键,进行回答。

三. LMDeploy模型量化(lite)

        本部分内容主要介绍如何对模型进行量化。主要包括 KV8量化和W4A16量化。总的来说,量化是一种以参数或计算中间结果精度下降换空间节省(以及同时带来的性能提升)的策略。

正式介绍 LMDeploy 量化方案前,需要先介绍两个概念:

  • 计算密集(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 权重反量化)。

1. 设置KV Cache缓存大小

        KV Cache是一种缓存技术,通过存储键值对的形式来复用计算结果,以达到提高性能和降低内存消耗的目的。在大规模训练和推理中,KV Cache可以显著减少重复计算量,从而提升模型的推理速度。理想情况下,KV Cache全部存储于显存,以加快访存速度。当显存空间不足时,也可以将KV Cache放在内存,通过缓存管理器控制将当前需要使用的数据放入显存。

模型在运行时,占用的显存可大致分为三部分:模型参数本身占用的显存、KV Cache占用的显存,以及中间运算结果占用的显存。LMDeploy的KV Cache管理器可以通过设置--cache-max-entry-count参数,控制KV缓存占用剩余显存的最大比例。默认的比例为0.8。

下面通过几个例子,来看一下调整--cache-max-entry-count参数的效果。首先保持不加该参数(默认0.8),运行1.8B模型。

lmdeploy chat /root/internlm2-chat-1_8b

与模型对话,查看右上角资源监视器中的显存占用情况。

此时显存占用为34056MB。下面,改变--cache-max-entry-count参数,设为0.5。

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

与模型对话,再次查看右上角资源监视器中的显存占用情况。

看到显存占用明显降低,变为22984M。

下面来一波“极限”,把--cache-max-entry-count参数设置为0.01,约等于禁止KV Cache占用显存。

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

2. 使用W4A16量化

LMDeploy使用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

运行时间较长,请耐心等待。量化工作结束后,新的HF模型被保存到internlm2-chat-1_8b-4bit目录。下面使用Chat功能运行W4A16量化后的模型。

lmdeploy chat /root/internlm2-chat-1_8b-4bit --model-format awq

为了更加明显体会到W4A16的作用,我们将KV Cache比例再次调为0.01,查看显存占用情况。

lmdeploy chat /root/internlm2-chat-1_8b-4bit --model-format awq --cache-max-entry-count 0.01

可以看到,显存占用变为2788MB,明显降低。

四. LMDeploy服务(serve)

在生产环境下,我们有时会将大模型封装为API接口服务,供客户端访问。

我们来看下面一张架构图:

我们把从架构上把整个服务流程分成下面几个模块。

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

值得说明的是,以上的划分是一个相对完整的模型,但在实际中这并不是绝对的。比如可以把“模型推理”和“API Server”合并,有的甚至是三个流程打包在一起提供服务。

1. 启动API服务器

        通过以下命令启动API服务器,推理internlm2-chat-1_8b模型:

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 api_server -h

你也可以直接打开http://{host}:23333查看接口的具体使用说明,如下图所示。

将端口转发到本地

ssh -CNg -L 23333:127.0.0.1:23333 root@ssh.intern-ai.org.cn -p 42351

本地浏览器访问:

http://127.0.0.1:23333

2. 命令行客户端连接API服务器

lmdeploy serve api_client http://localhost:23333

现在你使用的架构是这样的:

3. 网页客户端连接API服务器

使用Gradio作为前端,启动网页客户端。这里必须保持第一步的 API服务器是处于开启的状态。

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

运行命令后,网页客户端启动。在电脑本地新建一个cmd终端,新开一个转发端口:

ssh -CNg -L 6006:127.0.0.1:6006 root@ssh.intern-ai.org.cn -p 42351

打开浏览器,访问地址http://127.0.0.1:6006

然后就可以与模型进行对话了!

现在你使用的架构是这样的:

五. 集成到Python代码中

1. python代码运行1.8B 模型

首先激活conda环境。

conda activate lmdeploy

新建Python源代码文件pipeline.py

touch /root/pipeline.py

打开pipeline.py,填入以下内容。

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

保存后运行代码文件:

python /root/pipeline.py

2. 向TurboMind后端传递参数

在第3章,我们通过向lmdeploy传递附加参数,实现模型的量化推理,及设置KV Cache最大占用比例。在Python代码中,可以通过创建TurbomindEngineConfig,向lmdeploy传递参数。

以设置KV Cache占用比例为例,新建python文件pipeline_kv.py

touch /root/pipeline_kv.py

打开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代码:

python /root/pipeline_kv.py

六. 拓展部分

最新版本的LMDeploy支持了llava多模态模型,下面演示使用pipeline推理llava-v1.6-7b

1. 首先激活conda环境。

conda activate lmdeploy

2. 安装llava依赖库。

pip install git+https://github.com/haotian-liu/LLaVA.git@4e2277a060da264c4f21b364c867cc622c945874

3. 编写脚本文件

新建一个python文件,比如pipeline_llava.py

touch /root/pipeline_llava.py

打开pipeline_llava.py,填入内容如下:

from lmdeploy import pipeline
from lmdeploy.vl import load_image# pipe = pipeline('liuhaotian/llava-v1.6-vicuna-7b') 非开发机运行此命令
pipe = pipeline('/share/new_models/liuhaotian/llava-v1.6-vicuna-7b')image = load_image('https://raw.githubusercontent.com/open-mmlab/mmdeploy/main/tests/data/tiger.jpeg')
response = pipe(('describe this image', image))
print(response)

4. 保存后运行pipeline。

python /root/pipeline_llava.py

5. Gradio来运行llava模型

我们也可以通过Gradio来运行llava模型。新建python文件gradio_llava.py

touch /root/gradio_llava.py

打开文件,填入以下内容:

import gradio as gr
from lmdeploy import pipeline# pipe = pipeline('liuhaotian/llava-v1.6-vicuna-7b') 非开发机运行此命令
pipe = pipeline('/share/new_models/liuhaotian/llava-v1.6-vicuna-7b')def model(image, text):if image is None:return [(text, "请上传一张图片。")]else:response = pipe((text, image)).textreturn [(text, response)]demo = gr.Interface(fn=model, inputs=[gr.Image(type="pil"), gr.Textbox()], outputs=gr.Chatbot())
demo.launch()   

运行python程序。

python /root/gradio_llava.py

通过ssh转发一下7860端口。

ssh -CNg -L 7860:127.0.0.1:7860 root@ssh.intern-ai.org.cn -p 42351

本地通过浏览器访问:

http://127.0.0.1:7860

这里上传的图片要小一点的,太大无法支持。这里我问了他是谁,它回答是马斯克,


http://www.ppmy.cn/news/1413653.html

相关文章

Qt第六章对话框

第六章QDialog(Layouts) 文章目录 第六章QDialog(Layouts)QDialogButtonBoxQMessageBoxQFileDialogQFontDialogQColorDialogQInpuDialogQProgressDialogQErrorMessage 模态对话框:在弹出对话框时,除了该对话框整个应用程序窗口都无法接受用户响应&#x…

Celery使用异步、定时任务使用

一、什么是Celery 1.1、celery是什么 Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度。 Celery的架构由三部分组成,消息中间件(message broker&#xf…

MySQL——Linux安装包

一、下载安装包 MySQL下载路径: MySQL :: MySQL Downloads //默认下载的企业版MySQL 下载社区版MySQL MySQL :: MySQL Community Downloads 1、源码下载 2、仓库配置 3、二进制安装包 基于官方仓库安装 清华centos 软件仓库: Index of /cen…

MySQL面试题系列-14

MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的RDBMS (Relational Database Management System,关系数据…

echarts 水库水位图

<div id"sssqtb" class"sssqtb"></div> // 水位示意图initChart() {var maxHeight "250"; //最大高度/堤坝高度let markline ["170", "120", "70", "0"]; //设计水位&#xff0c;汛限水…

v3+antd+echarts的bug记录

一、DatePicker 日期选择框 <a-range-picker v-model:value"value" /> 使用该组件时绑定数据必须使用ref 进行绑定&#xff0c;不能使用reactive 绑定&#xff0c;否则会出现 修改完日期&#xff0c;但是页面数据不会更新的bug 二、echarts折线图tooltip不显…

第十一届蓝桥杯省赛真题(C/C++大学B组)

试题A &#xff1a;门牌制作 #include <bits/stdc.h> using namespace std;const int N 100000; int arr[N];int main() {int ans 0,t;for(int i 1;i < 2020;i){t i;while(t > 0){if(t % 10 2) ans;t / 10;}}cout<<ans<<endl;return 0; } 试题B …

常见分类算法

常见的分类算法包括但不限于&#xff1a; K近邻算法 (K-Nearest Neighbors, KNN): 根据特征空间中样本点的距离&#xff0c;将待分类样本的类别归属为其K个最近邻居中最多数目的类别。 支持向量机 (Support Vector Machine, SVM): 通过寻找一个最优超平面&#xff0c;将不同类…