大模型分布式推理和量化部署

一、小常识

1、计算大模型占用多少显存

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

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

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

所以我们需要大于14GB的显存。注意14GB单纯是大模型启动所占的显存大小,还有推理过程的输入和输出,kv缓存,推理框架运行等,都需要消耗显存。

2、大模型推理

大模型已经训练好了,现在拿它来"用"------让它预测、生成或分类。比如你用 ChatGPT 聊天、用图像模型生成图像,这些都是大模型推理阶段。

二、分布式推理的场景

1.单卡显存不足:如QwQ-32B(320亿参数)需在双A6000显卡上部署。

2.高并发请求:在线服务需同时处理多用户请求,分布式推理通过连续批处理(Continuous Batching)提升效率。

三、vLLM的分布式推理实现

vLLM通过PagedAttention和张量并行技术优化显存管理和计算效率,支持多GPU推理。核心机制:

  • 张量并行:通过tensor_parallel_size参数指定GPU数量,模型自动拆分到多卡。
  • PagedAttention:将注意力机制的键值(KV)缓存分块存储,减少显存碎片,提升利用率。
  • 连续批处理:动态合并不同长度的请求,减少GPU空闲时间。

官方文档:https://docs.vllm.ai/en/latest/serving/distributed_serving.html

中文文档(非官方):https://vllm.hyper.ai/docs/serving/distributed-inference-and-serving

vLLM分布式推理实战

1、要使用 LLM 类运行多 GPU 推理,将 tensor_parallel_size 参数设置为要使用的 GPU 数量。例如,要在 4 个 GPU 上运行推理:

python 复制代码
from vllm import LLM
llm = LLM(`facebook/opt-13b`, tensor_parallel_size=4)
output = llm.generate(`San Franciso is a`)

2、要运行多 GPU 服务,请在启动服务器时传入 --tensor-parallel-size 参数。例如,要在 4 个 GPU 上运行 API 服务器:

bash 复制代码
vllm serve facebook/opt-13b \
    --tensor-parallel-size 4

3、还可以另外指定 --pipeline-parallel-size 以启用管道并行性。例如,要在 8 个 GPU 上运行具有管道并行性和张量并行性的 API 服务器:

bash 复制代码
vllm serve gpt2 \
    --tensor-parallel-size 4 \
    --pipeline-parallel-size 2

四、LMDeploy的分布式推理实现

LMDeploy是专为高效部署设计的框架,支持量化技术分布式推理,尤其适合低显存环境。核心机制:

  • 张量并行:通过--tp参数指定GPU数量,支持多卡协同计算。
  • KV Cache量化:支持INT8/INT4量化,降低显存占用。
  • 动态显存管理:通过--cache-max-entry-count控制KV缓存比例。

官网网址:https://lmdeploy.readthedocs.io/zh-cn/latest/quantization/kv_quant.html

1、LMDeploy分布式推理命令

LMDeploy部署命令:

bash 复制代码
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

命令说明:

lmdeploy serve api_server:这个命令用于启动API服务器。

/root/models/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数量)。

2、INT4 模型量化

LMDeploy模型量化的操作与LLaMA Factory的导出量化类似。 LMDeploy 量化模块目前仅支持 AWQ 量化算法。 (离线量化)

可用于 AWQ/GPTQ INT4 推理的 NVIDIA GPU 包括:

  • V100(sm70): V100

  • Turing(sm75): 20 系列,T4

  • Ampere(sm80,sm86): 30 系列,A10, A16, A30, A100

  • Ada Lovelace(sm89): 40 系列

仅需执行一条命令,就可以完成模型量化工作。量化结束后,权重文件存放在 $WORK_DIR 下。

bash 复制代码
export HF_MODEL=/root/autodl-tmp/llm/Qwen/Qwen1.5-1.8B-Chat
export WORK_DIR=/root/autodl-tmp/llm/Qwen/Qwen1.5-1.8B-Chat-4bit

lmdeploy lite auto_awq \
   $HF_MODEL \
  --calib-dataset 'ptb' \
  --calib-samples 128 \
  --calib-seqlen 2048 \
  --w-bits 4 \
  --w-group-size 128 \
  --batch-size 1 \
  --work-dir $WORK_DIR

注意:

(1)执行该命令需要科学上网,因为需要从hugging faces下载数据集ptb 。

(2)--work-dir 参数带有模型名字,就像上面的例子展示的那样。这样在推理时,就不用指定对话模板了。因为推理接口会以模糊搜索方式,选出和 --work-dir 近似的对话模板。

(3)量化时出现 Out of Memory 显存不够:可以通过减小传参 --calib-seqlen,增大传参 --calib-samples,并使用 --batch-size 为 1。

(4)量化时,无法链接huggingface并下载数据集。也可以尝试使用镜像,export HF_ENDPOINT=https://hf-mirror.com

启动推理服务

bash 复制代码
lmdeploy serve api_server /root/autodl-tmp/llm/Qwen/Qwen1.5-1.8B-Chat-4bit --backend turbomind --model-format awq

一定要带上--model-format awq参数,表示 大模型是经过awq量化过的。

3、W8A8 LLM 模型部署

W8A8 是在 神经网络模型量化(Quantization) 中的一个常见术语,它表示:

📦 W8A8 = Weights 8-bit + Activations 8-bit

也就是:

  • W8 :模型的 权重(Weights) 被量化为 8位整数(int8)

  • A8 :模型的 激活值(Activations) 也被量化为 8位整数(int8)

