【 书生·浦语大模型实战营】学习笔记(五):LMDeploy 量化部署

在这里插入图片描述

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求职相关(简历撰写技巧、面经资料与心得)多方面综合学习平台,强烈推荐AI小白及AI 1;;爱好者学习,性价比非常高!加入星球➡️点击链接

【 书生·浦语大模型实战营】学习笔记(五):LMDeploy 量化部署

👨‍💻导读: 本篇笔记内容主要分为模型部署理论进行介绍。从量化、剪枝、知识蒸馏方面引入。主要对LMDeploy框架支持的模型、安装过程、base | chat对话 | Lite量化等进行介绍,欢迎大家交流学习!

本次学习资料

1.【视频】:LMDeploy 量化部署 LLM

2.【文档】:https://github.com/InternLM/Tutorial/blob/camp2/lmdeploy/README.md

3.【作业】:https://github.com/InternLM/Tutorial

基础作业

  • 配置 LMDeploy 运行环境
  • 以命令行方式与 InternLM2-Chat-1.8B 模型对话

4.【环境】开发机:InternStudio 在这里插入图片描述

模型部署定义

在这里插入图片描述

模型部署挑战

在这里插入图片描述

模型剪枝:

在这里插入图片描述

量化:

在这里插入图片描述

知识蒸馏:

在这里插入图片描述

LMDeploy

LMDeploy 由 MMDeploy 和 MMRazor 团队联合开发,是涵盖了 LLM 任务的全套轻量化、部署和服务解决方案。 这个强大的工具箱提供以下核心功能:

核心功能:

在这里插入图片描述

高效推理引擎 TurboMind:基于 FasterTransformer,我们实现了高效推理引擎 TurboMind,支持 InternLM、LLaMA、vicuna等模型在 NVIDIA GPU 上的推理。

交互推理方式:通过缓存多轮对话过程中 attention 的 k/v,记住对话历史,从而避免重复处理历史会话。

多 GPU 部署和量化:我们提供了全面的模型部署和量化支持,已在不同规模上完成验证。

LMDeploy 支持的大模型:

在这里插入图片描述

LMDeploy模型对话(chat)

1.HuggingFace

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

2.TurboMind

TurboMind是LMDeploy团队开发的一款关于LLM推理的高效推理引擎,它的主要功能包括:

LLaMa 结构模型的支持,
continuous batch 推理模式
可扩展的 KV 缓存管理器。

1.LMDeploy环境部署

InternStudio开发机创建conda环境

studio-conda -t lmdeploy -o pytorch-2.1.2

在这里插入图片描述

激活环境并安装lmdeploy

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

2.LMDeploy模型对话(chat)

2.2 下载模型

开发机的共享目录中常用的预训练模型,运行如下命令查看:

ls /root/share/new_models/Shanghai_AI_Laboratory/

执行指令由开发机的共享目录软链接拷贝模型:

ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/
# cp -r /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/

2.3 使用Transformer库运行模型

用Transformer来直接运行InternLM2-Chat-1.8B模型,终端中输入如下指令,新建pipeline_transformer.py

touch /root/pipeline_transformer.py

将以下内容复制粘贴进入pipeline_transformer.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()

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)

运行代码:

python /root/pipeline_transformer.py

在这里插入图片描述

2.4 使用LMDeploy与模型对话

使用LMDeploy与模型进行对话的通用命令格式为:

lmdeploy chat [HF格式模型路径/TurboMind格式模型路径]

chat-1_8b为例:

lmdeploy chat /root/internlm2-chat-1_8b

参数展示:

在这里插入图片描述
效果展示:

在这里插入图片描述

在这里插入图片描述

注:有关LMDeploy的chat功能的更多参数可通过-h命令查看。

3.LMDeploy模型量化(lite)

量化:主要包括 KV8量化和W4A16量化。总的来说,量化是一种以参数或计算中间结果精度下降换空间节省(以及同时带来的性能提升)的策略。

  • 计算密集(compute-bound): 指推理过程中,绝大部分时间消耗在数值计算上;针对计算密集型场景,可以通过使用更快的硬件计算单元来提升计算速。
  • 访存密集(memory-bound): 指推理过程中,绝大部分时间消耗在数据读取上;针对访存密集型场景,一般通过减少访存次数、提高计算访存比或降低访存量来优化。

