LMDeploy 量化部署

在这里插入图片描述

LMDeploy简介

LMDeploy是一个由MMDeploy和MMRazor团队联合开发的工具包,旨在为大型语言模型(LLM)提供全套的轻量化、部署和服务解决方案。以下是对LMDeploy的简介,采用分点表示和归纳的方式:

  1. 核心功能

    • 高效推理引擎TurboMind:基于FasterTransformer,实现了高效推理引擎TurboMind,支持InternLM、LLaMA、vicuna等模型在NVIDIA GPU上的推理。TurboMind开发了一系列关键特性,如持久批处理、阻塞KV缓存、动态拆分融合、张量并行和高性能CUDA内核,确保LLM推理的高吞吐和低延迟。
    • 交互式推理模式:通过在多轮对话过程中缓存注意力的k/v,引擎能够记住对话历史,避免历史会话的重复处理。
    • 量化支持:LMDeploy支持多种量化方法和量化模型的高效推理,通过降低显存占用和提升推理速度来优化模型性能。其量化方法包括线性量化和聚类量化,以及定点化模型输出。
  2. 技术特点

    • 量化优化:LMDeploy使用AWQ算法实现模型的4bit权重量化,并且TurboMind推理引擎提供了非常高效的4bit推理cuda kernel,性能是FP16的2.4倍以上。
    • KV Cache量化:LMDeploy支持通过API Server方式启动,允许用户调整KV Cache的占用比例,以及使用命令行客户端与Gradio网页客户端与模型进行交互。
    • 多模态支持:LMDeploy还正式支持多模态(视觉)模型推理和服务,扩展了其应用范围。
  3. 环境搭建与基础配置

    • 环境推荐:使用torch1.11.0, ubuntu20.04, python版本为3.8, cuda版本为11.3, 使用v100来进行实验。
    • 虚拟环境创建与激活:使用conda创建和激活虚拟环境,以隔离不同项目的依赖。
    • 包导入:根据需要导入所需的Python包,并考虑使用镜像源以提高下载速度。
  4. 部署流程

    • 模型转换:支持在线转换和本地命令行转换。
    • TurboMind推理:支持命令行本地对话和API服务。
    • 网页Demo演示:提供网页形式的模型演示功能。

LMDeploy是一个功能强大的工具包,通过提供高效推理引擎、交互式推理模式和多种量化支持,为大型语言模型的轻量化、部署和服务提供了全面的解决方案。

代码实践部分

import lmdeploy
from modelscope.hub.snapshot_download import snapshot_download
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
# save_dir是模型保存到本地的目录
save_dir="/root/LLM//model"
 
 
# 1.下载internlm2-chat-1_8b
snapshot_download("Shanghai_AI_Laboratory/internlm2-chat-1_8b", 
                  cache_dir=save_dir, 
                  revision='v1.1.0')

#pipe = lmdeploy.pipeline("/root/LLM/model/Shanghai_AI_Laboratory/internlm2-chat-1_8b")
#response = pipe(["Hi, pls intro yourself", "Shanghai is"])
#print(response)
 
tokenizer = AutoTokenizer.from_pretrained("/root/LLM//model/Shanghai_AI_Laboratory/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/LLM//model/Shanghai_AI_Laboratory/internlm2-chat-1_8b", torch_dtype=torch.float16, trust_remote_code=True).cuda()
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)

在这里插入图片描述

使用LMDeploy运行模型

在使用 LMDeploy 与模型进行对话时,通常需要一个可以执行自然语言处理任务的模型。以下是使用 LMDeploy 运行模型并与之进行对话的通用命令格式:

lmdeploy -m MODEL_NAME -q QUERY

这里:

  • MODEL_NAME 是你的模型的名称。
  • QUERY 是你想让模型回答的问题或执行的自然语言处理任务。
    例如,如果你有一个名为 my_model 的模型,你可以这样使用它:
lmdeploy -m my_model -q "你好,今天天气怎么样?"

LMDeploy 会处理你的查询,并返回模型的响应。请注意,LMDeploy 是一个假设的工具,如果你在寻找一个实际的工具,可能需要查找一个与你的具体需求和环境相匹配的工具。

session 1

double enter to end input >>> 你好

<|im_start|>system
You are an AI assistant whose name is InternLM (书生·浦语).
- InternLM (书生·浦语) is a conversational language model that is developed by Shanghai AI Laboratory (上海人工智能实验室). It is designed to be helpful, honest, and harmless.
- InternLM (书生·浦语) can understand and communicate fluently in the language chosen by the user such as English and 中文.
<|im_end|>
<|im_start|>user
你好<|im_end|>
<|im_start|>assistant
 2024-06-13 13:40:36,813 - lmdeploy - WARNING - kwargs ignore_eos is deprecated for inference, use GenerationConfig instead.
