第五节

LMDeploy 量化部署 LLM&VLM 实践

一、理论基础

大模型部署面临的挑战:

  • 计算量巨大


  • 内存开销巨大


  • 访存瓶颈:硬件计算速度远快于显存带宽

  • 动态请求:请求量不确定,请求时间不确定,Token逐个生成,生成数量不确定。

大模型部署方法

模型剪枝

知识蒸馏 Distillation


先训练一个参数量大的教师网络,再用它训练一个参数量较小的学生网络。

量化


仅在存储时量化降低精度,计算时还要进行反量化

二、运行实战

2.1 环境部署

安装虚拟环境 lmdeploy


安装成功!

随后激活环境

2.2 LMDeploy 模型对话(chat)

  • HuggingFace:托管在 HuggingFace 社区的模型通常采用 HuggingFace 格式存储,简写为HF格式
  • 国内的阿里巴巴 MindScope 社区与上海AILab的 OpenXLab社区,上面托管的模型通常也是HF格式
  • TurboMind:LMDeploy 团队开发的一款关于LLM推理的高效引擎,仅支持 TurboMind 格式的模型。因此会自动把HF 格式转换为 TurboMind 格式
    • TurboMind与LMDeploy的关系:LMDeploy是涵盖了LLM 任务全套轻量化、部署和服务解决方案的集成功能包,TurboMind是LMDeploy的一个推理引擎,是一个子模块。LMDeploy也可以使用pytorch作为推理引擎。
    • TurboMind与TurboMind模型的关系:TurboMind是推理引擎的名字,TurboMind模型是一种模型存储格式,TurboMind引擎只能推理TurboMind格式的模型。
  1. 下载模型:使用软拷贝,拷贝到根目录


    模型
  2. 使用Transformer库运行模型
    编写 pipeline_transoformer.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()
# 用户输入文本"hello",通过model.chat函数使用模型和tokenizer生成回应。
# 这里假设model.chat是一个扩展或自定义的方法,用于处理交互式聊天。
# history=[]表示当前没有历史对话记录。
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)

  1. 运行代码
python /root/pipeline_transformer.py
运行结果

成功输出回答,运行时间两分钟。

  1. 使用 LMDeploy 与模型对话
lmdeploy chat /root/internlm2-chat-1_8b

加载模型成功,仅用时1分钟

用它来讲故事



答案输出速度非常快

2.3 LMDeploy 模型量化(lite)

2.3.1 概念

量化是一种以参数或计算中间结果精度下降换取空间节省(以及同时带来的性能提升)的策略。

  • 计算密集:推理时,绝大部分时间消耗在数值计算上。可以通过使用更快的硬件计算单元来提升计算速度。
  • 访存密集:推理时,绝大部分时间消耗在数据读取上。可以通过减少访存次数、提高计算访存比或降低访存量来优化。

常见的 LLM 模型由于 Decoder Only 架构的特性,实际推理时大多数的时间都消耗在了逐 Token 生成阶段(Decoding 阶段),是典型的访存密集型场景。

  • KV8量化:将逐 Token(Decoding)生成过程中的上下文 K 和 V 中间结果进行 INT8 量化(计算时再反量化),以降低生成过程中的显存占用。
  • W4A16量化:将 FP16 的模型权重量化为 INT4,Kernel 计算时,访存量直接降为 FP16 模型的 1/4,大幅降低了访存成本。
  • WeightOnly:指仅量化权重,数值计算依然采用 FP16(需要将 INT4 权重反量化)。

2.3.2 设置最大KV Cache缓存大小

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

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

运行模型,查看显存占用:

lmdeploy chat /root/internlm2-chat-1_8b

占用7816MB

改变参数

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

降低到了6600MB

2.3.3 使用W4A16量化

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

  1. 安装依赖库einops
  2. 执行命令完成量化
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

再次使用0.5的--cache-max-entry-count,查看内存占用



这次仅有5572MB,低于之前的6600MB。

2.4 LMDeploy 服务(serve)

我们将大模型封装为API接口服务。


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

2.4.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

0.0.0.0的23333号端口。
这一步由于Server在远程服务器上,所以本地需要做一下ssh转发才能直接访问。

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

在浏览器中打开本地的23333端口。


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

运行命令行客户端

lmdeploy serve api_client http://localhost:23333

在命令行中即可与大模型交互。



此时的价格


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

使用Gradio作为前端,启用网页客户端,6006端口

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

此时的架构:


2.5 Python 代码集成

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

编写python脚本

from lmdeploy import pipeline

pipe = 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


2.5.2 向TurboMind后端传递参数

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

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)

2.6 拓展部分

三、作业

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 228,443评论 6 532
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,530评论 3 416
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 176,407评论 0 375
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,981评论 1 312
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,759评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,204评论 1 324
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,263评论 3 441
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,415评论 0 288
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,955评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,782评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,983评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,528评论 5 359
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,222评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,650评论 0 26
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,892评论 1 286
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,675评论 3 392
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,967评论 2 374

推荐阅读更多精彩内容