使用KV8量化W4A16量化来优化 LLM 模型推理中的访存密集问题:

  1. KV8量化是指将逐 Token(Decoding)生成过程中的上下文 K 和 V 中间结果进行 INT8 量化(计算时再反量化),以降低生成过程中的显存占用。

  2. W4A16 量化,将 FP16 的模型权重量化为 INT4,Kernel 计算时,访存量直接降为 FP16 模型的 1/4,大幅降低了访存成本。Weight Only 是指仅量化权重,数值计算依然采用 FP16(需要将 INT4 权重反量化)。

3.1 设置最大KV Cache缓存大小

KV Cache是一种缓存技术,通过存储键值对的形式来复用计算结果,以达到提高性能和降低内存消耗的目的。当显存空间不足时,也可以将KV Cache放在内存,通过缓存管理器控制将当前需要使用的数据放入显存。

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

调整--cache-max-entry-count参数的效果。首先保持不加该参数(默认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

在这里插入图片描述

与模型对话,再次查看右上角资源监视器中的显存占用情况。

看到显存占用明显降低。

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目录。

使用Chat功能运行W4A16量化后的模型:

lmdeploy chat /root/internlm2-chat-1_8b-4bit --model-format awq

将KV Cache比例再次调为0.01,查看显存占用情况,显存占用明显降低。

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

总结

本篇笔记内容主要分为模型部署理论进行介绍。从量化、剪枝、知识蒸馏方面引入。主要对LMDeploy框架支持的模型、安装过程、base|chat对话|Lite量化等进行介绍,欢迎大家交流学习!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/564405.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】特征筛选:提升模型性能的关键步骤

一、引言 在机器学习领域,特征筛选是一个至关重要的预处理步骤。随着数据集的日益庞大和复杂,特征的数量往往也随之激增。然而,并非所有的特征都对模型的性能提升有所贡献,有些特征甚至可能是冗余的、噪声较大的或者与目标变量无关…

2024/4/22(分布式服务事务,CAP,BASE理论,Seata,微服务集成Seata,XA,AT,TCC.Saga,TC高可用,异地容灾)

配置内容如下:properties # 数据存储方式,db代表数据库 store.modedb store.db.datasourcedruid store.db.dbTypemysql store.db.driverClassNamecom.mysql.jdbc.Driver store.db.urljdbc:mysql://127.0.0.1:3306/seata?useUnicodetrue&rewriteBatc…

鸿蒙TypeScript学习21天:【声明文件】

TypeScript 作为 JavaScript 的超集,在开发过程中不可避免要引用其他第三方的 JavaScript 的库。虽然通过直接引用可以调用库的类和方法,但是却无法使用TypeScript 诸如类型检查等特性功能。为了解决这个问题,需要将这些库里的函数和方法体去…

Python多线程与多进程编程

一、引言 随着计算机技术的飞速发展,程序运行的速度和效率成为了人们关注的焦点。为了提高程序的执行效率,多线程与多进程编程技术应运而生。Python作为一种通用编程语言,在支持多线程与多进程编程方面有着独特的优势。本文将详细探讨Python…

截断堆积柱状图

本教程原文链接:截断堆积柱状图绘制教程 欢迎大家转载!!!! 本期教程 写在前面 堆积柱状图是柱状图的常见类型之一,也是平时使用概率较高的图形之一。我们前期发布了很多个柱状图的绘制教程,若你…

DBUnit增强:填充随机数据和相对时间数据

痛点 测试环境验证时,遇到与当前相对时间相关的测试吗?准备一份SQL?隔一段时间就不能用了。每过一段时间去更新脚本或重置系统时间?看上去也不是很合适的解决方案。依赖数据测试时要重新做,演示时候得全部改&#xff…

用两种方式遍历Map集合

创建学生类对象 public class Student {private String name;public int age ;public Student() {}public Student(String name, int age) {this.name name;this.age age;}public String getName() {return name;}public void setName(String name) {this.name name;}publi…

LINUX核心配置文件md5监控

一、md5sum简介 md5sum 用于计算和校验文件的MD5值。 md5sum 常常被用来验证网络文件传输的完整性,防止文件被人篡改。在日常工作当中,我们可以用来判断系统中的重要文件是否被篡改。传文件给别人时确认是否一致。我们也还可使用 md5sum 生成文件或用户…

学习笔记:Vue2中级篇

Vue2 学习笔记:Vue2基础篇_ljtxy.love的博客-CSDN博客学习笔记:Vue2中级篇_ljtxy.love的博客-CSDN博客学习笔记:Vue2高级篇_ljtxy.love的博客-CSDN博客 Vue3 学习笔记:Vue3_ljtxy.love的博客)-CSDN博客 文章目录 5.…

电脑监控软件员工会不会发现

电脑监控软件员工会不会发现 企业在安装电脑监控软件的时候都会问一个问题:会不会被员工发现?基本上是不会被发现的,因为监控软件都有隐藏功能,比如这款安企神。(点击免费试用) 它在终端安装的时候为静默安…

澳福一篇文章盘点持仓交易

什么是持仓交易,有什么优缺点,收益率是多少?今天澳福外汇一篇文章讲清楚。 持仓交易是长期策略。它基于波浪理论,根据该理论,市场以周期性方式发展:任何增长都伴随着衰退。交易者建立长期头寸,从价格上涨或…

【继承】复杂的菱形继承

博主首页: 有趣的中国人 专栏首页: C进阶 本篇文章主要讲解 菱形继承 的相关内容 目录 1. 继承与友元 2. 继承与静态成员 3. 复杂的菱形继承及菱形虚拟继承 3.1 继承分类 3.2 菱形继承导致的问题 3.3 虚拟继承解决数据冗余的原理 4. 继承和组…

揭秘链动3+1商业模式:打造未来商业新风潮

大家好,我是微三云周丽,今天给大家分析当下市场比较火爆的商业模式! 小编今天跟大伙们分享什么是链动31模式? 在当今商业世界中,随着科技的飞速发展和消费者需求的不断升级,新的商业模式不断涌现。其中&a…

CAPL编程基础

1.程序结构 1.includes{} //头文件 2.variables{} //全局变量声明 3. on preStart{} //初始化 on start{} //工程运行 on preStop{} //工程预停止 on stopMeasurement{} //工程停止 4.int myFunction{} //自定义函数 2.事件 1.键盘事件 on key ‘a’ 2.报…

【漏洞复现】Linksys RE7000无线扩展器 命令注入漏洞(CVE-2024-25852)

0x01 产品简介 Linksys RE7000无线扩展器是一款功能强大、操作便捷的产品,旨在为用户提供无缝的网络覆盖和更快速、更稳定的网络连接体验。 0x02 漏洞概述 Linksys RE7000无线扩展器存在命令注入漏洞,未授权的攻击者可以通过该漏洞执行任意命令,控制服务器。 0x03 测绘语…

《论文阅读》对话推理的对比学习 EMNLP 2023

《论文阅读》对话推理的对比学习 前言名词简介CICERO 数据集方法损失函数实验结果前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天为大家带来的是《Contrastive Learning for Inference in Dialogue》 出版:EMNLP 时…

智能家居—ESP32开发环境搭建

相关文章 毕业设计——基于ESP32的智能家居系统(语音识别、APP控制) 智能家居—ESP32开发环境搭建 一、下载安装二、验证三、资料获取 一、下载安装 下载安装 vscode 安装插件 创建工程 二、验证 写一个简单的函数来验证一下功能 void setup() {// put your setup c…

8-云原生监控体系-PromQL-函数

Prometheus支持几个函数来操作数据。 文章目录 1. 函数语法解释2. count(v instant-vector)3. topk(n, v instant-vector)4. bottomk(n, v instant-vector)5. increase(v range-vector)6. rate(v range-vector)7. rate 和 increase8. irate(v range-vector)9. predict_linear(…

【Qt常用控件】—— 按钮类控件

目录 1.1 Push Button 1.2 Radio Buttion 1.3 Check Box 1.4 Tool Button 1.5 小结 1.1 Push Button 使⽤ QPushButton 表⽰⼀个按钮. 这也是当前我们最熟悉的⼀个控件了. QPushButton 继承⾃ QAbstractButton . 这个类是⼀个抽象类. 是其他按钮的⽗类. 在 Qt Desi…

项目体检(Health Check)升级上线

在快节奏的现代商业环境中,项目的健康与否直接关系到其最终的成功与否。为了满足这一需求,我们精心打造了项目体检工具(Health Check)。它不仅仅是一个工具,更是一种对项目健康状况的全面把控和智能诊断。 项目体检工具…