2024-06-13 13:40:36,814 - lmdeploy - WARNING - kwargs random_seed is deprecated for inference, use GenerationConfig instead.
你好,有什么我可以帮忙的吗?


LMDeploy 模型量化方案概述

在深入探讨LMDeploy的量化方案之前,我们先来理解两个核心概念:计算密集型和访存密集型。计算密集型场景意味着推理过程中,数值计算占据了大部分时间;而访存密集型则是指数据读取占据了推理的主要时间。对于LLM(大型语言模型)这类Decoder Only架构的模型,其推理过程往往表现为访存密集型,因此,如何有效减少访存占用的显存空间,对提升GPU计算效率至关重要。

量化的目的

量化技术的主要目标是减小数据交换(即访存)所占用的显存空间。具体来说,它有两种常见的方法:

  1. KV8量化:在解码(Decoding)过程中,对上下文K和V的中间结果进行INT8量化,并在需要计算时再进行反量化。这种方法能够显著降低显存的占用,提高显存的利用率。

  2. W4A16量化:该方法将FP16(16位浮点数)的模型权重量化为INT4(4位整数)。在Kernel计算时,由于访存的数据量减少到FP16模型的1/4,从而大幅降低了访存成本。值得注意的是,这种量化方式仅针对权重进行,数值计算时依然采用FP16(通过反量化INT4权重实现)。

实践操作

接下来,我们将针对这两种量化方式,介绍一些实践操作建议:

  1. 设置最大KV Cache缓存大小

KV Cache是一种高效的缓存技术,通过存储键值对的形式复用计算结果,以减少重复计算,并降低内存消耗。在LMDeploy中,你可以通过--cache-max-entry-count参数来设置KV Cache占用剩余显存的最大比例。默认值为0.8,意味着KV Cache将占用最多80%的剩余显存。

然而,调整KV Cache的大小需要在访存速度和显存占用之间进行权衡。虽然减小KV Cache的占比可以释放更多显存供模型计算使用,但也可能导致访存速度降低,进而影响推理速度。因此,在实际应用中,需要根据具体情况调整该参数,找到访存速度与显存占用之间的最佳平衡点。

#通过--cache-max-entry-count参数的大小控制KV缓存占用剩余显存的最大比例,默认为0.8
lmdeploy chat /root/LLM//model/Shanghai_AI_Laboratory/internlm2-chat-1_8b --cache-max-entry-count 0.5
  1. 设置W4A16量化
    当使用LMDeploy进行W4A16量化时,您需要确保正确配置了量化参数。以下是修改后的命令,用于执行W4A16量化并将结果保存到指定路径:
# 使用W4A16量化
lmdeploy lite auto_awq \
   /root/LLM//model/Shanghai_AI_Laboratory/internlm2-chat-1_8b \ # 需要量化的模型的路径
   --calib-dataset 'ptb' \
   --calib-samples 128 \
   --calib-seqlen 1024 \
   --w-bits 4 \ # 指定权重使用 4 位
   --a-bits 16 \ # 通常不需要显式指定激活的位数,但如果是W4A16,这里可以显式指出激活是16位(如果LMDeploy支持)
   --w-group-size 128 \ # 指定权重分组的大小
   --work-dir /root/LLM//model/Shanghai_AI_Laboratory/internlm2-chat-1_8b-4bit \ # 权重量化为4bit后的模型保存路径
   --output-model-path /root/LLM//model/Shanghai_AI_Laboratory/internlm2-chat-1_8b-4bit/quantized_model.pt \ # (可选)指定输出量化模型的精确路径

