一、小常识
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 权重量化需要经历以下三步:
-
权重平滑:首先对语言模型的权重进行平滑处理,以便更好地进行量化。
-
模块替换 :使用
QRMSNorm
和QLinear
模块替换原模型DecoderLayer
中的RMSNorm
模块和nn.Linear
模块。lmdeploy/pytorch/models/q_modules.py
文件中定义了这些量化模块。 -
保存量化模型:完成上述必要的替换后,我们即可保存新的量化模型。
lmdeploy 提供了命令行工具 lmdeploy lite smooth_quant
实现了以上三个步骤。并且其中命令行参数 --quant-dtype
可以用来控制是进行8-bit整数还是浮点数类型的量化。更多命令行工具使用方式,请执行 lmdeploy lite smooth_quant --help
查看。
以下示例演示了进行 int8 或 fp8 的量化命令。
-
int8
bashlmdeploy lite smooth_quant internlm/internlm2_5-7b-chat --work-dir ./internlm2_5-7b-chat-int8 --quant-dtype int8
-
fp8
cpplmdeploy 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