[InternLM训练营第二期笔记]5. LMDeploy 量化部署 LLM 实践


该系列是上海AI Lab举行的书生 浦语大模型训练营的相关笔记部分。
该笔记是第五节课,学习大语言模型量化的基本概念,以及利用LMDeploy工具进行微调。


0. 模型部署的概念

0.0 背景

如果要将大模型在特定平台(大到服务器集群,小到端侧设备比如说手机等),都需要经过部署步骤。然而,LLM的模型计算量是非常大的,具体如下图:

在这里插入图片描述

对于LLM的推理过程,计算量大概是2倍的参数量,加2倍的模型层数 * 上下文长度 * 注意力维度,单位为FLOPs

C f o r w a r d = 2 N + 2 n l a y e r n c o n t e x t n a t t n d i m C_{forward} = 2N + 2 n_{layer} n_{context} n_{attn dim} Cforward=2N+2nlayerncontextnattndim

此外,不仅推理时的计算量大,而且存储模型参数本身的开销也很大:

在这里插入图片描述

此外,在GPU的推理过程中,访存速度远小于计算速度,因此存在访存性能瓶颈。也就是说,由于Transformer的参数量比较大,因此它是只能保存在GPU周围的显存中,而不是速度较快的缓存中,而从显存中访问的速度又远小于计算速度。

在这里插入图片描述

因此,针对以上三个难点,我们就必须用一定的部署手段,来减少计算量或占用资源量。目前主要有三种流派:

0.1 剪枝

剪枝是一个很成熟的技术,就是在于将模型中不重要的参数去掉:

在这里插入图片描述

0.2 蒸馏

在这里插入图片描述
蒸馏就是用一个教师模型去指导学生模型的训练,通常学生模型是小参数模型。

0.3 量化

在这里插入图片描述
量化就是将模型参数转换为特定位数的整数,例如原来是32位的fp32,可以量化成8位int。

那么量化为什么可以降低计算量呢?一种错误的观点是,认为量化后是int型,计算机计算int型所需要的时钟周期更少。然而,我们只是按照int型存储模型,在计算的时候,我们仍然需要将其反量化恢复成float。

量化的主要意义是,可以降低访存量,让访存量和计算量更加平衡。也就是降低了数据传输的时间,对访存量的需求。

1. 实战:配置LMDeploy和chat 1.8B模型对话(基础作业)

LMDeploy的核心功能如下:

在这里插入图片描述
首先还是创建开发机,GPU选择10% * A100. 注意选择CUDA12.2的版本。

随后创建环境:

studio-conda -t lmdeploy -o pytorch-2.1.2

安装LMDeploy:

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

然后我们创建本次实验的目录,并创建预训练模型的软链接

cd ~
mkdir lmdeploy

ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/lmdeploy

随后,我们用Huggingface社区中推出的Transformer库运行一下chat1.8B模型,然后感受一下推理速度。

我们首先创建文件

cd ~/lmdeploy

vim pipeline_transformer.py

然后插入以下内容:

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("/root/lmdeploy/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/lmdeploy/internlm2-chat-1_8b", torch_dtype=torch.float16, trust_remote_code=True).cuda()  
# 以fp16加载模型
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)



然后运行

conda activate lmdeploy

python /root/lmdeploy/pipeline_transformer.py

运行结果如下:

在这里插入图片描述
时间应该在大概5s左右

之后,我们再用LMDeploy进行对话:

lmdeploy chat /root/lmdeploy/internlm2-chat-1_8b

在这里插入图片描述
这个生成速度是秒生成,可以说是快多了

2. 实战:W4A16量化(进阶作业)

2.1 什么是KV cache

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

模型在运行时,占用的显存可大致分为三部分:模型参数本身占用的显存、KV Cache占用的显存,以及中间运算结果占用的显存。

2.2 实践

直接运行

pip install einops==0.7.0

lmdeploy lite auto_awq \
   /root/lmdeploy/internlm2-chat-1_8b \
  --calib-dataset 'ptb' \
  --calib-samples 128 \
  --calib-seqlen 1024 \
  --w-bits 4 \
  --w-group-size 128 \
  --work-dir /root/lmdeploy/internlm2-chat-1_8b-4bit

可以看到,新的模型被保存了:

在这里插入图片描述

随后,我们将KV Cache最大占用比例为0.4,运行:

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

在这里插入图片描述
对于同样的问题,回答速度非常快,此时显存占用为4.9G

在这里插入图片描述

2.3 API Server部署

我们都是在本地直接推理大模型,这种方式成为本地部署。在生产环境下,我们有时会将大模型封装为API接口服务,供客户端访问。

在这里插入图片描述
运行

lmdeploy serve api_server -h

查看api server的用法。

在这里插入图片描述
因此和lmdeploy chat一样,更改kv缓存就直接增加--cache-max-entry-count命令。