请注意以下几点:

  1. lmdeploy lite auto_awq:这是一个命令行工具,用于部署和自动调整权重量化(Automatic Weight Quantization)的机器学习模型。

  2. /root/model/internlm2-chat-1_8b:这是模型文件的路径。其中,/root/model/ 是目录路径,internlm2-chat-1_8b 是模型名称,1_8b 可能代表该模型具有约1.8亿参数。

  3. –calib-dataset ‘ptb’:指定了用于校准量化模型的数据集。'ptb' 通常指的是Penn TreeBank数据集,这是一个常用的自然语言处理数据集。

  4. –calib-samples 128:定义了从校准数据集中使用的样本数量。这里使用了128个样本进行校准。

  5. –calib-seqlen 1024:指定了在校准时序列的长度,这里被设置为1024个单元。这对于文本或序列生成任务来说是一个常见的设置。

  6. –w-bits 4:定义了权重量化的位宽。这里的4表示模型权重将被量化为4位,从而减少模型大小并提高运算速度,但可能会损失一些精度。

  7. –w-group-size 128:指定了权重分组的大小,用于量化。这里每组包含128个权重。分组量化是一种常用的量化技术,可以提高量化后的模型性能。

  8. –work-dir /root/LLM/internlm2-chat-1_8b-4bit:指定了工作目录,即量化后的模型和相关文件将被保存的位置。这里,/root/LLM/internlm2-chat-1_8b-4bit 表示保存4位量化后模型的工作目录。

WebUI 交互式对话

LMDeploy 使用 gradio 开发了在线对话 demo。

# 安装依赖
pip install lmdeploy[serve]
# 启动
lmdeploy serve gradio internlm/internlm2-chat-7b

FastAPI部署

在 /root/LLM 路径下新建 demo_api.py 文件并在其中输入以下内容,粘贴代码后请及时保存文件。下面的代码有很详细的注释,大家如有不理解的地方,欢迎提出 issue。

from fastapi import FastAPI, Request
from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
import uvicorn
import json
import datetime
import torch

# 设置设备参数
DEVICE = "cuda"  # 使用CUDA
DEVICE_ID = "0"  # CUDA设备ID,如果未设置则为空
CUDA_DEVICE = f"{DEVICE}:{DEVICE_ID}" if DEVICE_ID else DEVICE  # 组合CUDA设备信息

# 清理GPU内存函数
def torch_gc():
    if torch.cuda.is_available():  # 检查是否可用CUDA
        with torch.cuda.device(CUDA_DEVICE):  # 指定CUDA设备
            torch.cuda.empty_cache()  # 清空CUDA缓存
            torch.cuda.ipc_collect()  # 收集CUDA内存碎片

# 创建FastAPI应用
app = FastAPI()

# 处理POST请求的端点
@app.post("/")
async def create_item(request: Request):
    global model, tokenizer  # 声明全局变量以便在函数内部使用模型和分词器
    json_post_raw = await request.json()  # 获取POST请求的JSON数据
    json_post = json.dumps(json_post_raw)  # 将JSON数据转换为字符串
    json_post_list = json.loads(json_post)  # 将字符串转换为Python对象
    prompt = json_post_list.get('prompt')  # 获取请求中的提示
    
    response, history = model.chat(tokenizer, prompt, history=[])
    
    now = datetime.datetime.now()  # 获取当前时间
    time = now.strftime("%Y-%m-%d %H:%M:%S")  # 格式化时间为字符串
    # 构建响应JSON
    answer = {
        "response": response,
        "status": 200,
        "time": time
    }
    # 构建日志信息
    log = "[" + time + "] " + '", prompt:"' + prompt + '", response:"' + repr(response) + '"'
    print(log)  # 打印日志
    torch_gc()  # 执行GPU内存清理
    return answer  # 返回响应

# 主函数入口
if __name__ == '__main__':
    # 加载预训练的分词器和模型
    tokenizer = AutoTokenizer.from_pretrained("/root/LLM//model/Shanghai_AI_Laboratory/internlm2-chat-1_8b", trust_remote_code=True)
    model = AutoModelForCausalLM.from_pretrained("/root/LLM//model/Shanghai_AI_Laboratory/internlm2-chat-1_8b", torch_dtype=torch.float16, trust_remote_code=True).cuda()
    model = model.eval()

    # 启动FastAPI应用
    # 用6006端口可以将autodl的端口映射到本地,从而在本地使用api
    uvicorn.run(app, host='0.0.0.0', port=6006, workers=1)  # 在指定端口和主机上启动应用

Api 部署

在终端输入以下命令启动api服务:

cd /root/LLM
python demo_api.py

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

requests 库进行调用

import requests
import json

def get_completion(prompt):
    headers = {'Content-Type': 'application/json'}
    data = {"prompt": prompt}
    response = requests.post(url='http://127.0.0.1:6006', headers=headers, data=json.dumps(data))
    return response.json()['response']

if __name__ == '__main__':
    print(get_completion('你好,你叫什么名字'))

在这里插入图片描述

