首页 > 其他分享 >书生大模型实战营3期 - 进阶岛 - 3 - LMDeploy 量化部署进阶实践

书生大模型实战营3期 - 进阶岛 - 3 - LMDeploy 量化部署进阶实践

时间:2024-08-19 17:24:02浏览次数:8  
标签:进阶 -- 书生 models API LMDeploy server root name

文章目录

闯关任务

任务描述:LMDeploy 量化部署实践闯关任务
任务文档:LMDeploy 量化部署进阶实践

完成结果

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

环境准备/安装:

conda create -n lmdeploy  python=3.10 -y
conda activate lmdeploy
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia -y
pip install timm==1.0.8 openai==1.40.3 lmdeploy[all]==0.5.3

模型准备:

mkdir /root/models
ln -s /root/share/new_models//Shanghai_AI_Laboratory/internlm2_5-7b-chat /root/models
ln -s /root/share/new_models/OpenGVLab/InternVL2-26B /root/models

LMDeploy验证启动模型文件:

lmdeploy chat /root/models/internlm2_5-7b-chat

请添加图片描述
请添加图片描述

LMDeploy API部署InternLM2.5:
(1) 启动API服务器;

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

请添加图片描述
这一步由于部署在远程服务器上,所以本地需要做一下端口映射才能访问。本地打开一个cmd或powershell窗口,输入命令;

 ssh -CNg -L 23333:127.0.0.1:23333 [email protected] -p 你的ssh端口号

然后打开浏览器,访问http://127.0.0.1:23333看到如下界面即代表部署成功;
请添加图片描述
(2) 以命令行形式连接API服务器,运行如下命令以启动命令行客户端;

lmdeploy serve api_client http://localhost:23333

请添加图片描述
请添加图片描述
(3) 以Gradio网页形式连接API服务器,输入以下命令,使用Gradio作为前端,启动网页;

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

因为此时端口不同,需要重新做一下端口映射;

ssh -CNg -L 6006:127.0.0.1:6006 [email protected] -p <你的ssh端口号>

打开浏览器,访问地址http://127.0.0.1:6006,然后就可以与模型尽情对话了。
请添加图片描述
LMDeploy Lite 大模型压缩:
(1) 设置在线 kv cache int4/int8 量化以及kv cache缓存大小(参数:quant-policy、cache-max-entry-count);

lmdeploy serve api_server \
    /root/models/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

(2) W4A16 模型量化和部署,输入以下指令,执行量化工作(量化很慢);

lmdeploy lite auto_awq \
   /root/models/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 /root/models/internlm2_5-7b-chat-w4a16-4bit

请添加图片描述

(3) W4A16 量化+ KV cache+KV cache 量化;

lmdeploy serve api_server \
    /root/models/internlm2_5-7b-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

结合W4A16量化与kv cache量化的internlm2_5-7b-chat模型封装本地API并与大模型进行一次对话:
(1) 输入指令启动API服务器;

lmdeploy serve api_server \
    /root/models/internlm2_5-7b-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

请添加图片描述

(2) 新建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)

(3) 运行上述python代码并得到最终输出结果,以及显存占用大小;

python /root/internlm2_5.py

请添加图片描述
使用Function call功能让大模型完成一次简单的"加"与"乘"函数调用:
(1) 启动API服务器;

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

请添加图片描述

(2) 新建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)

(3) 运行上述python代码并得到最终输出结果;
请添加图片描述

标签:进阶,--,书生,models,API,LMDeploy,server,root,name
From: https://blog.csdn.net/wocsdn111/article/details/141260793

相关文章

  • 2024年新版Python零基础从入门到进阶学习路线!
    Python基础初始Python基础语法流程控制-选择结构流程控制-循环结构字符串和正则函数入门函数高级数据结构-列表和元组数据结构-字典和集合IO和文件操作文件操作进阶面向对象入门面向对象三大特性面向对象应用异常处理常用内置模块序列化模块网络请求模块MySQL入门MySQL命......
  • hbu2024暑假进阶训练营开营测试
    目录7-1考试成绩7-2心理阴影面积7-1考试成绩题目RainSure同学在参加一场面试,一共有n道题目,他的初始分数为m分。RainSure回答错一道题目就会扣一分,但是分数不会小于0;回答正确一道题目就会加一分。给定一个长度为n的字符串,第i个字符如果为o,代表第i道题目RainSur......
  • 书生大模型实战营3期 - 进阶岛 - 2 - Lagent 自定义你的 Agent 智能体
    文章目录闯关任务完成结果闯关任务任务描述:Lagent自定义你的Agent智能体任务文档:Lagent自定义你的Agent智能体完成结果使用Lagent自定义一个智能体,并使用LagentWebDemo成功部署与调用,记录复现过程并截图。环境准备/安装:#创建环境condacreate-n......
  • Springboot集成RabbitMQ从入门到进阶教学
    RabbitMQ基本信息RabbitMQ是什么1.基础概念消息代理(MessageBroker):RabbitMQ作为一个中间人,负责接收、存储和转发消息,确保消息从生产者发送到消费者。AMQP协议:高级消息队列协议(AdvancedMessageQueuingProtocol)是一种消息传递协议,旨在为消息的中间传递提供标准化......
  • Java巅峰之路---进阶篇---面向对象(一)
    static关键字介绍static表示静态,是java中的一个修饰符,可以修饰成员方法,成员变量。其中,被static修饰的成员变量,叫做静态变量;被static修饰的成员方法,叫做静态方法。静态变量调用方式:类名调用(推荐)、对象调用特点:●被该类所有对象共享●不属于对象,属于类●随着类的加载......
  • 模板——从初级到进阶
    目录前言:一、非类型模板参数二、模板的特化     2.1函数模板特化    2.2类模板特化            2.2.1全特化        2.2.2偏特化三、模板分离编译    3.1什么是分离编译    3.2 模......
  • 离线算法 莫队算法进阶
    前算是把之前的坑填一填吧。这篇文章主要包含带修莫队,二维莫队等莫队算法的进阶应用,观看前请确保您已经熟练掌握了基本的莫队算法,不会的可以戳这里。带修莫队众所周知,普通莫队是不支持修改的,因为我们为了得到更优的时间复杂度,需要将每次询问离线下来,打乱顺序。不过我们也......
  • 进阶-Linux目录结构与目录结构命令
    1、大纲日志查看四剑客:cat/head/tail/more/lesswcwhich/whereisdiff/vimdiff排序:sort,uniq时间:date打包压缩2、日志查询4剑客2.1概述查看日志不要使用,cat或vim,vi命令。未来的日志文件。有的日志可达:40G或以上如果使用cat查看,会刷屏根本停不下来如果使用vi/vim查看,......
  • Datawhale X 魔搭 AI夏令营-第四期(AIGC方向)-Task03-可图Kolors-进阶上分 实战优化
    往期内容:DatawhaleX魔搭AI夏令营-第四期(AIGC方向)-Task02-可图Kolors-精读代码实战进阶DatawhaleX魔搭AI夏令营-第四期(AIGC方向)-Task01-可图Kolors-LoRA风格故事挑战赛本期主要的学习内容为:使用ComfyUI工具来可视化文生图的工作流程界面,并基于Task01中LoRA微调得......
  • SpringMVC - 进阶
    1.Controller&RequestMapping@Controller用来标注在类上,表示这个类是一个控制器类,可以用来处理http请求,通常会和@RequestMapping一起使用。这个注解上面有@Component注解,说明被@Controller标注的类会被注册到spring容器中,value属性用来指定这个bean的名称@Target({Element......