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

书生浦语大模型实战营第四期: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工具,后面可以再测试一下,嘿嘿~

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

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

相关文章

spark-operaotr

1、系统架构 括如下几个组件: SparkApplication控制器, 该控制器用于创建、更新、删除SparkApplication对象,同时控制器还会监控相应的事件,执行相应的动作;Submission Runner, 负责调用spark-submit提交Spark作业, 作业提交的流程完全复用Spark on K8s的模式;Spark Pod Monit…

记录:ubuntu24.04源码安装nginx

一. 下载Nginx源码 两个地址二选一即可 Nginx官网Nginx官网 Github eg:nginx-1.27.3.tar.gz 下载到 ubuntu24.04 的 Downloads ,解压 cd Downloads tar -zxvf nginx-1.27.3.tar.gz二. 编译安装 Note: 编译最好用 root 权限, 使用下面命令…

国产GPU中,VLLM0.5.0发布Qwen2.5-14B-Instruct-GPTQ-Int8模型,请求返回结果乱码

概述 国产GPU: DCU Z100 推理框架: vllm0.5.0 docker容器化部署 运行如下代码: python -m vllm.entrypoints.openai.api_server --model /app/models/Qwen2.5-14B-Instruct-GPTQ-Int8 --served-model-name qwen-gptq --trust-remote-code --enforce…

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

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

Pac4j 学习笔记

随着互联网技术的飞速发展,网络安全问题日益凸显,企业信息安全与身份认证系统变得越来越重要,而且安全认证集成方案作为保障网络安全的重要一环,其研究与应用也至关重要。在这种背景下,Pac4j 作为一种流行的身份验证库…

5G CPE组成及功能介绍(二)

5G CPE 组成及功能介绍 5G CPE 将5G信号转换为Wi-Fi或有线信号, 其由5G基带芯片、主控处理器、WIFI、电源、天线、结构等多个部件组成。5G基带: 这是5G CPE中最核心的组件,负责接收和解码来自5G基站的信号,然后将这些数据转换成用户设备可以使用的格式。采用了先进的5G芯片…

微服务-seata分布式事务

1.简述 1.1.什么是分布式事务 事务:是应用程序中一系列严密的操作,所有操作必须成功完成,要么全部失败,ACID 特性。本地事务:关系型数据库中,由一组SQL组成的一个执行单元,该单元要么整体成功,要么整体失败&#xff…

flyway执行sql遇到变量执行报错解决

前两天在公司使用flyway工具执行sql时,开发写的sql里面有变量,于是这个flyway工具不识别这个变量直接报错,不接着往下执行了。报错信息如下: flyway工具执行sql报错 information: No value provided for placeholder: ${ep1} 于是…

k8s 为什么需要Pod?

Pod,是 Kubernetes 项目中最小的 API 对象,更加专业的说,Pod,是 Kubernetes 项目的原子调度单位。 Pod 是 Kubernetes 里的原子调度单位。这就意味着,Kubernetes 项目的调度器,是统一按照 Pod 而非容器的资…

IDEA 鼠标悬浮显示方法注释 javaDoc 及配置遇到的问题

方法详情: 鼠标悬浮时的效果: 设置方法: File -> Settings -> Editor -> Code Editing -> Quick Documentation,勾选红框中的选项 可能会遇到的问题: 如果不能选中,如下图 把下图的位置的选中项取消掉 选…

vscode CMakeLists中对opencv eigen的引用方法

CMakeLists.txt 项目模式(只有一个main函数入口) cmake_minimum_required(VERSION 3.5)project(vsin01 VERSION 0.1 LANGUAGES CXX)set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)set(OpenCV_DIR G:/MinGW_Opencv/opencv4.10/opencv…

cocos creator接入字节跳动抖音小游戏JSAPI敏感词检测(进行文字输入,但输入敏感词后没有替换为*号)

今天更新了某个抖音小游戏的版本,增加了部分剧情,半天过后一条短信审核未通过,emmm…抖音总是能给开发者惊喜…打开电脑看看这次又整什么幺蛾子… 首先是一脸懵逼,后端早已接入了官方的内容安全检测能力了(https://de…

基于单片机的中小水电站闸门控制系统(论文+源码)

1 系统总体设计 本次基于单片机的中小水电站闸门控制系统的设计,整体结构如图2.1所示。整个系统包括stm32单片机最小系统,电源,液晶,电机,闸门开度检测模块,水位检测模块,温度传感器&#xff0…

证明网络中的流形成一个凸集

证明网络中的流形成一个凸集 步骤1:定义和符号步骤2:线性组合步骤3:验证容量限制步骤4:验证流量守恒结论示例代码(C语言) 在网络流理论中,一个流 f f f 是定义在网络图的边集上的一种函数&…

【贪心算法】贪心算法五

贪心算法五 1.跳跃游戏 II2.跳跃游戏3.加油站3.单调递增的数字 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.跳跃游戏 II 题目链接&…

计算机毕业设计Python医疗问答系统 医疗可视化 BERT+LSTM+CRF深度学习识别模型 机器学习 深度学习 爬虫 知识图谱 人工智能 大数据毕业设计

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

QT 中 sqlite 数据库使用

一、前提 --pro文件添加sql模块QT core gui sql二、使用 说明 --用于与数据库建立连接QSqlDatabase--执行各种sql语句QSqlQuery--提供数据库特定的错误信息QSqlError查看qt支持的驱动 QStringList list QSqlDatabase::drivers();qDebug()<<list;连接 sqlite3 数据库 …

总结的一些MySql面试题

目录 一&#xff1a;基础篇 二&#xff1a;索引原理和SQL优化 三&#xff1a;事务原理 四&#xff1a;缓存策略 一&#xff1a;基础篇 1&#xff1a;定义&#xff1a;按照数据结构来组织、存储和管理数据的仓库&#xff1b;是一个长期存储在计算机内的、有组织的、可共享 的…

Mac 录制电脑系统内的声音的具体方法?

1.第一步&#xff1a;下载BlackHole 软件 方式1&#xff1a;BlackHole官方下载地址 方式2&#xff1a; 百度云下载 提取码: n5dp 2.第二步&#xff1a;安装BlackHole 双击下载好的BlackHole安装包&#xff0c;安装默认提示安装。 3.第三步&#xff1a;在应用程序中找到音频…

什么是分库?分表?分库分表?

分库分表&#xff0c;是企业里面比较常见的针对高并发、数据量大的场景下的一种技术优化方案&#xff0c;所谓“分库分表”&#xff0c;根本不是一回事&#xff0c;而是三件事&#xff0c;他们要解决的问题也都不一样。 这三个事分别是“只分库不分表”、“只分表不分库”、以…