书生·浦语2.0(InternLM2)大模型实战--Day03 LMDeploy量化部署 | LLMVLM实战

本文主要是介绍书生·浦语2.0(InternLM2)大模型实战--Day03 LMDeploy量化部署 | LLMVLM实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

  • 课程视频:https://www.bilibili.com/video/BV1tr421x75B/
  • 课程文档:https://github.com/InternLM/Tutorial/blob/camp2/lmdeploy/README.md
  • 课程作业:https://github.com/InternLM/Tutorial/blob/camp2/lmdeploy/homework.md
  • 平台:InternLM-studio

1.LMDeploy环境部署

1.1 InternStudio创建conda环境

InternStudio开发机创建conda环境(推荐)
由于环境依赖项存在torch,下载过程可能比较缓慢。InternStudio上提供了快速创建conda环境的方法。打开命令行终端,创建一个名为lmdeploy的环境:

studio-conda -t lmdeploy -o pytorch-2.1.2
环境创建成功后,提示如下:
在这里插入图片描述

1.2 本地环境创建conda环境

注意,如果你在上一步已经在InternStudio开发机上创建了conda环境,这一步就没必要执行了。

详情
打开命令行终端,让我们来创建一个名为lmdeploy的conda环境,python版本为3.10。

conda create -n lmdeploy -y python=3.10
环境创建成功后,提示如下:
在这里插入图片描述

1.3 安装LMDeploy

接下来,激活刚刚创建的虚拟环境。安装0.3.0版本的lmdeploy。

conda activate lmdeploy
pip install lmdeploy[all]==0.3.0

等待安装结束就OK了!

2 LMDeploy模型对话(chat)

2.1 Huggingface与TurboMind

HuggingFace

HuggingFace是一个高速发展的社区,包括Meta、Google、Microsoft、Amazon在内的超过5000家组织机构在为HuggingFace开源社区贡献代码、数据集和模型。可以认为是一个针对深度学习模型和数据集的在线托管社区,如果你有数据集或者模型想对外分享,网盘又不太方便,就不妨托管在HuggingFace。

托管在HuggingFace社区的模型通常采用HuggingFace格式存储,简写为HF格式。

但是HuggingFace社区的服务器在国外,国内访问不太方便。国内可以使用阿里巴巴的MindScope社区,或者上海AI Lab搭建的OpenXLab社区,上面托管的模型也通常采用HF格式。

TurboMind

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

TurboMind推理引擎仅支持推理TurboMind格式的模型。因此,TurboMind在推理HF格式的模型时,会首先自动将HF格式模型转换为TurboMind格式的模型。该过程在新版本的LMDeploy中是自动进行的,无需用户操作。

几个容易迷惑的点:

  • TurboMind与LMDeploy的关系:LMDeploy是涵盖了LLM
    任务全套轻量化、部署和服务解决方案的集成功能包,TurboMind是LMDeploy的一个推理引擎,是一个子模块。LMDeploy也可以使用pytorch作为推理引擎。
  • TurboMind与TurboMind模型的关系:TurboMind是推理引擎的名字,TurboMind模型是一种模型存储格式

,TurboMind引擎只能推理TurboMind格式的模型。

2.2 下载模型

本次实战营已经在开发机的共享目录中准备好了常用的预训练模型,可以运行如下命令查看:

ls /root/share/new_models/Shanghai_AI_Laboratory/

显示如下,每一个文件夹都对应一个预训练模型。
在这里插入图片描述
以InternLM2-Chat-1.8B模型为例,从官方仓库下载模型。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我换一个问题
在这里插入图片描述
额额,过于离谱。。

以命令行方式与模型对话
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.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 权重反量化)。

3.1 设置最大KV Cache缓存大小

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

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

设置不同比例,运行对话,查看右上角资源监视器中的显存占用情况

# 首先保持不加该参数(默认0.8),运行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.5# 把--cache-max-entry-count参数设置为0.01,约等于禁止KV Cache占用显存。
lmdeploy chat /root/internlm2-chat-1_8b --cache-max-entry-count 0.01

显存占用分别为7816M 、6660M 、 4904M
在这里插入图片描述
显然,该参数可以降低缓存,但代价是降低模型推理速度。

3.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目录。(请记住这个目录,后面改成量W4A16时需要用到)

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

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

在这里插入图片描述
可以看到,显存占用变为2436MB,明显降低。

进阶作业
1.设置KV Cache最大占用比例为0.4,开启W4A16量化,以命令行方式与模型对话。
在这里插入图片描述
在这里插入图片描述

4.LMDeploy服务(serve)

在第二章和第三章,我们都是在本地直接推理大模型,这种方式成为本地部署。在生产环境下,我们有时会将大模型封装为API接口服务,供客户端访问。

我们来看下面一张架构图:
在这里插入图片描述

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

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

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

4.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查看接口的具体使用说明,如下图所示。
在这里插入图片描述

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

在“4.1”中,我们在终端里新开了一个API服务器。

本节中,我们要新建一个命令行客户端去连接API服务器。首先通过VS Code新建一个终端:
在这里插入图片描述
激活conda环境。
运行命令行客户端:

lmdeploy serve api_client http://localhost:23333

运行后,可以通过命令行窗口直接与模型对话:
在这里插入图片描述
现在使用的架构是这样的:
在这里插入图片描述

4.3 网页客户端连接API服务器

关闭刚刚的VSCode终端,但服务器端的终端不要关闭。

