书生·浦语大模型全链路开源体系-第9关 LMDeploy 量化部署进阶实践

文章目录

书生·浦语大模型全链路开源体系-第9关

为了推动大模型在更多行业落地应用,让开发人员更高效地学习大模型的开发与应用,上海人工智能实验室重磅推出书生·浦语大模型实战营,为开发人员提供大模型学习和开发实践的平台。

本文是书生·浦语大模型全链路开源体系-开源开放体系课程的笔记。

相关资源

  • InternLM项目地址

https://github.com/InternLM/InternLM

  • InternLM2技术报告

https://arxiv.org/pdf/2403.17297.pdf

  • 书生·万卷 数据

https://opendatalab.org.cn/

  • 课程链接

https://space.bilibili.com/1293512903/channel/collectiondetail?sid=4017857

LMDeploy 量化部署进阶实践

执行命令,创建一个新的虚拟环境,安装必要的库。

bash 复制代码
conda create -n internlm python=3.10 -y
conda activate internlm

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

pip install datasets==2.19.2

使用LMDeploy以命令行方式与InternLM2-Chat-1.8B模型对话

bash 复制代码
lmdeploy chat /share/new_models/Shanghai_AI_Laboratory/internlm2_5-1_8b-chat

W4A16 模型量化和部署

准确说,模型量化是一种优化技术,旨在减少机器学习模型的大小并提高其推理速度。量化通过将模型的权重和激活从高精度(如16位浮点数)转换为低精度(如8位整数、4位整数、甚至二值网络)来实现。

那么标题中的W4A16又是什么意思呢?

  • W4:这通常表示权重量化为4位整数(int4)。这意味着模型中的权重参数将从它们原始的浮点表示(例如FP32、BF16或FP16,Internlm2.5精度为BF16)转换为4位的整数表示。这样做可以显著减少模型的大小。
  • A16:这表示激活(或输入/输出)仍然保持在16位浮点数(例如FP16或BF16)。激活是在神经网络中传播的数据,通常在每层运算之后产生。

因此,W4A16的量化配置意味着:

  • 权重被量化为4位整数。
  • 激活保持为16位浮点数。

在最新的版本中,LMDeploy使用的是AWQ算法,能够实现模型的4bit权重量化。输入以下指令,执行量化工作。

bash 复制代码
lmdeploy lite auto_awq \
   /share/new_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 /root/models/internlm2_5-1_8b-chat-w4a16-4bit
Python 复制代码
lmdeploy chat /root/models/internlm2_5-1_8b-chat-w4a16-4bit --model-format awq

API开发

进入创建好的conda环境并输入指令启动API服务器。

bash 复制代码
conda activate internlm

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

Plain 复制代码
touch /root/internlm2_5.py

此时我们可以在左侧的File Broswer中看到internlm2_5.py文件,双击打开。

将以下内容复制粘贴进internlm2_5.py

Python 复制代码
# 导入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代码。

Python 复制代码
conda activate internlm

python /root/internlm2_5.py

终端会输出如下结果。

此时代表我们成功地使用本地API与大模型进行了一次对话,如果切回第一个终端窗口,会看到如下信息,这代表其成功的完成了一次用户问题GET与输出POST。

相关推荐
这就是编程5 分钟前
后端Java开发如何向LLM方向转型
人工智能
云起无垠17 分钟前
“AI+Security”系列第4期(五):模糊测试技术与AI的前沿探索
人工智能·网络安全
yvestine21 分钟前
数据挖掘——数据预处理
人工智能·机器学习·数据挖掘·数据预处理
视觉&物联智能27 分钟前
【杂谈】-DeepSeek如何以560万美元突破成本障碍
人工智能·深度学习·机器学习·ai·大模型·llm·deepseek
可为测控29 分钟前
基于深度学习算法的AI图像视觉检测
人工智能·深度学习·算法
JINGWHALE130 分钟前
设计模式 创建型 原型模式(Prototype Pattern)与 常见技术框架应用 解析
前端·人工智能·后端·设计模式·性能优化·系统架构·原型模式
天海一直在AI32 分钟前
全国计算机设计大赛大数据主题赛(和鲸赛道)经验分享
大数据·人工智能·计算机设计大赛
yongyoudayee1 小时前
关于AI面试系统2025年趋势评估!
人工智能·数智招聘
赛逸展张胜1 小时前
工信部助力新型储能制造业,CES Asia 2025展现前沿科技
大数据·人工智能·科技·智慧城市
yvestine1 小时前
数据挖掘——回归算法
人工智能·笔记·学习·算法·机器学习·数据挖掘·回归