Camp4-L2:LMDeploy 量化部署进阶实践

news2024/12/13 5:03:04

书生浦语大模型实战营第四期:LMDeploy 量化部署进阶实践

  • 教程链接:https://github.com/InternLM/Tutorial/tree/camp4/docs/L2/LMDeploy
  • 视频链接:https://www.bilibili.com/video/BV18aUHY3EEG/?vd_source=b96c7e6e6d1a48e73edafa36a36f1697
  • 任务链接:https://github.com/InternLM/Tutorial/blob/camp4/docs/L2/LMDeploy/task.md
  • 提交链接:https://aicarrier.feishu.cn/share/base/form/shrcnUqshYPt7MdtYRTRpkiOFJd

任务说明

基础任务(完成此任务即完成闯关)

  • 使用结合W4A16量化与kv cache量化的internlm2_5-1_8b-chat模型封装本地API并与大模型进行一次对话,作业截图需包括显存占用情况与大模型回复,参考4.1 API开发(优秀学员必做),请注意2.2.3节与4.1节应使用作业版本命令。
  • 使用Function call功能让大模型完成一次简单的"加"与"乘"函数调用,作业截图需包括大模型回复的工具调用情况,参考4.2 Function call(选做)

视频教程

在这里插入图片描述

LMDeploy部署模型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

大模型缓存推理技术

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

大模型量化技术

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

大模型外推技术

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Function Calling

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

环境配置

conda create -n lmdeploy  python=3.10 -y
conda activate lmdeploy
pip install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1 --index-url https://download.pytorch.org/whl/cu121
pip install timm==1.0.8 openai==1.40.3 lmdeploy[all]==0.5.3
pip install datasets==2.19.2

下载internlm2_5-7b-chatinternlm2_5-1_8b-chat两个模型至models文件夹,具体参考之前入门岛的内容即可,然后测试下环境:

lmdeploy chat models/internlm2_5-7b-chat

在这里插入图片描述
这样环境基本上就搭建好了,看下显存占用,后面对比下:
在这里插入图片描述
显存占用分析

对于一个7B(70亿)参数的模型,每个参数使用16位浮点数(等于 2个 Byte)表示,则模型的权重大小约为:

7×10^9 parameters×2 Bytes/parameter=14GB

70亿个参数×每个参数占用2个字节=14GB

因此,对于internLM2.5 7B模型为bf16,LMDpeloy推理精度为bf16的7B模型权重需要占用14GB显存

然后lmdeploy默认设置cache-max-entry-count为0.8,即kv cache占用剩余显存的80%;

所以,对于24GB的A10显卡,权重占用14GB显存,剩余显存24-14=10GB,因此kv cache占用10GB*0.8=8GB,加上原来的权重14GB,总共占用14+8=22GB。

启动API服务器

conda activate lmdeploy
lmdeploy serve api_server \
    models/Shanghai_AI_Laboratory/internlm2_5-7b-chat \
    --model-format hf \
    --quant-policy 0 \
    --server-name 0.0.0.0 \
    --server-port 23333 \
    --tp 1

参数解释:

  • lmdeploy serve api_server:这个命令用于启动API服务器。
  • models/Shanghai_AI_Laboratory/internlm2_5-7b-chat :这是模型的路径。
  • –model-format hf:这个参数指定了模型的格式。hf代表“Hugging Face”格式。
  • –quant-policy 0:这个参数指定了量化策略。
    –server-name 0.0.0.0:这个参数指定了服务器的名称。在这里,0.0.0.0是一个特殊的IP地址,它表示所有网络接口。
  • –server-port 23333:这个参数指定了服务器的端口号。在这里,23333是服务器将监听的端口号。
  • –tp 1:这个参数表示并行数量(GPU数量)

示例:
在这里插入图片描述
在这里插入图片描述
然后可以通过如下方式调用上面的API服务:

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

这个跟上面一样,是在终端的对话,也可以通过网页形式:

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

在这里插入图片描述
环境和基本使用就是这样,后面就是各种量化了~

任务1

使用结合W4A16量化与kv cache量化的internlm2_5-1_8b-chat模型封装本地API并与大模型进行一次对话,作业截图需包括显存占用情况与大模型回复,参考4.1 API开发(优秀学员必做),请注意2.2.3节与4.1节应使用作业版本命令。

首先使用下述命令进行W4A16量化:

