LMDeploy 量化部署

在这里插入图片描述

LMDeploy简介

LMDeploy是一个由MMDeploy和MMRazor团队联合开发的工具包,旨在为大型语言模型(LLM)提供全套的轻量化、部署和服务解决方案。以下是对LMDeploy的简介,采用分点表示和归纳的方式:

  1. 核心功能

    • 高效推理引擎TurboMind:基于FasterTransformer,实现了高效推理引擎TurboMind,支持InternLM、LLaMA、vicuna等模型在NVIDIA GPU上的推理。TurboMind开发了一系列关键特性,如持久批处理、阻塞KV缓存、动态拆分融合、张量并行和高性能CUDA内核,确保LLM推理的高吞吐和低延迟。
    • 交互式推理模式:通过在多轮对话过程中缓存注意力的k/v,引擎能够记住对话历史,避免历史会话的重复处理。
    • 量化支持:LMDeploy支持多种量化方法和量化模型的高效推理,通过降低显存占用和提升推理速度来优化模型性能。其量化方法包括线性量化和聚类量化,以及定点化模型输出。
  2. 技术特点

    • 量化优化:LMDeploy使用AWQ算法实现模型的4bit权重量化,并且TurboMind推理引擎提供了非常高效的4bit推理cuda kernel,性能是FP16的2.4倍以上。
    • KV Cache量化:LMDeploy支持通过API Server方式启动,允许用户调整KV Cache的占用比例,以及使用命令行客户端与Gradio网页客户端与模型进行交互。
    • 多模态支持:LMDeploy还正式支持多模态(视觉)模型推理和服务,扩展了其应用范围。
  3. 环境搭建与基础配置

    • 环境推荐:使用torch1.11.0, ubuntu20.04, python版本为3.8, cuda版本为11.3, 使用v100来进行实验。
    • 虚拟环境创建与激活:使用conda创建和激活虚拟环境,以隔离不同项目的依赖。
    • 包导入:根据需要导入所需的Python包,并考虑使用镜像源以提高下载速度。
  4. 部署流程

    • 模型转换:支持在线转换和本地命令行转换。
    • TurboMind推理:支持命令行本地对话和API服务。
    • 网页Demo演示:提供网页形式的模型演示功能。

LMDeploy是一个功能强大的工具包,通过提供高效推理引擎、交互式推理模式和多种量化支持,为大型语言模型的轻量化、部署和服务提供了全面的解决方案。

代码实践部分

import lmdeploy
from modelscope.hub.snapshot_download import snapshot_download
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
# save_dir是模型保存到本地的目录
save_dir="/root/LLM//model"# 1.下载internlm2-chat-1_8b
snapshot_download("Shanghai_AI_Laboratory/internlm2-chat-1_8b", cache_dir=save_dir, revision='v1.1.0')#pipe = lmdeploy.pipeline("/root/LLM/model/Shanghai_AI_Laboratory/internlm2-chat-1_8b")
#response = pipe(["Hi, pls intro yourself", "Shanghai is"])
#print(response)tokenizer = AutoTokenizer.from_pretrained("/root/LLM//model/Shanghai_AI_Laboratory/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/LLM//model/Shanghai_AI_Laboratory/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)

在这里插入图片描述

使用LMDeploy运行模型

在使用 LMDeploy 与模型进行对话时,通常需要一个可以执行自然语言处理任务的模型。以下是使用 LMDeploy 运行模型并与之进行对话的通用命令格式:

lmdeploy -m MODEL_NAME -q QUERY

这里:

  • MODEL_NAME 是你的模型的名称。
  • QUERY 是你想让模型回答的问题或执行的自然语言处理任务。
    例如,如果你有一个名为 my_model 的模型,你可以这样使用它:
lmdeploy -m my_model -q "你好,今天天气怎么样?"

LMDeploy 会处理你的查询,并返回模型的响应。请注意,LMDeploy 是一个假设的工具,如果你在寻找一个实际的工具,可能需要查找一个与你的具体需求和环境相匹配的工具。

