目录

vllm

🧾一、参数解读

vLLM 是用于 LLM 高效推理和服务的高性能框架。以下是其关键启动参数(vllm serve 或 python -m vllm.entrypoints.openai.api_server)的分类详解:

模型与推理基础配置


GPU 资源与并行度


量化与数据类型


性能与调度调优


服务与 API 配置


典型启动命令示例

📝二、张量并行参数取值范围

--tensor-parallel-size(简称 -tp)的取值主要受以下 3 个核心规则限制:

1. 必须能被模型的注意力头数整除

这是最硬性的数学限制。张量并行会将模型的 Attention 头(Attention Heads)均匀切分到各个 GPU 上。

*例子*:若某模型的 KV Heads 为 8,则 `-tp` 最大只能设为 8(即便总 Head 数是 64),且只能取 1、2、4、8。

2. 强烈建议为 2 的幂次方(Power of 2)

虽然理论上只要能整除头数即可(如 6 或 12),但在实际硬件通信中:

3. 尽量控制在单个 NUMA 节点 / 单机(Single Node)内

-tp 在每生成一个 Token 时,跨卡之间都需要进行多次 All-Reduce 集合通信,对传输带宽极度敏感。

🤴三、注意力头(Attention Head)

注意力头(Attention Head) 是 Transformer 模型中 Self-Attention(自注意力机制)的核心组成模块。

如果把模型注意力机制比作“看文章”,单个注意力头只能从一种视角去理解文本(例如关注词语之间的语法关系);而多头注意力(Multi-Head Attention) 允许模型并行使用多个“头”,同时从不同的维度观察上下文(例如头 A 关注主谓关系,头 B 关注代词指代,头 C 关注远距离语义关联)。最后将所有头的输出拼接在一起,形成对文本更全面的理解。


1. 为什么张量并行(`-tp`)与头数绑定?

在 GPU 矩阵计算中,多头注意力机制的权重矩阵是按头(Head)切分并分配给不同 GPU 的。


2. 如何获取模型的注意力头数?

不需要加载完整模型权重,有以下几种快速获取方式:

方法一:直接查看模型的配置文件(最快、最常用)

在 Hugging Face 或本地模型目录中,找到 config.json 文件:

  1. 打开 config.json。
  2. 查找以下两个核心字段: * num_attention_heads(或 n_head):模型的总注意力头数(Q 头数)。 * num_key_value_heads:KV 头数(针对 GQA/MQA 模型,-tp 必须能被此参数整除)。

例如(Llama-3-8B 的 config.json 截取):

snippet.json
{
  "num_attention_heads": 32,
  "num_key_value_heads": 8
}

在此配置下,-tp 的取值必须能够被 8 整除(即可以取 1、2、4、8)。


方法二:使用 Python 代码读取 Config

无需下载几百吉字节的模型权重文件,只需加载配置对象即可:

snippet.python
from transformers import AutoConfig
 
# 替换为你的模型名称或本地路径
config = AutoConfig.from_pretrained("meta-llama/Meta-Llama-3-8B-Instruct")
 
# 获取总 Attention 头数 (Query Heads)
num_heads = getattr(config, "num_attention_heads", None)
 
# 获取 KV 头数 (Key/Value Heads, GQA 模型关键参数)
num_kv_heads = getattr(config, "num_key_value_heads", num_heads)
 
print(f"总注意力头数 (num_attention_heads): {num_heads}")
print(f"KV 注意力头数 (num_key_value_heads): {num_kv_heads}")

方法三:通过 vLLM 启动日志查看

如果你直接运行 vllm serve 命令,当设置的 -tp 无法整除头数时,vLLM 会在终端控制台报错并直接打印出模型的头数信息:

snippet.bash
ValueError: Total number of attention heads (32) must be divisible by tensor parallel size (3).