lmdeploy lite auto_awq \
  models/Shanghai_AI_Laboratory/internlm2_5-1_8b-chat \
  --calib-dataset 'ptb' \
  --calib-samples 128 \
  --calib-seqlen 2048 \
  --w-bits 4 \
  --w-group-size 128 \
  --batch-size 1 \
  --search-scale False \
  --work-dir models/Shanghai_AI_Laboratory/internlm2_5-1_8b-chat-w4a16-4bit
  • lmdeploy lite auto_awq: lite这是LMDeploy的命令,用于启动量化过程,而auto_awq代表自动权重量化(auto-weight-quantization)。
  • models/Shanghai_AI_Laboratory/internlm2_5-1_8b-chat: 模型文件的路径。
  • –calib-dataset ‘ptb’: 这个参数指定了一个校准数据集,这里使用的是’ptb’(Penn Treebank,一个常用的语言模型数据集)。
  • –calib-samples 128: 这指定了用于校准的样本数量—128个样本
  • –calib-seqlen 2048: 这指定了校准过程中使用的序列长度—2048
  • –w-bits 4: 这表示权重(weights)的位数将被量化为4位。
  • –work-dir models/Shanghai_AI_Laboratory/internlm2_5-1_8b-chat-w4a16-4bit: 这是工作目录的路径,用于存储量化后的模型和中间结果。

在这里插入图片描述
由于服务器链接huggingface有问题,所以需要手动下载ptb_text_only.py,然后改一下lmdeploy/lite/utils/calib_dataloader.py中的get_ptb函数,具体改动如下:
在这里插入图片描述
输入以下指令启动量化后的模型:

lmdeploy chat models/Shanghai_AI_Laboratory/internlm2_5-1_8b-chat-w4a16-4bit --model-format awq

在这里插入图片描述
显存占用情况如下:
在这里插入图片描述

同时启用W4A16量化后的模型、设定kv cache占用和kv cache int4量化,命令如下:

lmdeploy serve api_server \
    models/Shanghai_AI_Laboratory/internlm2_5-1_8b-chat-w4a16-4bit \
    --model-format awq \
    --quant-policy 4 \
    --cache-max-entry-count 0.4\
    --server-name 0.0.0.0 \
    --server-port 23333 \
    --tp 1

看下显存占用情况:

在这里插入图片描述

计算一下此刻的显存占用情况(11GB):

  • 在 int4 精度下,1.8B模型权重占用0.9GB:3.6/4=0.9GB
  • kv cache占用16.4GB:剩余显存24-0.9=23.1GB,kv cache占用40%,即23.1*0.4=9.24GB
  • 其他项0.9GB
    因此,11GB ∼ \sim 权重占用0.9GB+kv cache占用9.2GB+其它项0.9GB

使用下述命令访问上述API服务

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

开始愉快地对话吧:
在这里插入图片描述
感觉1.8B的模型预留9.2GB的KV cache缓存应该有点浪费,继续将比例从0.4往下调,看下模型是否能正常对话:

lmdeploy serve api_server \
    models/Shanghai_AI_Laboratory/internlm2_5-1_8b-chat-w4a16-4bit \
    --model-format awq \
    --quant-policy 4 \
    --cache-max-entry-count 0.1\
    --server-name 0.0.0.0 \
    --server-port 23333 \
    --tp 1
lmdeploy serve gradio http://localhost:23333 \
    --server-name 0.0.0.0 \
    --server-port 6006

然后就会发现只占用了4GB的显存:
在这里插入图片描述
模型也依然可以正常对话:
在这里插入图片描述
感觉这个量化还是蛮不错的,马上就开个screen,把7B的模型量化一波儿:

lmdeploy lite auto_awq \
  models/Shanghai_AI_Laboratory/internlm2_5-7b-chat \
  --calib-dataset 'ptb' \
  --calib-samples 128 \
  --calib-seqlen 2048 \
  --w-bits 4 \
  --w-group-size 128 \
  --batch-size 1 \
  --search-scale False \
  --work-dir models/Shanghai_AI_Laboratory/internlm2_5-7b-chat-w4a16-4bit

同样把cache-max-entry-coun设置为0.1测试一下模型占用显存情况,并看看是否能正常对话:

lmdeploy serve api_server \
    models/Shanghai_AI_Laboratory/internlm2_5-7b-chat-w4a16-4bit \
    --model-format awq \
    --quant-policy 4 \
    --cache-max-entry-count 0.1\
    --server-name 0.0.0.0 \
    --server-port 23333 \
    --tp 1