我们启动API Server服务:注意,我们启动刚刚量化后的4bit模型,并且把模型格式改为awq, 把KV缓存占用比例改为0.4

lmdeploy serve api_server \
    /root/lmdeploy/internlm2-chat-1_8b-4bit \
    --model-format awq \
    --quant-policy 0 \
    --server-name 0.0.0.0 \
    --server-port 23333 \
    --tp 1 \
    --cache-max-entry-count 0.4 

出现以下界面后,说明server启动成功。
在这里插入图片描述

然后新建terminal,运行

conda activate lmdeploy
lmdeploy serve api_client http://localhost:23333

运行结果:
在这里插入图片描述

可以看到运行结果和直接命令行运行是一样的,期间显存占用4.9G

在这里插入图片描述

2.4 Gradio前端部署

接下来用Gradio网页端进行部署

运行

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

然后在Windows的powershell中运行:

ssh -CNg -L 6006:127.0.0.1:6006 root@ssh.intern-ai.org.cn -p 45344

运行结果:

在这里插入图片描述

2.5 Python代码集成

Python代码集成就是将大模型的推理部分集成到某些代码里面

这部分主要是借助于lmdeploy中的pipeline包完成的。

运行以下命令:

cd ~/lmdeploy
conda activate lmdeploy

vim pipeline.py

复制以下内容:其中注意,要将KV cache比例调成0.4

from lmdeploy import pipeline

pipe = pipeline('/root/lmdeploy/internlm2-chat-1_8b-4bit', cache_max_entry_count=0.4)
response = pipe(['Hi, pls intro yourself', '上海是'])
print(response)

随后运行

python pipeline.py

结果:

在这里插入图片描述

3. 实战:使用LMDeploy运行多模态大模型Llava

注意将GPU调大一点,调成30% * A100. 首先安装依赖库:

conda activate lmdeploy
pip install git+https://github.com/haotian-liu/LLaVA.git@4e2277a060da264c4f21b364c867cc622c945874

随后新建文件

cd ~/lmdeploy

vim pipeline_llava.py

复制以下内容:

from lmdeploy.vl import load_image
from lmdeploy import pipeline, TurbomindEngineConfig


backend_config = TurbomindEngineConfig(session_len=8192) # 图片分辨率较高时请调高session_len
# pipe = pipeline('liuhaotian/llava-v1.6-vicuna-7b', backend_config=backend_config) 非开发机运行此命令
pipe = pipeline('/share/new_models/liuhaotian/llava-v1.6-vicuna-7b', backend_config=backend_config)

image = load_image('https://raw.githubusercontent.com/open-mmlab/mmdeploy/main/tests/data/tiger.jpeg')
response = pipe(('describe this image', image))
print(response)

运行结果:

python pipeline_llava.py

在这里插入图片描述

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

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

相关文章

需求 分析

需求分析的任务 需求分析的任务 1、需求分析是软件定义时期的最后一个阶段,它的基本任务是准确地回答“系统必须做什么?”这个问题。 2、确定系统必须完成哪些工作,也就是对目标系统提出完整、准确、清晰、具体的要求。 3、系统分析员应该写出软件需求…

Docker网络及CPU资源控制

一、实现原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容…

Gradio 最快创建Web 界面部署到服务器并演示机器学习模型,本文提供教学案例以及部署方法,避免使用繁琐的django

最近学习hugging face里面的物体检测模型,发现一个方便快捷的工具! Gradio 是通过友好的 Web 界面演示机器学习模型的最快方式,以便任何人都可以在任何地方使用它! 一、核心优势: 使用这个开发这种演示机器学习模型的…

【C++题解】1302. 是否适合晨练?

问题:1302. 是否适合晨练? 类型:分支 题目描述: 夏天到了,气温太高,小明的爷爷每天有晨练的习惯,但有时候温度不适合晨练;小明想编写一个程序,帮助爷爷判断温度是否适合…

5分钟——测试搭建的springboot接口(二)

5分钟——测试搭建的springboot接口(二) 1. 查看数据库字段2. 测试getAll接口3. 测试add接口4. 测试update接口5. 测试deleteById接口 1. 查看数据库字段 2. 测试getAll接口 3. 测试add接口 4. 测试update接口 5. 测试deleteById接口

计算机网络-IS-IS基础配置实验

前面我们了解了IS-IS的一些基础理论,从建立邻接、链路状态数据库同步以及路由计算,现在开始学习下配置操作。 一、IS-IS配置 网络拓扑图: 拓扑图 IS-IS有Level级别的区分,Level-1可以是性能较低的设备只维护区域内的LSDB&#xff…

论文辅助笔记:LLM-MOB代码解读

论文笔记 Where Would I Go Next? Large Language Models as Human Mobility Predictor-CSDN博客 1 主函数 1.1 导入库 import os import pickle import time import ast import logging from datetime import datetime import pandas as pd from openai import OpenAIclie…