session 1double enter to end input >>> 你好<|im_start|>system
You are an AI assistant whose name is InternLM (书生·浦语).
- InternLM (书生·浦语) is a conversational language model that is developed by Shanghai AI Laboratory (上海人工智能实验室). It is designed to be helpful, honest, and harmless.
- InternLM (书生·浦语) can understand and communicate fluently in the language chosen by the user such as English and 中文.
<|im_end|>
<|im_start|>user
你好<|im_end|>
<|im_start|>assistant2024-06-13 13:40:36,813 - lmdeploy - WARNING - kwargs ignore_eos is deprecated for inference, use GenerationConfig instead.
2024-06-13 13:40:36,814 - lmdeploy - WARNING - kwargs random_seed is deprecated for inference, use GenerationConfig instead.
你好,有什么我可以帮忙的吗?

LMDeploy 模型量化方案概述

在深入探讨LMDeploy的量化方案之前,我们先来理解两个核心概念:计算密集型和访存密集型。计算密集型场景意味着推理过程中,数值计算占据了大部分时间;而访存密集型则是指数据读取占据了推理的主要时间。对于LLM(大型语言模型)这类Decoder Only架构的模型,其推理过程往往表现为访存密集型,因此,如何有效减少访存占用的显存空间,对提升GPU计算效率至关重要。

量化的目的

量化技术的主要目标是减小数据交换(即访存)所占用的显存空间。具体来说,它有两种常见的方法:

  1. KV8量化:在解码(Decoding)过程中,对上下文K和V的中间结果进行INT8量化,并在需要计算时再进行反量化。这种方法能够显著降低显存的占用,提高显存的利用率。

  2. W4A16量化:该方法将FP16(16位浮点数)的模型权重量化为INT4(4位整数)。在Kernel计算时,由于访存的数据量减少到FP16模型的1/4,从而大幅降低了访存成本。值得注意的是,这种量化方式仅针对权重进行,数值计算时依然采用FP16(通过反量化INT4权重实现)。

实践操作

接下来,我们将针对这两种量化方式,介绍一些实践操作建议:

  1. 设置最大KV Cache缓存大小

KV Cache是一种高效的缓存技术,通过存储键值对的形式复用计算结果,以减少重复计算,并降低内存消耗。在LMDeploy中,你可以通过--cache-max-entry-count参数来设置KV Cache占用剩余显存的最大比例。默认值为0.8,意味着KV Cache将占用最多80%的剩余显存。

然而,调整KV Cache的大小需要在访存速度和显存占用之间进行权衡。虽然减小KV Cache的占比可以释放更多显存供模型计算使用,但也可能导致访存速度降低,进而影响推理速度。因此,在实际应用中,需要根据具体情况调整该参数,找到访存速度与显存占用之间的最佳平衡点。

#通过--cache-max-entry-count参数的大小控制KV缓存占用剩余显存的最大比例,默认为0.8
lmdeploy chat /root/LLM//model/Shanghai_AI_Laboratory/internlm2-chat-1_8b --cache-max-entry-count 0.5
  1. 设置W4A16量化
    当使用LMDeploy进行W4A16量化时,您需要确保正确配置了量化参数。以下是修改后的命令,用于执行W4A16量化并将结果保存到指定路径:
# 使用W4A16量化
lmdeploy lite auto_awq \/root/LLM//model/Shanghai_AI_Laboratory/internlm2-chat-1_8b \ # 需要量化的模型的路径--calib-dataset 'ptb' \--calib-samples 128 \--calib-seqlen 1024 \--w-bits 4 \ # 指定权重使用 4 位--a-bits 16 \ # 通常不需要显式指定激活的位数,但如果是W4A16,这里可以显式指出激活是16位(如果LMDeploy支持)--w-group-size 128 \ # 指定权重分组的大小--work-dir /root/LLM//model/Shanghai_AI_Laboratory/internlm2-chat-1_8b-4bit \ # 权重量化为4bit后的模型保存路径--output-model-path /root/LLM//model/Shanghai_AI_Laboratory/internlm2-chat-1_8b-4bit/quantized_model.pt \ # (可选)指定输出量化模型的精确路径