lmdeploy serve gradio http://localhost:23333 \
    --server-name 0.0.0.0 \
    --server-port 6006

可以看到基本上只用了7.5GB左右的显存,相当可以了~
在这里插入图片描述
对话目前也是正常的,速度还可以:
在这里插入图片描述
作业基本上就这样了,后续可以再试试比较大的模型,比如70B的模型,大约本身是需要140GB的显存,int4量化后需要35GB,或许两个A10能跑起来,做个实验试试,嘿嘿~

任务2

使用Function call功能让大模型完成一次简单的"加"与"乘"函数调用,作业截图需包括大模型回复的工具调用情况,参考4.2 Function call(选做)

先启动API服务器:

lmdeploy serve api_server \
     models/Shanghai_AI_Laboratory/internlm2_5-1_8b-chat-w4a16-4bit \
    --model-format awq \
    --cache-max-entry-count 0.4 \
    --quant-policy 4 \
    --server-name 0.0.0.0 \
    --server-port 23333 \
    --tp 1

新建脚本internlm2_5.py,贴入下述内容:

# 导入openai模块中的OpenAI类,这个类用于与OpenAI API进行交互
from openai import OpenAI


# 创建一个OpenAI的客户端实例,需要传入API密钥和API的基础URL
client = OpenAI(
    api_key='YOUR_API_KEY',  
    # 替换为你的OpenAI API密钥,由于我们使用的本地API,无需密钥,任意填写即可
    base_url="http://0.0.0.0:23333/v1"  
    # 指定API的基础URL,这里使用了本地地址和端口
)

# 调用client.models.list()方法获取所有可用的模型,并选择第一个模型的ID
# models.list()返回一个模型列表,每个模型都有一个id属性
model_name = client.models.list().data[0].id

# 使用client.chat.completions.create()方法创建一个聊天补全请求
# 这个方法需要传入多个参数来指定请求的细节
response = client.chat.completions.create(
  model=model_name,  
  # 指定要使用的模型ID
  messages=[  
  # 定义消息列表,列表中的每个字典代表一个消息
    {"role": "system", "content": "你是一个友好的小助手,负责解决问题."},  
    # 系统消息,定义助手的行为
    {"role": "user", "content": "帮我讲述一个关于狐狸和西瓜的小故事"},  
    # 用户消息,询问时间管理的建议
  ],
    temperature=0.8,  
    # 控制生成文本的随机性,值越高生成的文本越随机
    top_p=0.8  
    # 控制生成文本的多样性,值越高生成的文本越多样
)

# 打印出API的响应结果
print(response.choices[0].message.content)  

python运行一下:

在这里插入图片描述
我们成功地使用本地API与大模型进行了一次对话,服务器终端反馈也是正常的:
在这里插入图片描述

关于Function call,即函数调用功能,它允许开发者在调用模型时,详细说明函数的作用,并使模型能够智能地根据用户的提问来输入参数并执行函数。完成调用后,模型会将函数的输出结果作为回答用户问题的依据。

启动API服务器:

lmdeploy serve api_server \
    models/Shanghai_AI_Laboratory/internlm2_5-7b-chat \
    --model-format hf \
    --quant-policy 4 \
    --cache-max-entry-count 0.4 \
    --server-name 0.0.0.0 \
    --server-port 23333 \
    --tp 1

新建脚本internlm2_5_func.py,贴入下述内容:

from openai import OpenAI


def add(a: int, b: int):
   return a + b


def mul(a: int, b: int):
   return a * b


tools = [{
   'type': 'function',
   'function': {
       'name': 'add',
       'description': 'Compute the sum of two numbers',
       'parameters': {
           'type': 'object',
           'properties': {
               'a': {
                   'type': 'int',
                   'description': 'A number',
               },
               'b': {
                   'type': 'int',
                   'description': 'A number',
               },
           },
           'required': ['a', 'b'],
       },
   }
}, {
   'type': 'function',
   'function': {
       'name': 'mul',
       'description': 'Calculate the product of two numbers',
       'parameters': {
           'type': 'object',
           'properties': {
               'a': {
                   'type': 'int',
                   'description': 'A number',
               },
               'b': {
                   'type': 'int',
                   'description': 'A number',
               },
           },
           'required': ['a', 'b'],
       },
   }
}]
messages = [{'role': 'user', 'content': 'Compute (3+5)*2'}]