LMDeploy 提供了使用 8-bit 整数(INT8)和浮点数(FP8)对神经网络模型进行量化和推理的功能。(离线量化)

可用于 INT8 和 FP8 推理的 NVIDIA GPU 分别为:

  • INT8

    • V100(sm70): V100

    • Turing(sm75): 20 series, T4

    • Ampere(sm80,sm86): 30 series, A10, A16, A30, A100

    • Ada Lovelace(sm89): 40 series

    • Hopper(sm90): H100

  • FP8

    • Ada Lovelace(sm89): 40 series

    • Hopper(sm90): H100

进行 8-bit 权重量化需要经历以下三步:

  1. 权重平滑:首先对语言模型的权重进行平滑处理,以便更好地进行量化。

  2. 模块替换 :使用 QRMSNormQLinear 模块替换原模型 DecoderLayer 中的 RMSNorm 模块和 nn.Linear 模块。lmdeploy/pytorch/models/q_modules.py 文件中定义了这些量化模块。

  3. 保存量化模型:完成上述必要的替换后,我们即可保存新的量化模型。

lmdeploy 提供了命令行工具 lmdeploy lite smooth_quant 实现了以上三个步骤。并且其中命令行参数 --quant-dtype 可以用来控制是进行8-bit整数还是浮点数类型的量化。更多命令行工具使用方式,请执行 lmdeploy lite smooth_quant --help 查看。

以下示例演示了进行 int8 或 fp8 的量化命令。

  • int8

    bash 复制代码
    lmdeploy lite smooth_quant internlm/internlm2_5-7b-chat --work-dir ./internlm2_5-7b-chat-int8 --quant-dtype int8
  • fp8

    cpp 复制代码
    lmdeploy lite smooth_quant internlm/internlm2_5-7b-chat --work-dir ./internlm2_5-7b-chat-fp8 --quant-dtype fp8

    启动量化后的模型

bash 复制代码
lmdeploy serve api_server ./internlm2_5-7b-chat-int8 --backend pytorch

4、Key-Value(KV) Cache 量化

LMDeploy 支持在线 kv cache int4/int8 量化,量化方式为 per-head per-token 的非对称量化。原来的 kv 离线量化方式移除。(推荐使用该量化方式)

从直观上看,量化 kv 有利于增加 kv block 的数量。与 fp16 相比,int4/int8 kv 的 kv block 分别可以增加到 4 倍和 2 倍。这意味着,在相同的内存条件下,kv 量化后,系统能支撑的并发数可以大幅提升,从而最终提高吞吐量。

但通常,量化会伴随一定的模型精度损失。官方使用了 opencompass 评测了若干个模型在应用了 int4/int8 量化后的精度,int8 kv 精度几乎无损,int4 kv 略有损失。

LMDeploy kv 4/8 bit 量化和推理支持如下 NVIDIA 显卡型号:

  • volta 架构(sm70): V100

  • 图灵架构(sm75):20系列、T4

  • 安培架构(sm80,sm86):30系列、A10、A16、A30、A100

  • Ada Lovelace架构(sm89):40 系列

  • Hopper 架构(sm90): H100, H200

总结来说,LMDeploy kv 量化具备以下优势:

  • 量化不需要校准数据集
  • 支持 volta 架构(sm70)及以上的所有显卡型号
  • kv int8 量化精度几乎无损,kv int4 量化精度在可接受范围之内
  • 推理高效,在 llama2-7b 上加入 int8/int4 kv 量化,RPS 相较于 fp16 分别提升近 30% 和 40%

接下来,我们以 internlm2-chat-7b 模型为例,介绍 kv 量化和推理的若干应用。而在此之前,请安装 lmdeploy。

操作实战

通过 LMDeploy 应用 kv 量化非常简单,只需要设定 quant_policy 参数。

LMDeploy 规定 qant_policy=4 表示 kv int4 量化,quant_policy=8 表示 kv int8 量化。

启动命令:

bash 复制代码
lmdeploy serve api_server /root/autodl-tmp/llm/Qwen/Qwen1.5-1.8B-Chat --quant-policy 8
相关推荐
L_cl5 分钟前
【NLP 58、利用trl框架训练LLM】
人工智能·深度学习·自然语言处理
uncle_ll10 分钟前
李宏毅NLP-2-语音识别part1
人工智能·自然语言处理·nlp·语音识别·李宏毅
DWQY10 分钟前
pytorch查询字典、列表维度
人工智能·pytorch·python
_一条咸鱼_20 分钟前
揭秘 AI 副业:开启财富自由新通道
人工智能
L_cl23 分钟前
【NLP 59、大模型应用 —— BPE 算法】
人工智能·自然语言处理
西柚小萌新27 分钟前
【深度学习:理论篇】--Pytorch进阶教程
人工智能·pytorch·深度学习
_一条咸鱼_1 小时前
深入剖析 AI 大模型的反向 TOT 原理
人工智能·深度学习·机器学习
Panesle1 小时前
开源的7B参数OCR视觉大模型:RolmOCR
人工智能·开源·大模型·ocr
Alpha汇股志1 小时前
英国股票实时API 对比:iTick的差异化优势解析
大数据·人工智能·开源·业界资讯
西电研梦2 小时前
难度偏低,25西电人工智能学院821、833、834考研录取情况
人工智能·考研·面试·西安电子科技大学·考研录取