大模型部署参数说明
部署和运行大语言模型(LLM)需要正确配置各种启动参数,这些参数直接影响模型的显存占用、推理性能和稳定性。本文档详细介绍 vLLM、Transformers 等主流推理框架的部署参数配置。
部署框架概览
一、vLLM 启动参数详解
vLLM 是目前最流行的高性能 LLM 推理服务框架,采用 PagedAttention 技术优化显存管理。
基本启动命令结构
python -m vllm.entrypoints.openai.api_server \
--model <model_path> \
[其他参数...]1. 模型与硬件相关参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--model | str | 必填 | 模型路径或 HuggingFace ID(如 Qwen/Qwen2.5-7B-Instruct) |
--tokenizer | str | 同 model | Tokenizer 路径(可单独指定) |
--trust-remote-code | bool | False | 是否信任远程代码(自定义模型通常需要开启) |
--dtype | str | auto | 模型数据类型:auto/half/float16/bfloat16/float32 |
--tensor-parallel-size | int | 1 | 张量并行度(多GPU时使用) |
--pipeline-parallel-size | int | 1 | 流水线并行度 |
dtype 选择指南:
# 大多数 GPU 推荐 bfloat16(A100/H100/RTX30+)
--dtype bfloat16
# 较老的 GPU 使用 float16
--dtype float16
# 自动选择(推荐)
--dtype auto2. 显存管理参数(关键!)
--max-model-len / --max-seq-len
最大序列长度:控制模型能处理的最大上下文长度(含输入+输出)。
# 默认值取决于模型配置
--max-model-len 8192 # 最大支持 8K tokens 上下文
--max-model-len 32768 # 支持 32K tokens(需更多显存)
--max-model-len 128000 # 支持 128K tokens(超大显存需求)⚠️ OOM 高危参数:此值越大,KV Cache 占用显存越多!
--gpu-memory-utilization
GPU 显存利用率:控制 vLLM 可使用的 GPU 显存比例。
# 常用值范围 0.0-1.0
--gpu-memory-utilization 0.9 # 使用90%显存(默认,激进)
--gpu-memory-utilization 0.85 # 保守一些,留余量给系统
--gpu-memory-utilization 0.7 # 非常保守,适合多进程场景OOM 调优建议:
- 出现 OOM → 降低此值(0.9→0.85→0.8)
- 多个服务共享同一 GPU → 设置为 0.5-0.7
- 单独占用整张卡 → 可设 0.9-0.95
--max-num-batched-tokens
批量 token 上限:一次迭代中处理的最大 token 数。
--max-num-batched-tokens 2048 # 保守
--max-num-batched-tokens 8192 # 平衡(默认)
--max-num-batched-tokens 32768 # 高吞吐--max-num-seqs
最大并发请求数:同时处理的请求数量。
--max-num-seqs 64 # 默认值
--max-num-seqs 256 # 高并发场景
--max-num-seqs 16 # 低延迟优先3. KV Cache 参数(高级)
--block-size
KV Cache 分块大小:PagedAttention 的内存页大小。
--block-size 16 # 默认,适用于大多数情况
--block-size 8 # 更精细的分配,减少浪费但增加元数据开销--enable-prefix-caching
前缀缓存:自动缓存重复的前缀(system prompt 等),大幅提升效率。
--enable-prefix-caching # 开启(强烈推荐生产环境使用)适用场景:所有请求有相同的 system prompt 时效果显著。
--num-lookahead-slots
预计算槽位数:解码时提前计算的 slot 数量。
--num-lookahead-slots 0 # 关闭(默认)
--num-lookahead-slots 64 # 开启 speculative decoding4. 量化相关参数
--quantization
量化方法:加载量化模型。
# AWQ 量化(4-bit,质量好)
--quantization awq
# GPTQ 量化(4-bit)
--quantization gptq
# FP8 量化(H100/A800 支持)
--quantization fp8
# BitsAndBytes(NF4/QLoRA)
--quantization bitsandbytes--load-format
加载格式:控制模型权重加载方式。
--load-format auto # 自动检测
--load-format pt # PyTorch 格式
--load-format safetensors # SafeTensors 格式(更快更安全)
--load-format dummy # 仅测试不加载权重
--load-format sharded_stateful # 分片加载(超大模型)
--load-format mmhf # Megatron 格式--enforce-eager
强制 eager 模式:禁用 CUDA Graph 加速。
--enforce-eager # 开发调试用,关闭后性能下降但更容易排查问题5. 性能与调度参数
| 参数 | 默认值 | 说明 |
|---|---|---|
--swap-space | 4 (GB) | CPU 内存作为 KV Cache 的 swap 空间 |
--max-log-len | 无限 | 日志中打印的最大 prompt 长度 |
--disable-log-stats | False | 禁用统计日志输出 |
--log-level | INFO | 日志级别:DEBUG/INFO/WARNING/ERROR |
swap-space 详解:
# 当 GPU 显存不足时,将部分 KV Cache 卸载到 CPU 内存
--swap-space 8 # 使用 8GB CPU 内存做交换空间
--swap-space 0 # 禁用交换(纯 GPU 模式)
--swap-space 16 # 大容量交换(适合长上下文)何时增大 swap-space:
- ✅ 处理超长上下文(>32K tokens)
- ✅ GPU 显存有限但 CPU 内存充足
- ✅ 允许一定程度的延迟换取更大容量
6. 服务端参数
| 参数 | 默认值 | 说明 |
|---|---|---|
--host | 0.0.0.0 | 监听地址 |
--port | 8000 | 监听端口 |
--api-key | None | API 密钥认证 |
--enable-auto-tool-choice | ToolCall 模块 | 启用自动工具选择 |
--tool-call-parser | mistral | 工具调用解析器 |
--task | generate | 任务类型:generate/encode/embed/spawn |
--served-model-name | model 名称 | 对外暴露的模型名称 |
完整启动示例:
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-7B-Instruct \
--trust-remote-code \
--dtype bfloat16 \
--max-model-len 32768 \
--gpu-memory-utilization 0.9 \
--max-num-seqs 128 \
--enable-prefix-caching \
--swap-space 8 \
--host 0.0.0.0 \
--port 8000 \
--api-key your-api-key-here二、HuggingFace Transformers 推理参数
使用 Transformers 库直接运行模型时的常用参数。
基础推理代码
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
import torch
# 加载模型
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen2.5-7B-Instruct",
torch_dtype=torch.bfloat16,
device_map="auto", # 自动设备映射
trust_remote_code=True,
)
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B-Inference")
# 创建管道
pipe = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
)关键加载参数
device_map 设备映射
# 自动映射到可用 GPU
device_map="auto"
# 手动指定
device_map={"": 0} # 全部放到 GPU 0
device_map="balanced" # 均衡分布到多个 GPU
device_map={"layer.0": 0, "layer.1": 1} # 精细控制每层位置
# CPU 卸载(低显存方案)
device_map="auto"
offload_folder="./offload" # 卸载到此目录torch_dtype 数据类型
torch_dtype=torch.float16 # FP16,广泛兼容
torch_dtype=torch.bfloat16 # BF16,推荐 A100+/RTX30+
torch_dtype=torch.float32 # FP32,精度最高但慢且占显存
torch_dtype="auto" # 自动选择low_cpu_mem_usage 低 CPU 内存占用
model = AutoModelForCausalLM.from_pretrained(
...,
low_cpu_mem_usage=True, # 减少加载时的 CPU 内存峰值
)量化加载参数
BitsAndBytes (4-bit/8-bit)
from transformers import BitsAndBytesConfig
# 4-bit NF4 量化(推荐)
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # NormalFloat 4-bit
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True, # 双重量化,提升精度
)
# 8-bit 量化
bnb_config = BitsAndBytesConfig(
load_in_8bit=True,
llm_int8_threshold=6.0, # 离散化阈值
)
model = AutoModelForCausalLM.from_pretrained(
...,
quantization_config=bnb_config,
)AutoGPTQ (GPTQ 4-bit)
from transformers import AutoModelForCausalLM, GPTQConfig
# 量化配置
gptq_config = GPTQConfig(
bits=4, # 3/4/8 bit
dataset="c4", # 校准数据集
group_size=128, # 通道分组大小
)
# 加载已量化模型
model = AutoModelForCausalLM.from_pretrained(
"model-gptq-path",
device_map="auto",
)推理生成参数
outputs = model.generate(
input_ids,
max_new_tokens=512, # 最大生成长度
do_sample=True, # 采样模式(False 为贪婪解码)
temperature=0.7, # 温度
top_p=0.9, # 核采样
top_k=50, # Top-K 采样
repetition_penalty=1.1, # 重复惩罚
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.eos_token_id,
)三、常见 OOM 问题与解决方案
OOM(Out Of Memory)是大模型部署中最常见的问题。以下是系统化的排查和解决流程。
OOM 问题诊断流程
方案一:使用量化(最有效)
显存节省对比(以 7B 模型为例):
| 方法 | 显存占用 | 相比 FP16 | 质量损失 |
|---|---|---|---|
| FP16/BF16 | ~14 GB | 基准 | 无 |
| INT8 (BitsAndBytes) | ~7.5 GB | -47% | 极小 |
| INT4 (NF4/GPTQ/AWQ) | ~4.5 GB | -68% | 小 |
| FP8 | ~7.5 GB | -47% | 极小(需 H100) |
| EXL2 (2-bit) | ~3 GB | -79% | 中等 |
vLLM 启动量化模型:
# AWQ 量化(推荐,质量好)
python -m vllm.entrypoints.openai.api_server \
--model TheBloke/Llama-2-7B-Chat-AWQ \
--quantization awq \
--max-model-len 8192
# GPTQ 量化
python -m vllm.entrypoints.openai.api_server \
--model TheBloke/Llama-2-7B-Chat-GPTQ \
--quantization gptq
# FP8 量化(H100/A800)
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Meta-Llama-3-8B-Instruct-FP8 \
--quantization fp8Transformers 量化加载:
from transformers import BitsAndBytesConfig
config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)
model = AutoModelForCausalLM.from_pretrained(
"model_name",
quantization_config=config,
device_map="auto",
)方案二:调整 vLLM 显存参数
场景 1:单卡部署 7B 模型出现 OOM
# ❌ 初始配置(可能 OOM)
--gpu-memory-utilization 0.95
--max-model-len 16384
# ✅ 调整后(逐步尝试)
--gpu-memory-utilization 0.90 # 第一步:降低利用率
--max-model-len 8192 # 第二步:缩短上下文
--max-num-seqs 32 # 第三步:减少并发场景 2:单卡 24GB 部署 13B/14B 模型
# 24GB 显卡(如 RTX 4090/3090/A5000)运行 13B 模型
# 方案 A:4-bit 量化 + 保守参数
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-13B-Instruct-AWQ \
--quantization awq \
--dtype half \
--gpu-memory-utilization 0.88 \
--max-model-len 4096 \
--max-num-seqs 16
# 方案 B:启用 swap 到 CPU
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-13B-Instruct-GPTQ \
--quantization gptq \
--gpu-memory-utilization 0.92 \
--max-model-len 8192 \
--swap-space 16 \ # 用 16GB CPU 内存补充
--max-num-seqs 8场景 3:超长上下文导致 OOM
# 需求:32K 上下文,但显存不够
# ❌ 直接设置会 OOM
--max-model-length 32768
# ✅ 组合策略
--max-model-len 32768 \
--gpu-memory-utilization 0.80 \ # 保留更多余量
--swap-space 24 \ # 大量使用 CPU swap
--max-num-seqs 4 \ # 低并发
--enable-prefix-caching # 缓存复用方案三:CPU Offloading(极端情况)
当 GPU 显存严重不足时,可将部分层卸载到 CPU。
使用 Accelerate 进行 offloading
from accelerate import init_empty_weights
from accelerate.utils import load_and_quantize_model
from transformers import AutoConfig, AutoModelForCausalLM
config = AutoConfig.from_pretrained("model-name")
with init_empty_weights():
model = AutoModelForCausalLM.from_config(config)
# 加载并自动 offload
model = load_and_quantize_model(
"model-name",
device_map="auto",
max_memory={0: "12GiB", "cpu": "60GiB"}, # GPU 12GB + CPU 60GB
)vLLM 不支持 CPU Offloading 的替代方案
如果必须使用 vLLM 但显存不够:
- 换用更小的模型(7B → 3B → 1.8B)
- 使用 llama.cpp(支持 CPU+GPU 混合推理)
- 使用 OLLAMA(自动管理资源)
方案四:多 GPU 张量并行
当单卡无法容纳模型时,使用多卡张量并行。
# 2 卡部署 70B 模型
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-72B-Instruct \
--tensor-parallel-size 2 \ # 使用 2 张 GPU
--gpu-memory-utilization 0.92 \
--max-model-len 8192
# 4 卡部署超大模型
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Meta-Llama-3.1-405B-Instruct \
--tensor-parallel-size 4 \
--gpu-memory-utilization 0.95 \
--max-model-len 4096各规模模型所需 GPU 参考:
| 模型规模 | FP16 所需显存 | INT4 所需显存 | 推荐配置 |
|---|---|---|---|
| 7B | ~14 GB | ~4.5 GB | 1× RTX 3090/4090 (24GB) |
| 14B | ~28 GB | ~8 GB | 1× A6000 (48GB) 或 2×3090 |
| 32B | ~64 GB | ~18 GB | 2× A100 (80GB) 或 4×3090 |
| 70B | ~140 GB | ~38 GB | 2× A100 (80GB) 或 4×A6000 |
| 405B | ~810 GB | ~220 GB | 8× H100 (80GB) |
四、其他框架部署参数
llama.cpp 参数
llama.cpp 是轻量级推理引擎,支持 CPU 和 GPU 混合推理。
./llama-server \
-m ./models/qwen2.5-7b-q4_k_m.gguf \ # GGUF 模型文件
-c 8192 \ # 上下文长度
--threads 8 \ # CPU 线程数
-ngl 35 \ # GPU 层数(-1=全部offload)
-b 512 \ # batch size
-np 4 \ # 并行提示数量
--host 0.0.0.0 \
--port 8080关键参数说明:
-ngl(n-gpu-layers):卸载到 GPU 的层数,-1 表示全部-c(ctx-size):上下文窗口大小-b(batch-size):批处理大小--gpu-split:多 GPU 显存分配比例(如0,1表示均分)
GGUF 量化格式对比:
| 后缀 | 类型 | 大小 | 质量 |
|---|---|---|---|
q4_0 | 4-bit | 小 | 一般 |
q4_k_m | 4-bit k-means | 中 | 好(推荐) |
q5_k_m | 5-bit k-means | 中大 | 很好 |
q6_k | 6-bit | 大 | 极好 |
q8_0 | 8-bit | 很大 | 接近原始 |
f16 | FP16 | 最大 | 完全无损 |
OLLAMA 参数
OLLAMA 是简化的大模型运行工具。
# 创建自定义 Modelfile
cat > Modelfile << 'EOF'
FROM ./qwen2.5-7b-q4_k_m.ggUF
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER num_ctx 8192 # 上下文长度
PARAMETER num_batch 512 # batch size
PARAMETER num_thread 8 # CPU线程
SYSTEM """你是一个有用的助手。"""
EOF
# 运行
ollama create mymodel -f Modelfile
ollama run mymodel
# 运行时指定 GPU
CUDA_VISIBLE_DEVICES=0 ollama serve环境变量调优:
# 显式控制显存
OLLAMA_MAX_LOADED_MODELS=1 # 同时加载的最大模型数
OLLAMA_NUM_PARALLEL=4 # 并行处理数
OLLAMA_MAX_QUEUE=512 # 请求队列长度
OLLAMA_KEEP_ALIVE=5m # 模型保活时间
# GPU 控制
OLLAMA_GPU_MEMORY_OVERRIDE=24 # 强制限制显存使用(GB)
CUDA_VISIBLE_DEVICES=0,1 # 指定使用的 GPUText Generation WebUI (Oobabooga)
基于 Gradio 的 Web UI,支持多种后端。
# 启动命令示例
python server.py \
--model Qwen2.5-7B \
--loader ExLlamaV2 \ # 加载器选择
--gpu-memory 20GiB \ # 限制显存使用
--context-size 8192 \
--threads 8 \
--bf16 \ # 使用 BF16
--auto-devices \ # 自动分配设备
--listen-port 7860常用加载器(Loader):
| 加载器 | 适用场景 | 特点 |
|---|---|---|
Transformers | 通用 | 最兼容,速度一般 |
AutoGPTQ | GPTQ 模型 | 快速 |
ExLlamaV2 | EXL2/GPTQ | 最快,显存效率高 |
llama.cpp | GGUF 模型 | 支持混合推理 |
五、性能调优最佳实践
1. 显存监控与诊断
# 实时监控 GPU 状态
watch -n 1 nvidia-smi
# 详细显存使用分析
nvitop # 更友好的界面
# PyTorch 显存分析
python -c "
import torch
print('CUDA available:', torch.cuda.is_available())
print('Device count:', torch.cuda.device_count())
print('Current device:', torch.cuda.current_device())
print('Memory allocated:', torch.cuda.memory_allocated() / 1024**3, 'GB')
print('Memory reserved:', torch.cuda.memory_reserved() / 1024**3, 'GB')
"2. 吞吐量 vs 延迟权衡
不同场景的参数配置模板:
🎯 场景 A:在线聊天助手(低延迟优先)
--max-model-len 4096 \
--max-num-seqs 32 \
--max-num-batched-tokens 2048 \
--gpu-memory-utilization 0.85📊 场景 B:批量文本处理(高吞吐优先)
--max-model-len 8192 \
--max-num-seqs 256 \
--max-num-batched-tokens 16384 \
--gpu-memory-utilization 0.92 \
--enable-prefix-caching🔬 场景 C:长文档分析(超长上下文)
--max-model-len 32768 \
--max-num-seqs 8 \
--swap-space 24 \
--gpu-memory-utilization 0.80 \
--enable-prefix-caching💰 场景 D:资源受限环境(最小显存)
--quantization awq \
--gpu-memory-utilization 0.88 \
--max-model-len 2048 \
--max-num-seqs 8 \
--swap-space 83. 生产环境检查清单
- [ ] 启用 prefix caching(相同 system prompt 场景必开)
- [ ] 设置合理的 max-model-len(按业务需求,不要盲目设大)
- [ ] 配置 API Key 认证
- [ ] 设置 GPU memory utilization ≤ 0.9(留余量应对碎片)
- [ ] 监控 GPU 显存使用率(告警阈值建议 90%)
- [ ] 配置日志级别和持久化
- [ ] 压力测试验证最大并发能力
- [ ] 准备 OOM 恢复策略(自动重启、降级等)
4. 常见问题速查表
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
CUDA out of memory | 显存不足 | 量化 / 降低 gpu-mem-util / 减少 max-model-len |
RuntimeError: cuDNN error | 显存碎片 | 重启服务 / 降低 utilization |
Invalid block request | KV Cache 不足 | 增加 swap-space / 减少并发 |
Too many requests | 并发超限 | 增加 max-num-seqs / 扩容 |
Model loading timeout | 模型太大 | 检查网络 / 使用 sharded loading |
ValueError: dtype mismatch | 类型不匹配 | 明确指定 --dtype |