client = OpenAI(api_key='YOUR_API_KEY', base_url='http://0.0.0.0:23333/v1')
model_name = client.models.list().data[0].id
response = client.chat.completions.create(
   model=model_name,
   messages=messages,
   temperature=0.8,
   top_p=0.8,
   stream=False,
   tools=tools)
print(response)
func1_name = response.choices[0].message.tool_calls[0].function.name
func1_args = response.choices[0].message.tool_calls[0].function.arguments
func1_out = eval(f'{func1_name}(**{func1_args})')
print(func1_out)

messages.append({
   'role': 'assistant',
   'content': response.choices[0].message.content
})
messages.append({
   'role': 'environment',
   'content': f'3+5={func1_out}',
   'name': 'plugin'
})
response = client.chat.completions.create(
   model=model_name,
   messages=messages,
   temperature=0.8,
   top_p=0.8,
   stream=False,
   tools=tools)
print(response)
func2_name = response.choices[0].message.tool_calls[0].function.name
func2_args = response.choices[0].message.tool_calls[0].function.arguments
func2_out = eval(f'{func2_name}(**{func2_args})')
print(func2_out)

python运行一下:

在这里插入图片描述
可以看到InternLM2.5将输入’Compute (3+5)*2’根据提供的function拆分成了"加"和"乘"两步,第一步调用function add实现加,再于第二步调用function mul实现乘,再最终输出结果16.
到这里基本上就完成了任务,不过测试的时候发现一个bug,即将输入换成Compute (4+6)*2时,再执行上述脚本:
在这里插入图片描述
根据输出可以发现模型并没有智能的调用function,这应该是因为模型本身就可以解决这个问题,不需要调用function工具,后面可以再测试一下,嘿嘿~

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

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

相关文章

Qt之第三方库QCustomPlot使用(二)

Qt开发 系列文章 - qcustomplot(二) 目录 前言 一、Qt开源库 二、QCustomPlot 1.qcustomplot介绍 2.qcustomplot下载 3.qcustomplot移植 4.修改项目文件.pro 5.提升QWidget类‌ 三、技巧讲解 1.拖动缩放功能 2.等待更新 总结 前言 Qt第三方…

python数据分析之爬虫基础:selenium详细讲解