请注意以下几点:

  1. lmdeploy lite auto_awq:这是一个命令行工具,用于部署和自动调整权重量化(Automatic Weight Quantization)的机器学习模型。

  2. /root/model/internlm2-chat-1_8b:这是模型文件的路径。其中,/root/model/ 是目录路径,internlm2-chat-1_8b 是模型名称,1_8b 可能代表该模型具有约1.8亿参数。

  3. –calib-dataset ‘ptb’:指定了用于校准量化模型的数据集。'ptb' 通常指的是Penn TreeBank数据集,这是一个常用的自然语言处理数据集。

  4. –calib-samples 128:定义了从校准数据集中使用的样本数量。这里使用了128个样本进行校准。

  5. –calib-seqlen 1024:指定了在校准时序列的长度,这里被设置为1024个单元。这对于文本或序列生成任务来说是一个常见的设置。

  6. –w-bits 4:定义了权重量化的位宽。这里的4表示模型权重将被量化为4位,从而减少模型大小并提高运算速度,但可能会损失一些精度。

  7. –w-group-size 128:指定了权重分组的大小,用于量化。这里每组包含128个权重。分组量化是一种常用的量化技术,可以提高量化后的模型性能。

  8. –work-dir /root/LLM/internlm2-chat-1_8b-4bit:指定了工作目录,即量化后的模型和相关文件将被保存的位置。这里,/root/LLM/internlm2-chat-1_8b-4bit 表示保存4位量化后模型的工作目录。

未完待续

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion: ControlNet 插件安装

前面介绍了一些通过代码实现ControlNet进行控制的案例。现在通过Stable Diffusion体验一下更便捷的操作。 Stable Diffusion插件安装办法大致相同。启动Stable Diffusion后&#xff0c;点击最右边的“扩展”&#xff0c;点击“可下载”&#xff0c;点击“加载扩展列表”。 视网…

正大国际期货:小小的钱如何在期货市场翻身?

小小的钱 &#xff0c;莫名喜感→在小小的花园里面哇呀哇呀挖 有可能性&#xff0c;因为有杠杆所以收益大&#xff0c;同时风险亏损起来也快&#xff0c;&#xff0c;所以必须用小亏损换大收益&#xff0c;&#xff0c;比如跌过这个位置就止损退出&#xff08;永远在低点附近买…

【递归、搜索与回溯】综合练习一

综合练习一 1.找出所有子集的异或总和再求和2.全排列 II3.电话号码的字母组合4.括号生成 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.找…

OpenStack是什么?

OpenStack是一个开源的云计算管理平台项目&#xff0c;它是一系列软件开源项目的组合。该项目由美国国家航空航天局&#xff08;NASA&#xff09;和Rackspace合作研发并发起&#xff0c;旨在提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack不仅是一个软…

【stable diffusion】ComfyUI扩展安装以及”127.0.0.1拒绝了我们的连接请求“解决记录

扩展安装 虽然大家都推荐将扩展包直接放到extension文件夹的方式&#xff0c;但我还是推荐直接在sd webui的扩展处下载&#xff0c;酱紫比较好维护一点&#xff0c;我个人感觉。 按照上图顺序点击会出现”URLError: <urlopen error [Errno 11004] getaddrinfo failed>”…

2024 Java 异常—面试常见问题

目录 一、异常的分类 二、throw和throws都是异常处理的关键字&#xff0c;二者区别。 三、try-catch-finally 中&#xff0c;如果 catch 中 return 了&#xff0c;finally 还会执行吗&#xff1f; 四、try-catch-finally 中哪个部分可以省略&#xff1f; 五、常见的 Runti…

反悔贪心,LeetCode 2813. 子序列最大优雅度

一、题目 1、题目描述 给你一个长度为 n 的二维整数数组 items 和一个整数 k 。 items[i] [profiti, categoryi]&#xff0c;其中 profiti 和 categoryi 分别表示第 i 个项目的利润和类别。 现定义 items 的 子序列 的 优雅度 可以用 total_profit distinct_categories2 计算…

.pkl文件保存和读取

#save sim sim.save(G:/simulation.pkl) print()#read sim import pickle with open(G:/simulation.pkl, rb) as f:sim pickle.load(f)

BarTender软件下载附加详细安装教程