新建一个VSCode终端,激活conda环境。
使用Gradio作为前端,启动网页客户端。

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

注意,这一步由于Server在远程服务器上,所以本地需要做一下ssh转发才能直接访问。在你本地打开一个cmd窗口,输入命令如下:

ssh -CNg -L 23333:127.0.0.1:23333 root@ssh.intern-ai.org.cn -p <你的ssh端口号>

在这里插入图片描述
然后打开浏览器,访问http://127.0.0.1:23333
然后就可以与模型进行对话了!
在这里插入图片描述
在这里插入图片描述
现在使用的架构是这样的:
在这里插入图片描述

进阶作业
2.以API Server方式启动 lmdeploy,开启 W4A16量化,调整KV Cache的占用比例为0.4,分别使用命令行客户端与Gradio网页客户端与模型对话。

【步骤1】以API Server方式启动 lmdeploy,开启 W4A16量化,调整KV Cache的占用比例为0.4,有三处要改哈!

  • 模型路径:原/root/internlm2-chat-1_8b,改为/root/internlm2-chat-1_8b-4bit
  • 模型格式model-format:原hf,改为awq
  • 加KV Cache比例参数:指定cache-max-entry-count 0.4

代码如下,

lmdeploy serve api_server \/root/internlm2-chat-1_8b-4bit \--model-format awq \--cache-max-entry-count 0.4 \--quant-policy 0 \--server-name 0.0.0.0 \--server-port 23333 \--tp 1 

在这里插入图片描述
【步骤2】使用命令行客户端与模型对话
启动后,同 章节4.2 的操作,运行起命令行客户端即可
在这里插入图片描述

【步骤3】使用Gradio网页客户端与模型对话
启动后,同 章节4.3 的操作,运行起Gradio网页客户端即可
在这里插入图片描述

5.Python代码集成

在开发项目时,有时我们需要将大模型推理集成到Python代码里面。

5.1 Python代码集成运行1.8B模型

新建pipeline.py,填入以下内容。

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

代码解读
第1行,引入lmdeploy的pipeline模块
第3行,从目录“./internlm2-chat-1_8b”加载HF模型
第4行,运行pipeline,这里采用了批处理的方式,用一个列表包含两个输入,lmdeploy同时推理两个输入,产生两个输出结果,结果返回给response
第5行,输出response

保存后运行代码文件:

python /root/pipeline.py

在这里插入图片描述

5.2 向TurboMind后端传递参数

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

以设置KV Cache占用比例为例,新建python文件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

在这里插入图片描述

进阶作业
3.使用W4A16量化,调整KV Cache的占用比例为0.4,使用Python代码集成的方式运行internlm2-chat-1.8b模型。

新建pipeline_kv2.py,修改红框中的3处位置

from lmdeploy import pipeline, TurbomindEngineConfig# 使用W4A16量化
# 调低 k/v cache内存占比调整为总显存的 40%
backend_config = TurbomindEngineConfig(model_format='awq',cache_max_entry_count=0.4)# 修改模型位置
pipe = pipeline('/root/internlm2-chat-1_8b-4bit',backend_config=backend_config)
response = pipe(['Hi, pls intro yourself', '上海是'])
print(response)

在这里插入图片描述

6.拓展部分

6.1 使用LMDeploy运行视觉多模态大模型llava

最新版本的LMDeploy支持了llava多模态模型。运行本pipeline最低需要30%的InternStudio开发机

安装llava依赖库

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

新建一个python文件pipeline_llava.py,填入内容如下:

from lmdeploy.vl import load_image
from lmdeploy import pipeline, TurbomindEngineConfigbackend_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)

代码解读:

第1行引入了lmdeploy的pipeline模块,第2行引入用于载入图片的load_image函数
第5行创建了pipeline实例
第7行从github下载了一张关于老虎的图片,如下:
在这里插入图片描述
第8行运行pipeline,输入提示词“describe this image”,和图片,结果返回至response
第9行输出response

运行pipeline

python /root/pipeline_llava.py

在这里插入图片描述

我的回答的翻译是:这是一张老虎趴在草地上的彩色照片。老虎正对着镜头,眼睛睁得大大的,目光直视前方。它的头部突出,有深色的竖条纹,皮毛是典型的橙色和黑色混合色。老虎的耳朵竖起,嘴微微张开,给人一种轻松而又警惕的感觉。背景是模糊的,暗示着绿树成荫的自然环境。图片上没有明显的文字或特殊标志

我们也可以通过Gradio来运行llava模型。新建python文件gradio_llava.py,填入以下内容:

import gradio as gr
from lmdeploy import pipeline, TurbomindEngineConfigbackend_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)).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 <你的ssh端口>

通过浏览器访问 http://127.0.0.1:7860

然后就可以使用啦~
在这里插入图片描述

进阶作业
4.使用 LMDeploy 运行视觉多模态大模型 llava gradio demo
在这里插入图片描述在这里插入图片描述

6.2 使用LMDeploy运行第三方大模型

LMDeploy不仅支持运行InternLM系列大模型,还支持其他第三方大模型。支持的模型列表如下:
在这里插入图片描述
可以从Modelscope,OpenXLab下载相应的HF模型,下载好HF模型,下面的步骤就和使用LMDeploy运行InternLM2一样啦~

这篇关于书生·浦语2.0(InternLM2)大模型实战--Day03 LMDeploy量化部署 | LLMVLM实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903317

相关文章

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.