书生·浦语--(五)LMDeploy 量化部署 LLM-VLM 实践(基础作业)

LLM微调是一个将预训练模型在较小、特定数据集上进一步训练的过程,目的是精炼模型的能力,提高其在特定任务或领域上的性能。

模型部署
1. 配置
LMDeploy运行环境

1.1创建开发机
    在InternStudio平台,创建开发机

1.2创建conda环境
    点击左上角图标,切换为终端(Terminal)模式

    InternStudio上提供了快速创建conda环境的方法。打开命令行终端,创建一个名为lmdeploy的环境:

studio-conda -t lmdeploy -o pytorch-2.1.2

按照上述步骤之后即可得到预训练好的internlm2-chat-1_8b模型。

2、LMdeploy模型对话
Transformer库是Huggingface社区推出的用于运行HF模型的官方库。

首先通过Transformer库运行模型。

然后通过LMdeploy的方式部署并运行模型。

三、LMdeploy模型量化
模型的量化主要包括 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缓存大小
通过设置--cache-max-entry-count参数可以调整KV缓存占用剩余显存的最大比例,影响推理速度。

两种不同的设置反应在不同的显存使用上,对于--cache-max-entry-count = 0.01来说基本不使用额外显存存储KV参数,显存的消耗跟载入一个1.8B模型的参数量基本相同,但此时推理速度大大降低。

3.2 使用W4A16量化
LMDeploy使用AWQ算法,实现模型4bit权重量化。推理引擎TurboMind提供了非常高效的4bit推理cuda kernel,性能是FP16的2.4倍以上。

使用以下命令完成模型量化工作。

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

再设置KV缓存占比为0.4,比较前后的显存使用情况,可以看到量化后的模型在参数存储方面的开销明显降低。

四、LMDeploy服务(serve)

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

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

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

以下展示使用Gradio作为前端,启动网页客户端访问大模型。

5.Python代码集成

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

可以使用lmdeploy的pipeline来解决这个问题。

新建一个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

运行代码即可。

 在Python代码中,可以通过创建TurbomindEngineConfig,向lmdeploy传递参数。

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

通过pipeline运行llava。

 通过Gradio来运行llava模型。

  • 23
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值