【InternLM 实战营第二期笔记5】LMDeploy 量化部署 LLM-VLM 实践

目录

Intro

大模型部署的痛点 

目前常用的模型部署方法(三类)

动手实践

配置 LMDeploy 运行环境

以命令行方式与 InternLM2-Chat-1.8B 模型对话

LMDeploy模型量化

模型量化-1.设置最大KV Cache缓存大小

模型量化-2. 使用W4A16量化

参考内容


课程文档 Link: Tutorial/lmdeploy/README.md at camp2 · InternLM/Tutorial · GitHub

视频链接:LMDeploy 量化部署 LLM-VLM 实践_哔哩哔哩_bilibili


Intro

之前的课程中学习了:1)使用RAG范式开发大模型 2)使用XTuner微调大模型,这些的目的都是为了能够使大模型的回答更加贴合我们的需求。但最终,模型都是要服务于实际业务场景,这个时候就涉及到模型部署。

模型部署Definition:将训练好的模型,部署到服务器端 or 边缘端。

  • 需要考虑很多问题:比如在服务器端部署,假设部署到集群,如何进行分布式推理大模型;边缘端的计算能力是否足够
  • 在实际部署时会遇到很多难点,比如:大模型的参数量和计算量非常巨大,那么如何在有限的资源中,加载和推理大模型?

大模型部署的痛点 

1. 计算量巨大

2. 内存开销巨大 

以16浮点数为例,每个参数占用2个字节。那么20B模型,加载参数40G+ 显存,10.3G缓存,加起来就要至少50.3G 显存。

3.访存瓶颈与动态请求 

目前常用的模型部署方法(三类)

目的:减少模型的冗余参数

1. 模型剪枝

2. 知识蒸馏

3. 量化(核心:把浮点数转换为整数 or 其他离散形式)

模型参数存储一般是以32位浮点数进行存储的,一个参数占用4个字节。存在一些冗余的情况,在满足回答的情况下,可以将浮点数转换为定点数(比如:8位,4位 or平均1位的整数)。

  • 优点:模型量化可以提升efficiency,提升速度!(大模型,访存密集型,访存远大于计算的瓶颈,通过量化可以把访存量降低, 可以显著降低数据传输所用的时间)


动手实践

完成以下任务,并将实现过程记录截图:

  • 配置 LMDeploy 运行环境

# 配置 LMDeploy 运行环境
studio-conda -t lmdeploy -o pytorch-2.1.2

# 激活刚刚创建的虚拟环境,并安装0.3.0版本的lmdeploy
conda activate lmdeploy
pip install lmdeploy[all]==0.3.0
在10% A100开发机上,配置lmdeploy环境

 注: Huggingface与TurboMind大致介绍(截图来自课程文档,详细可以看页首的课程文档link!)

  • 以命令行方式与 InternLM2-Chat-1.8B 模型对话

对话截图

 注:这里对比一下和传统的使用Transformer库运行的区别

  • Transformer库是Huggingface社区推出的用于运行HF模型的官方库。

对比一下使用Transformer来直接运行InternLM2-Chat-1.8B模型,以及LMDeploy的使用感受,速度明显比原生Transformer快!


LMDeploy模型量化


模型量化-1.设置最大KV Cache缓存大小

 上述运行chat的时候,占用显存为如下图:

可以通过上图的显存占用情况发现,占显存还是比较多的,那么能否进行显存占用呢? 

# 尝试这个命令,设成0.01,约等于禁用KV Cache占用显存
lmdeploy chat /root/internlm2-chat-1_8b --cache-max-entry-count 0.01

 运行完这个命令之后显存占用,从原来7856M到4552M,有降低!


模型量化-2. 使用W4A16量化

只用输入下面这个命令就可以完成量化:

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

参数注释:

  • lite auto_awq:使用自动awq算法
  • 采用‘ptb’数据集
  • 采样128个数据对
  • 量化上下文长度:1024
  • 量化工作结束后,新的HF模型被保存到internlm2-chat-1_8b-4bit目录( --work-dir /root/internlm2-chat-1_8b-4bit)

 运行完上面量化命令后,得到量化后的model,可以进行测试:

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

此时的显存占用:

显存此时只占用2436M,也有很大降低

参考内容

1. 这个笔记内容非常详尽,可以参考👍🏻[InternLM2]LMDeploy 量化部署 LLM&VLM 实践【书生·浦语大模型实战营第二期第五节笔记和作业】 - 知乎 (zhihu.com)

2. 关于模型量化之AWQ,下面这两个博客都不错:

AWQ模型量化实践-CSDN博客

大模型量化之 AWQ 方法 - 知乎

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以给你提供一些 VLM (Visual Light Communication) 和 LLM (Low Level Message) 的代码示例。以下是一个简单的VLM代码示例: ```python import time import RPi.GPIO as GPIO # 设置GPIO引脚 LED_PIN = 18 # 初始化GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(LED_PIN, GPIO.OUT) def transmit_message(message): for char in message: # 将字符转换为二进制 binary = bin(ord(char))[2:].zfill(8) # 发送二进制信号 for bit in binary: if bit == '1': GPIO.output(LED_PIN, GPIO.HIGH) else: GPIO.output(LED_PIN, GPIO.LOW) # 控制发送速度(根据实际情况调整) time.sleep(0.1) # 两个字符之间的间隔时间(根据实际情况调整) time.sleep(0.5) # 发送消息 transmit_message("Hello, World!") # 清理GPIO资源 GPIO.cleanup() ``` 这个示例使用树莓派的GPIO引脚来模拟光通信,通过控制LED的亮灭来传输二进制信号。 以下是一个简单的LLM代码示例,这里假设你是在C语言环境下进行开发: ```c #include <stdio.h> #include <string.h> // 定义消息缓冲区大小 #define BUFFER_SIZE 100 void process_message(char* message) { // 在这里实现对消息的处理逻辑 printf("Received message: %s\n", message); } int main() { char buffer[BUFFER_SIZE]; // 模拟接收消息 printf("Enter a message: "); fgets(buffer, BUFFER_SIZE, stdin); // 去除换行符 buffer[strcspn(buffer, "\n")] = '\0'; // 处理消息 process_message(buffer); return 0; } ``` 这个示例是一个简单的命令行程序,通过用户输入来模拟接收消息,并在控制台上输出收到的消息。 希望这些示例能对你有所帮助!如果你有任何其他问题,可以继续问我。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值