第五课笔记

本文详细介绍了大模型部署的背景、特点和挑战,着重介绍了LMDeploy工具,包括其量化技术(如KVCache和W4A16量化),以及如何通过TurboMind进行推理引擎部署和实战演示。作者给出了模型部署的方案和Python调用示例,强调了量化在内存管理中的重要性。
摘要由CSDN通过智能技术生成


前言

本文介绍大模型部署的背景知识,并介绍LMDeploy工具,并实现一个部署demo

一、大模型部署的背景知识

大模型的特点

显存开销大:7B的模型就需要14G显存
自回归需要缓存大量的kv,显存开销大
shape是动态的:请求数量不固定,token逐个生成

大模型部署的挑战

设备:难以应对巨大的存储开销
推理:token的生成如何加速;动态的shape如何解决;如何有效管理和利用内存
服务:提升系统的整体吞吐量,降低平均响应时间

部署的方案

模型并行
低比特量化

在这里插入图片描述

二、LMDeploy简介

1.基本情况

LLM在英伟达设备上的部署方案,包含模型轻量化、推理和服务
在这里插入图片描述
推理性能:
静态(固定batch和输出输入的token数目):小batch下性能是fp16的两倍,batch越大加速效果越不明显
动态(输入输出不定长):精度优于vLLM框架

2.LMDeploy的核心功能

量化

量化的目的:减小显存占用,提升运行速度
推理的两种该情况:计算密集和访存密集
解决计算密集:采用更快的硬件计算单元提升速度,如量化
解决访存密集:提高计算访存比
Weight Only的量化可以一举两得的起到解决现存和提升推理速度的作用,内部的核心算法是AWQ算法

推理引擎TurboMind

在这里插入图片描述
持续批处理:
不必batch中的所有样本都处理完才进行下一个batch
有状态的推理:
请求不带历史记录,历史记录在推理测缓存中
blocked k/vcache:
block有三种状态:Free,Activate,Cache
计算过程中动态的调整显存
高性能的cuda kernel:
不断更新最新的优化方法

推理服务

通过api启动服务

部署实战demo

准备工作

创建环境

/root/share/install_conda_env_internlm_base.sh lmdeploy #复制一个base环境
conda activate lmdeploy # 激活环境
pip install packaging # 安装一个库
pip install /root/share/wheels/flash_attn-2.4.2+cu118torch2.0cxx11abiTRUE-cp310-cp310-linux_x86_64.whl # 使用预编译包提升flash_attn的安装速度
pip install 'lmdeploy[all]==v0.1.0' # 安装lmdeploy

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
模型转换
在线转换

在线转换模型权重,直接读取本地的模型权重
(也支持读取huggingface上的模型权重)

lmdeploy chat turbomind /share/temp/model_repos/internlm-chat-7b/  --model-name internlm-chat-7b

 
 
  • 1

运行上述命令会在终端直接创建一个对话窗口
在这里插入图片描述

离线转换

与在线转换的区别在于需要首先将模型转换为TurboMind格式
转换后就可以实现tensor并行
在这里插入图片描述
创建一个lmdeploy文件夹,并利用官方提供的模型文件进行离线转换

mkdir lmdeploy
cd lmdeploy
lmdeploy convert internlm-chat-7b  /root/share/temp/model_repos/internlm-chat-7b/

 
 
  • 1
  • 2
  • 3

转换后会在当前文件夹下生成一个workspace文件夹
在这里插入图片描述
随后使用lmdeploy chat turbomind ./workspace即可启动基于TurboMind推理引擎的本地对话
在这里插入图片描述
可以发现同样的指令,两次生成的故事是不一样的,并且基于TurboMind推理引擎的生成速度要更快

TurboMind与API服务

使用以下命令启动服务

# ApiServer+Turbomind   api_server => AsyncEngine => TurboMind
lmdeploy serve api_server ./workspace \
	--server_name 0.0.0.0 \
	--server_port 23333 \
	--instance_num 64 \
	--tp 1

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

再启动一个终端,在新终端中运行

lmdeploy serve api_client http://localhost:23333

 
 
  • 1

这样就可以启动刚刚创建的API服务,不需要加载模型,速度更快
在这里插入图片描述
打开本地终端,输入以下指令

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

 
 
  • 1

即可在本地打开http://localhost:23333
在这里插入图片描述
可以通过在页面上修改传入API的参数,实现对话
在这里插入图片描述
发现这里的模型似乎有点奇怪,问他是谁他竟然说自己是程序员哈哈

网页demo

可以使用TurboMind服务作为后端或者直接用TurboMind推理作为后端
以TurboMind推理作为后端:

lmdeploy serve gradio ./workspace

 
 
  • 1

此时本地需要映射6006端口ssh -CNg -L 6006:127.0.0.1:6006 root@ssh.intern-ai.org.cn -p 34027
再打开http://localhost:6006/即可
在这里插入图片描述
以TurboMind服务作为后端:
先启动服务:

# ApiServer+Turbomind   api_server => AsyncEngine => TurboMind
lmdeploy serve api_server ./workspace \
	--server_name 0.0.0.0 \
	--server_port 23333 \
	--instance_num 64 \
	--tp 1

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

再用gradio调用

# Gradio+ApiServer。必须先开启 Server,此时 Gradio 为 Client
lmdeploy serve gradio http://0.0.0.0:23333 \
	--server_name 0.0.0.0 \
	--server_port 6006 \
	--restful_api True

 
 
  • 1
  • 2
  • 3
  • 4
  • 5

完成后打开http://localhost:6006/ 界面如下
在这里插入图片描述

如何选用合适的部署方式

在这里插入图片描述
对于Python项目,推荐使用TurboMind推理+Python的方式,直接调用,类似于

from lmdeploy import turbomind as tm

load model

model_path = “/root/share/temp/model_repos/internlm-chat-7b/”
tm_model = tm.TurboMind.from_pretrained(model_path, model_name=‘internlm-chat-20b’)
generator = tm_model.create_instance()

process query

query = “你好啊兄嘚”
prompt = tm_model.model.get_prompt(query)
input_ids = tm_model.tokenizer.encode(prompt)

inference

for outputs in generator.stream_infer(
session_id=0,
input_ids=[input_ids]):
res, tokens = outputs[0]

response = tm_model.tokenizer.decode(res.tolist())
print(response)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

模型量化

LLM是访存密集型,量化可以降低显存,提高效率
资源足够的时候可以不需要量化,只有CPU或者文本长度很长的时候,就需要量化

KV Cache量化

将KV变成int8
第一步:计算minmax
第二步:线性映射到0-255或者-127-127的范围
第三步:修改配置文件quant_policy参数为4,表示打开KVCache的开关

可以解决20%的显存,性能有时候还有提升。
量化相当于引入了轻微的噪声,有可能会起到一定的正则化作用;同时量化后的模型可能刚好适配某个数据集

W4A16量化

A16表示Activation保持FP16,只对权重参数进行4bit量化

总结

本文主要介绍了模型量化和LMDeploy的基本应用,并实现了几个部署的demo

</article>
  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值