Sqli-labs靶场第25关[Sqli-labs-less-25]自动化注入-SQLmap工具注入

过滤了AND OR 使用的函数是 preg_replace 特点:只对值进行一次检测闭合方式为 单引号 可以使用双写进行绕过 手工注入 ?id0 union select 1,database(),user() -- sqlmap自动化注入 sqlmap.py -u http://192.168.58.114:802/sqli-labs/Less-25/?id2 --batch -…

Aurora-64B/10B、XDMA与DDR结合设计高速数据流通路设计/Aurora光纤设计/XDMA读取DDR设计/基于FPGA的高速数据传输设计

因最近想通过FPGA把数据从光纤传到PC,借此机会和大家一起学习Aurora、XDMA结合DDR 制作不易,记得三连哦,给我动力,持续更新!!! 完整工程文件下载:XDMA读写DDR工程 提取码&…

[Algorithm][前缀和][和为K的子数组][和可被K整除的子数组][连续数组][矩阵区域和]详细讲解

目录 1.和为 K 的子数组1.题目链接2.算法原理详解3.代码实现 2.和可被 K 整除的子数组1.题目链接2.算法原理详解3.代码实现 3.连续数组1.题目链接2.算法原理详解3.代码实现 4.矩阵区域和1.题目链接2.算法原理详解3.代码实现 1.和为 K 的子数组 1.题目链接 和为 K 的子数组 2.…

网络安全攻击溯源的重要性及挑战

网络安全攻击溯源是一个复杂且至关重要的过程,它涉及对网络攻击事件的来源进行追踪和分析,以便确定攻击者的身份、动机和攻击路径。在IP技术背景下,网络安全攻击溯源更是显得尤为重要,因为IP地址作为网络设备的唯一标识&#xff0…

Kafka 3.x.x 入门到精通(02)——对标尚硅谷Kafka教程

Kafka 3.x.x 入门到精通(02)——对标尚硅谷Kafka教程 2. Kafka基础2.1 集群部署2.1.1 解压文件2.1.2 安装ZooKeeper2.1.3 安装Kafka2.1.4 封装启动脚本 2.2 集群启动2.2.1 相关概念2.2.1.1 代理:Broker2.2.1.2 控制器:Controller …

css中新型的边框设置属性border-inline

一、概念与背景 border-inline 是 CSS Logical Properties and Values 模块中的一个属性,用于控制元素在流内(inline)方向上的边框。该模块旨在提供与书写模式(writing mode)无关的布局和样式描述方式,使得…

【现代交换原理与通信网技术】期末突击

文章目录 自己老师画的重点1. 程控交换机结构2. 测试模拟电路的七项功能3.中继电路的六项功能4.数字用户电路和模拟用户电路比较5.路由规划的基本原则6.七路信令的结构7.随路信令和公共信道信令8.软交换9.无极网和分级网10.路由选择.流量控制的原则/方法11.电路交换&&分…

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域 Tomcat 配置允许跨域Web 项目配置允许跨域Tomcat 同时允许静态文件和 Web 服务跨域 偶尔遇到一个 Tomcat 部署项目跨域问题,因为已经处理过…

企业微信hook接口协议,ipad协议http,外部联系人图片视频文件下载

外部联系人文件下载 参数名必选类型说明file_id是StringCDNkeyopenim_cdn_authkey是String认证keyaes_key是Stringaes_keysize是int文件大小 请求示例 {"url": "https://imunion.weixin.qq.com/cgi-bin/mmae-bin/tpdownloadmedia?paramv1_e80c6c6c0cxxxx3544d9…

设计模式-状态模式在Java中的使用示例-信用卡业务系统

场景 在软件系统中,有些对象也像水一样具有多种状态,这些状态在某些情况下能够相互转换,而且对象在不同的状态下也将具有不同的行为。 为了更好地对这些具有多种状态的对象进行设计,我们可以使用一种被称之为状态模式的设计模式…

【Android】android 10 jar_sdk_library添加

前言 当前项目遇到客户,Android 10 平台,需要封装jar_sdk_library给第三方应用使用。其中jar_sdk_library中存在aidl文件。遇到无法编译通过问题。 解决 system/tools/aidl修改 Android.bp修改

vue中web端播放rtsp视频流(摄像头监控视频)(海康威视录像机)

一、ffmpeg安装​​​​​​ ffmpeg下载 https://ffmpeg.org/download.html找ffmpeg-release-essentials.zip点击下载,下载完解压ffmpeg.exe 程序运行 二、配置ffmpeg环境变量 添加成功后验证是否生效任意地方打开cmd窗口输入 ffmpeg 打印如下表示成功 三、node…

Ribbon负载均衡器

1. 负载均衡器 目前主流的负载方案分为以下两种:(面试题) 1.1 服务端负载均衡 在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如 F5),也有软件的(比如 Nginx&a…