<think>嗯,用户问的是如何使用LMDeploy部署大模型的具体步骤。首先,我需要回忆一下之前学过的关于LMDeploy的知识。记得引用里的内容提到过环境配置、服务部署、模型转换这些步骤。特别是引用[1]里详细说明了安装步骤和模型部署的方式,可能用户需要的是分步骤的指南。 首先,环境配置肯定是第一步。用户可能需要安装Python、LMDeploy库,可能还需要配置Conda环境。引用[1]提到要明确操作系统和安装步骤,所以应该先让用户安装Miniconda,然后创建环境,安装PyTorch和LMDeploy。这部分需要检查是否要包括CUDA的支持,因为大模型通常需要GPU加速。 接下来是模型下载。InternLM-Chat-7B这样的模型可能需要从Hugging Face或者ModelScope获取。这里需要确保用户知道如何下载模型,可能需要git lfs或者其他工具,但引用里没有详细说明下载步骤,可能需要提醒用户参考官方文档。 然后是模型转换部分,包括在线和离线转换。引用[3]提到使用不同模型进行量化,但用户可能用的是7B的模型,所以需要说明如何将HF格式转换为TurboMind格式。这里要提到lmdeploy convert命令,参数设置如model_name和model_format。 服务部署阶段,用户可能有不同的需求,比如本地对话、Gradio网页或者API服务。引用[1]和[4]提到多种部署方式,所以需要分别说明每个步骤。比如,启动API服务需要指定模型路径和端口,同时可能需要调整TP参数,根据GPU数量来设置。 模型量化部分,用户可能关心如何减小模型大小和提升速度。引用[3]提到量化需要较长时间,所以建议用户使用较小的模型进行测试。需要解释不同的量化方法,比如KV8和W4,以及如何执行这些量化命令。 最后,验证部署是否成功,可能需要运行测试脚本或者使用curl命令调用API,确保模型能正确响应。同时,用户可能遇到环境依赖问题,比如CUDA版本不匹配,或者显存不足,需要给出常见问题解答。 在思考过程中,还要注意用户可能的实际场景,比如是否在本地机器还是云服务器上部署,是否有足够的GPU资源。此外,引用[5]提到AutoDL平台,可能用户是在类似平台上操作,需要适配相关步骤。需要确保步骤清晰,命令准确,避免遗漏关键参数或配置。</think>### LMDeploy部署大模型详细步骤指南 #### 一、环境配置 1. **安装Miniconda**(推荐Python 3.10环境) ```bash wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh ``` 2. **创建虚拟环境** ```bash conda create -n lmdeploy python=3.10 -y conda activate lmdeploy ``` 3. **安装PyTorch与LMDeploy** ```bash pip install torch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 --index-url https://download.pytorch.org/whl/cu118 pip install lmdeploy[all] ``` #### 二、模型下载 以InternLM-Chat-7B为例: ```bash git clone https://www.modelscope.cn/Shanghai_AI_Laboratory/internlm2-chat-7b.git ``` #### 三、模型转换 1. **在线转换**(动态加载) ```bash lmdeploy chat /path/to/internlm2-chat-7b ``` 2. **离线转换**(生成TurboMind格式) ```bash lmdeploy convert internlm2-chat-7b --model-name internlm2-7b --model-format hf ``` #### 四、服务部署 1. **本地对话模式** ```bash lmdeploy chat ./workspace ``` 2. **网页Gradio部署** ```bash lmdeploy serve gradio ./workspace --server_name 0.0.0.0 --server_port 7860 ``` 3. **API服务部署** ```bash lmdeploy serve api_server ./workspace --server_name 0.0.0.0 --server_port 23333 --tp 1 ``` #### 五、模型量化(以W4A16为例) ```bash lmdeploy lite auto_awq /path/to/internlm2-chat-7b --calib-dataset ptb --calib-samples 128 --calib-seqlen 2048 --w-bits 4 --w-group-size 128 ``` #### 六、验证部署 ```python from lmdeploy import pipeline pipe = pipeline('./workspace') response = pipe(['你好']) print(response[0].text) ``` ### 关键参数说明 1. `--tp`:张量并行度,需与GPU数量匹配 2. `--cache-max-entry-count`:KV缓存比例,建议0.5-0.8 3. `--quant-policy`:量化策略,可选0(FP16)或4(INT4) ### 常见问题 1. **CUDA版本不匹配**:需确保CUDA版本与PyTorch对应(建议11.8+) 2. **显存不足**:可尝试量化或减小`--cache-max-entry-count` 3. **API调用示例**: ```bash curl http://localhost:23333/v1/chat/completions -H "Content-Type: application/json" -d '{"model": "internlm2-7b", "messages": [{"role": "user", "content": "你好"}]}' ``` [^1][^3][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

果粒橙_LGC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值