BarTender是美国海鸥科技推出的一款优秀的条码打印软件&#xff0c;应用于 WINDOWS95 、 98 、 NT 、 XP 、 2000 、 2003 和 3.1 版本&#xff0c; 产品支持广泛的条形码码制和条形码打印机&#xff0c; 不但支持条形码打印机而且支持激光打印机&#xff0c;还为世界知名品牌条…

C脚本实现用键盘按键控制Wincc某按钮动作

文章目录 前言一、创建Wincc画面并添加变量及按钮二、在“事件”-“键盘”下&#xff0c;编写“按下”和“释放”的C脚本 前言 在某些特定场景下&#xff0c;需要通过电脑键盘控制上位机界面上按钮按下或释放&#xff0c;本文给出了基于C脚本的解决方案。 一、创建Wincc画面并…

Python中Numpy的np.arange

np.arange 是用于创建等差整数序列的函数。其语法如下&#xff1a; np.arange(start, stop, step, dtypeNone) start&#xff1a;序列的起始值&#xff0c;默认为0。 stop&#xff1a;序列的终止值&#xff0c;生成的数组不包括此值。 step&#xff1a;序列中的值之间的步长&a…

Tailwind CSS 响应式设计实战指南

title: Tailwind CSS 响应式设计实战指南 date: 2024/6/13 updated: 2024/6/13 author: cmdragon excerpt: 这篇文章介绍了如何运用Tailwind CSS框架创建响应式网页设计&#xff0c;涵盖博客、电商网站及企业官网的布局实例&#xff0c;包括头部导航、内容区域、侧边栏、页脚…

从零开始手把手Vue3+TypeScript+ElementPlus管理后台项目实战十一(整体布局04之Header及用户注销)

新增Hearder 新增 src/layout/components/PageHeader.vue <template><div class"header-cont"><div><h1><router-link to"/">RealWorld</router-link></h1></div><div><template v-if"is…

北斗三号短报文终端户外应急通信解决方案

北斗三号短报文终端户外应急通信解决方案主要基于我国自主研发的北斗三号全球卫星导航系统&#xff08;BDS-3&#xff09;&#xff0c;为户外应急场景提供高效、稳定的通信服务。以下是对该解决方案的详细阐述&#xff1a; 一、方案概述 北斗三号短报文终端户外应急通信解决方…

MapperStruct拷贝数据的介绍和使用

1、前言 在java 编程中&#xff0c;对象直接拷贝是很常用的方法&#xff0c;最初我们常用spring提供的拷贝工具BeanUtils的copyProperties方法完成对象之间属性的拷贝。但是它有几个明显的如下缺点 1、属性类型不一致导致摸一个属性值拷贝失败 2、通一个字段使用基本类型和包…

【html5的video标签在移动端的使用】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、使用步骤1. html部分2.js部分三、video相关文章推荐 前言 在移动端的首页用视频做背景动画&#xff0c;让动画循环&#xff0c;自动播放&#xff0c;静音。…

数据结构之链表的经典笔试题

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 目录 203. 移除链表元素 206. 反转链表 876. 链表的中间节点 面试题 02.02. 返回倒数第k个节点 …

Spring Boot整合Knife4j-3.0.3

文章目录 Spring Boot整合Knife4j-3.0.31. 引言2. 快捷的解决方案2.1 修改knife4j的依赖2.2 application.yml增加配置3.3 SwaggerConfig配置如下 Spring Boot整合Knife4j-3.0.3 1. 引言 前面我写过一篇关于整合knife4j的文档 Spring Boot整合Knife4j-2.0.7 最近我引入redissi…

【AI】文心一言的使用分享

在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的飞速发展正在改变我们的生活。文心一言&#xff0c;作为这一浪潮中的佼佼者&#xff0c;以其卓越的自然语言处理能力和广泛的应用场景&#xff0c;给我带来了前所未有的使用体验。在这篇分享中&#xff0c;我…

Spring Cloud Bus 消息总线基础入门与实践总结

【1】基础介绍 其主要是实现分布式自动刷新配置功能&#xff0c;Spring Cloud Bus 配合 Spring Cloud Config 使用可以实现配置的动态刷新。Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架&#xff0c;它整合了Java的事件处理机制和消息中间件的功能…