目录 1、selenium介绍 2、selenium的作用: 3、配置浏览器驱动环境及selenium安装 4、selenium基本语法 4.1、selenium元素的定位 4.2、selenium元素的信息 4.3、selenium元素的交互 5、Phantomjs介绍 6、chrome handless模式 1、selenium介绍 (1…

LearnOpenGL学习(模型加载 -- Assimp,网格,模型)

完整代码见:zaizai77/Cherno-OpenGL: OpenGL 小白学习之路 Assimp 3D建模工具如Blender、3DS Max在导出模型文件时,会自动生成所有的顶点坐标、顶点法线和纹理坐标。 .obj 格式只包含了模型数据和材质信息(颜色、贴图等) Assi…

qtcanpool 知 08:Docking

文章目录 前言口味改造后语 前言 很久以前,作者用 Qt 仿照前端 UI 设计了一个 ministack(https://gitee.com/icanpool/qtcanpool/blob/release-1.x/src/libs/qcanpool/ministack.h) 控件,这个控件可以折叠。部分用户体验后&#…

【Linux】文件管理必备知识和基本指令

【Linux】文件管理必备知识和基本指令 什么是操作系统什么是文件什么是路径01. ls 指令02. pwd命令03. cd 指令04. touch指令05.mkdir指令(重要):06.rmdir指令 && rm 指令(重要):rmdir指令rm指令 0…

R155 VTA 认证对汽车入侵检测系统(IDS)合规要求

续接上集“浅谈汽车网络安全车辆型式认证(VTA)的现状和未来发展”,有许多读者小伙伴有联系笔者来确认相关的R155 VTA网络安全审核要求,基于此,笔者将针对 R155 VTA 每一条网络安全审核细则来具体展开。 今天就先从汽车…

【PHP项目实战】活动报名系统

目录 项目介绍 开发语言 后端 前端 项目截图(部分) 首页 列表 详情 个人中心 后台管理 项目演示 项目介绍 本项目是一款基于手机浏览器的活动报名系统。它提供了一个方便快捷的活动报名解决方案,无需下载和安装任何APP&#xff0c…

【数据分享】1901-2023年我国省市县三级逐年最低气温数据(Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月最低气温栅格数据和Excel和Shp格式的省市县三级逐月最低气温数据,原始的逐月最低气温栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据!基于逐月栅格数据我们采用求年平均值的方法得到逐年最…

使用伪装IP地址和MAC地址进行Nmap扫描

使用伪装IP地址和MAC地址进行Nmap扫描 在某些网络设置中,攻击者可以使用伪装的IP地址甚至伪装的MAC地址进行系统扫描。这种扫描方式只有在可以保证捕获响应的情况下才有意义。如果从某个随机的网络尝试使用伪装的IP地址进行扫描,很可能无法接收到任何响…

【趣题分享】赤壁之战每日演兵(原诸葛亮列传兵法题)求解算法

文章目录 序言1 求解算法代码(python)2 思路细节2.1 定义拼图与阵型2.2 穷举复杂度2.3 使用缓存进行改进()2.3.1 LRU缓存2.3.2 将2.2的solve函数改写为可缓存装饰的 2.4 使用剪枝进行改进()2.5 使用更好的状…

Java项目实战II基于微信小程序的私家车位共享系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市化进程的加速&…

STM32 实现 TCP 服务器与多个设备通信

目录 一、引言 二、硬件准备 三、软件准备 四、LWIP 协议栈的配置与初始化 五、创建 TCP 服务器 1.创建任务以及全局变量 2.创建 TCP 控制块 3.绑定端口 4. 进入监听状态 5.设置接收回调函数 六、处理多个客户端连接 七、总结 一、引言 在嵌入式系统开发中&…

LobeChat-46.6k星!顶级AI工具集,一键部署,界面美观易用,ApiSmart 是你肉身体验学习LLM 最好IDEA 工具

LobeChat LobeChat的开源,把AI功能集合到一起,真的太爽了。 我第一次发现LobeChat的时候,就是看到那炫酷的页面,这么强的前端真的是在秀肌肉啊! 看下它的官网,整个网站的动效简直闪瞎我! GitH…

计算机键盘的演变 | 键盘键名称及其功能 | 键盘指法

注:本篇为 “键盘的演变及其功能” 相关几篇文章合辑。 英文部分机翻未校。 The Evolution of Keyboards: From Typewriters to Tech Marvels 键盘的演变:从打字机到技术奇迹 Introduction 介绍 The keyboard has journeyed from a humble mechanical…

第三部分:进阶概念 7.数组与对象 --[JavaScript 新手村:开启编程之旅的第一步]

第三部分:进阶概念 7.数组与对象 --[JavaScript 新手村:开启编程之旅的第一步] 在 JavaScript 中,数组和对象是两种非常重要的数据结构,它们用于存储和组织数据。尽管它们都属于引用类型(即它们存储的是对数据的引用而…

面试中遇到的一些有关进程的问题(有争议版)

一个进程最多可以创建多少个线程? 这个面经很有问题,没有说明是什么操作系统,以及是多少位操作系统。 因为不同的操作系统和不同位数的操作系统,虚拟内存可能是不一样多。 Windows 系统我不了解,我就说说 Linux 系统…

Excel技巧:如何批量调整excel表格中的图片?

插入到excel表格中的图片大小不一,如何做到每张图片都完美的与单元格大小相同?并且能够根据单元格来改变大小?今天分享,excel表格里的图片如何批量调整大小。 方法如下: 点击表格中的一个图片,然后按住Ct…

Stable Audio Open模型部署教程:用AI打造独家节拍,让声音焕发新活力!

Stable Audio Open 是一个开源的文本到音频模型,允许用户从简单的文本提示中生成长达 47 秒的高质量音频数据。该模型非常适合创建鼓点、乐器即兴演奏、环境声音、拟音录音和其他用于音乐制作和声音设计的音频样本。用户还可以根据他们的自定义音频数据微调模型&…

Linux上传代码的步骤与注意事项

最近因为工作需要,要上传代码到 DPDK 上,代码已经上传成功,记录一下过程,给大家提供一个参考。我这次需要上传的是pmd,即poll mode driver。 1 Coding Style 要上传代码,第一件事就是需要知道Coding Styl…

运费微服务和redis存热点数据

目录 运费模板微服务 接收前端发送的模板实体类 插入数据时使用的entity类对象 BaseEntity类 查询运费模板服务 新增和修改运费模块 整体流程 代码实现 运费计算 整体流程 总的代码 查找运费模板方法 计算重量方法 Redis存入热点数据 1.从nacos导入共享redis配置…