vllm加速推理模型官方学习文档笔记
vLLM是一个高性能LLM推理系统,其核心优势在于高效的KV缓存管理、智能分批调度和多进程解耦架构。报告详细梳理了vLLM的安装部署、架构原理和性能优化方法。在安装方面,vLLM支持多种GPU/CPU平台,但对Windows仅限WSL方式;部署提供从Docker到Kubernetes等多种方案。架构上采用API Server、Engine Core和GPU Worker多进程设计,通过ZMQ通信实
掌握 vLLM 以提升系统性能与高性能推理
执行摘要
本报告基于 vLLM 与 Milvus 两个官方站点的文档,系统梳理从安装、架构理解到性能调优与 RAG 集成的全链路要点。citeturn16search4turn22view0
vLLM 的性能核心来自“面向服务的调度 + 高效 KV cache 管理 + 持续/智能分批 + 编译/图优化(如 torch.compile、CUDA Graphs 等)”,并通过多进程架构将 API 前端、调度/缓存、GPU 执行解耦。citeturn8view0turn8view1turn18search11
调优方法论围绕“吞吐/延迟权衡、KV cache 空间与抢占、批处理上限(tokens/seqs)、并行策略(TP/PP/DP/EP)、低精度/量化与 I/O”展开,并配套可复制的命令、配置与基准测试方法。citeturn3view3turn11view4turn3view2turn13view2
在检索增强生成(RAG)场景中,Milvus 侧的索引选择、过滤/混合检索、缓存预热与淘汰策略会显著影响端到端延迟与稳定性;与 vLLM 的并发和批处理策略需要联合设计。citeturn22view3turn22view0turn22view1turn15view0
安装、环境与部署选项
支持的平台与运行边界
vLLM 的安装文档将硬件平台拆分为 GPU(NVIDIA CUDA / AMD ROCm / Intel XPU)、CPU(x86 / ARM AArch64 / Apple silicon / IBM Z)等路径,并分别给出环境与安装方式。citeturn16search4turn4view0turn6view0
对“高性能推理/在线服务”而言,GPU 安装页明确要求 OS 为 Linux,并给出 Python 3.10–3.13 的兼容范围;同时以“GPU 计算能力 7.0+(如 V100、T4、RTX20xx、A100、L4、H100 等)”作为 NVIDIA CUDA 路径的硬件门槛。citeturn4view0
CPU 安装页则给出更宽的体系结构覆盖:例如 x86 推荐 avx512f(或 avx2 但“特性受限”),ARM 要求 NEON,Apple silicon 需要较新的 macOS/Xcode 工具链等。citeturn6view0turn19search3
关于 Windows:GPU 安装页写明 vLLM 不原生支持 Windows;若需在 Windows 上运行,可使用 WSL 等方式(或社区 fork)。citeturn4view0
GPU 环境:CUDA、驱动、二进制兼容与 NCCL
vLLM GPU 安装页强调:为了高性能,vLLM 需要编译大量 CUDA 内核,因此与 CUDA/PyTorch 版本(甚至同版本不同构建配置)存在二进制兼容性约束;推荐使用“全新环境”安装,若 CUDA 版本不同或希望复用既有 PyTorch,则需要从源码构建。citeturn4view2
在 CUDA 版本上,稳定版 GPU 安装页写明:vLLM 二进制当前默认以 CUDA 12.9 编译,并提供 CUDA 12.8、13.0 等变体 wheel;同时指出 NVIDIA Blackwell(B200/GB200)需要至少 CUDA 12.8。citeturn3view0turn4view2
在 NCCL 方面,有三类与“稳定性/性能”直接相关的官方提示:
- GPU 安装页指出:通过 conda 安装的 PyTorch 可能会静态链接 NCCL,导致 vLLM 在使用 NCCL 时出现问题。citeturn4view2
- 环境变量文档提供
VLLM_NCCL_SO_PATH(显式指定 NCCL so 文件路径)以及CUDA_HOME、LD_LIBRARY_PATH等定位机制。citeturn6view1turn16search5 - Troubleshooting 页面记录:旧版本 vLLM 曾因 NCCL 的某些问题设置过
NCCL_CUMEM_ENABLE=0以避免挂起/崩溃,但随着 NCCL 2.22.3 修复,该覆盖在新版本中已移除以便启用性能优化;另给出 PCIe 机器的 NCCL 报错与NCCL_CUMEM_HOST_ENABLE=0等缓解建议。citeturn6view2
CUDA/cuDNN:文档可验证的部分与“文档未说明”
vLLM 文档在“环境采集”模块中包含 get_cudnn_version(),用于枚举 libcudnn.so(或 Windows/macOS 场景的 cudnn DLL/路径)以收集环境信息。citeturn16search0turn16search20
但就“必须安装何种 cuDNN 版本、是否需要单独安装 cuDNN”等硬性要求,vLLM 安装文档并未给出明确版本约束或强制项:文档未说明。citeturn4view2turn16search0
安装方式:Python 环境、预编译 wheel 与从源码构建
GPU 安装页推荐使用 uv 管理 Python 环境,并给出安装 vLLM 的示例命令:
uv pip install vllm --torch-backend=auto(自动按驱动选择 PyTorch 索引)- 或用
pip install vllm --extra-index-url https://download.pytorch.org/whl/cu129安装 CUDA 12.9 版本。citeturn4view2turn4view1
CPU 安装页同样给出 uv venv、nightly 的 cpu 变体索引等,并明确 x86 场景的 CPU flags 要求与 AVX512/AVX2 支持。citeturn6view0
容器化与编排:Docker、Kubernetes、Helm 与 Production Stack
vLLM 提供官方 Docker 镜像(如 vllm/vllm-openai),并给出直接运行 OpenAI 兼容服务的 docker run 示例;同时指出同一镜像也可用于 Podman。citeturn3view1
Docker 文档还指出:镜像包含 CUDA compatibility libraries,可在“驱动版本低于镜像 CUDA Toolkit 版本”的部分专业/数据中心 GPU 上通过 VLLM_ENABLE_CUDA_COMPATIBILITY=1 启用兼容模式。citeturn3view1turn5search4
Kubernetes 部署指南提供了可直接 kubectl apply 的 PVC/Secret/Deployment/Service 示例,并特别注明:vLLM 在张量并行推理时需要访问宿主的共享内存(示例中通过 emptyDir 的 medium: Memory 挂载 /dev/shm 之类的用途)。citeturn20view0
对于更“生产化”的集群形态:
- Helm 文档给出“用 Helm 在 Kubernetes 部署 vLLM”的结构与 values 配置思路。citeturn3view7
- Production Stack 文档把“单实例 → 分布式部署 + 可观测性”作为参考实现,并通过 Helm Chart 安装。citeturn2search18turn2search29turn19search30
下表是面向“高性能推理”的部署选项对比(以官方文档能直接确认的能力为准):
| 方案 | 适用阶段 | 优点 | 关键注意点 |
|---|---|---|---|
| Python 直接安装(wheel) | 开发/单机服务 | 安装快;与 vLLM 推荐的 CUDA/PyTorch 组合更一致(避免兼容性问题)citeturn4view2 | CUDA/torch 版本差异可能要求源码构建;建议新环境citeturn4view2 |
| 官方 Docker 镜像 | 快速上线/标准化部署 | 一条命令起 OpenAI 兼容服务;可用兼容库适配较老驱动(受限于 GPU 类型)citeturn3view1 | 仍需正确的 GPU 运行时参数、HF 缓存与 token;兼容模式需显式开启citeturn3view1 |
| 原生 Kubernetes manifests | 团队级部署/平台化 | 文档提供 PVC/Secret/Deployment/Service 示例,可直接落地citeturn20view0 | 需要 GPU K8s 集群;注意共享内存、资源 requests/limits、gated 模型 tokenciteturn20view0 |
| Helm / Production Stack | 生产集群/可观测性与扩展 | Helm 统一配置;Production Stack 提供“分布式 + 监控”的参考实现citeturn3view7turn2search29 | 需要按 values 规划 CPU/内存/GPU/存储;生产级参数治理成本更高citeturn19search30 |
vLLM 架构与关键组件
多进程体系:API Server、Engine Core、GPU Workers 与 ZMQ 拓扑
vLLM 最新架构概览明确:
- API server 默认 1 个进程;启用数据并行时 API server 数量会自动随 DP 扩展,也可用
--api-server-count手工指定。citeturn8view0 - 每个 API server 通过 ZMQ 以“多对多拓扑”连接所有 engine cores,使任一 API server 可以将请求路由到任一 engine core。citeturn8view0
- Engine core 进程负责运行调度器、管理 KV cache,并协调 GPU workers;其运行方式是“busy loop 持续调度并下发工作”。citeturn8view0
- GPU worker:每个 GPU 由一个独立 worker 进程管理,加载权重、执行 forward、管理 GPU 内存;worker 与其所属 engine core 通信。citeturn8view0
- DP coordinator:当
--data-parallel-size > 1时,额外进程用于 DP 负载均衡,并在 MoE 等场景协调同步 forward。citeturn8view0turn10view4
这套拆分对你“做系统性能”的含义非常直接:瓶颈可能出现在不同层(HTTP 前端/调度与序列管理/GPU 执行/跨 GPU 通信/跨节点编排),调优时要把指标打到“层级”上,而不是只看端到端吞吐。citeturn8view0turn19search2
下面用 Mermaid 画出 vLLM V1 的“进程—职责—通信”关系(概念图,细节以官方架构页为准):
调度与并发:chunked prefill、scheduling policy 与上限约束
vLLM 的并发与调度至少由三组“可控参数/策略”构成:
- 批处理预算:
--max-num-batched-tokens定义“一次 iteration 最多处理多少 tokens”,--max-num-seqs定义“一次 iteration 最多处理多少 sequences”。citeturn11view1 - 调度策略:
--scheduling-policy支持fcfs(先来先服务)与priority(按优先级与到达时间排序)。citeturn10view3turn9search21- 在
priority调度中,Request 的比较逻辑会按 priority、arrival_time、request_id 排序(用于 priority scheduling)。citeturn19search28
- 在
- chunked prefill:稳定版优化指南指出,在 vLLM V1 中,只要条件允许 chunked prefill 默认启用;启用后调度策略“优先 decode”,会先把所有待处理 decode 批进来,再用
max_num_batched_tokens的剩余预算去排队/切分 prefill,当一个 prefill 放不进预算时会自动切块。citeturn9search1turn3view3
从系统角度理解:
max-num-batched-tokens更像“GPU 时间片 + 计算密度”的上限,影响吞吐与 TTFT/TPOT 的权衡。citeturn11view1turn9search1max-num-seqs更像“并发请求数”的上限,直接影响 KV cache 压力与抢占概率。citeturn11view1turn3view3
更细的调度实现(例如每轮如何在 prefill/decode 队列间做公平性、如何处理长短请求混合)在公开文档中只给到 chunked prefill 的策略摘要与参数语义;超出部分 文档未说明。citeturn9search1turn11view1
内存管理与 KV cache:配置面、prefix caching 与混合 KV 管理器
vLLM 的 KV cache 是调度/并发能力的“硬约束”,官方 CLI 明确把 KV cache 抽象为 CacheConfig:
--gpu-memory-utilization:默认 0.9,表示用作模型执行器(权重/激活/KV cache 等)的显存比例;文档强调这是“每实例限制”,同一 GPU 上跑多个 vLLM 实例时可分别设置比例。citeturn10view1turn18search9--kv-cache-memory-bytes:更细粒度的 KV cache 显存指定;一旦设置会忽略gpu_memory_utilization。citeturn10view1turn11view4--kv-cache-dtype:KV cache 存储精度,支持bfloat16/float16/fp8...等,并注明 CUDA 11.8+ 支持 FP8(e4m3/e5m2),AMD ROCm 支持 fp8(e4m3),部分模型可能默认 fp8。citeturn10view1turn11view3--enable-prefix-caching与--prefix-caching-hash-algo:开启前缀缓存与哈希算法选择。citeturn11view4turn23view1
prefix caching 的实现思路在最新设计文档中给得非常具体:vLLM 选择“基于哈希的前缀缓存”,会对每个 KV cache block 计算哈希,哈希的组成包含 parent hash、block tokens 以及用于唯一性/隔离的额外哈希(例如 LoRA IDs、多模态输入 hash、多租户隔离盐等);并说明“只缓存完整 blocks”。citeturn23view1
该文档还指出:从 v0.11 起默认哈希算法为 sha256 以降低碰撞风险;同时提供 sha256_cbor 以获得跨语言/跨环境可复现的哈希,xxhash 则以更高性能换取非加密哈希带来的潜在碰撞与多租户风险。citeturn23view1turn11view4
对于“混合注意力/多 attention 类型模型”的 KV 管理,Hybrid KV Cache Manager 设计文档描述了组件分层(KVCacheManager、KVCacheCoordinator 及不同 coordinator 变体),并明确一些组合约束(例如 HybridKVCacheCoordinator 只处理“恰好两类 KV cache group 且包含 full-attention group”的情形,其他情况未实现,可通过关闭 prefix caching 使用 NoPrefixCache coordinator)。citeturn3view4
分批、执行器与编译优化:LLM 抽象与 Model Runner V2
vLLM 的 LLM 类在 API 文档中被定义为:包含 tokenizer、语言模型(可分布于多 GPU)以及为中间态(KV cache)分配的 GPU 内存空间,并“使用智能分批与高效内存管理”从 batch prompts 生成输出。citeturn18search11
Model Runner V2 设计文档将性能瓶颈之一归因于“每 step 构造输入张量的 Python 开销”,并提出“persistent batch”用增量 diff 的方式复用连续步骤中大体相同的 batch 状态,从而显著减少 CPU 侧输入准备开销。citeturn8view1
此外,vLLM 也提供多种“把通信与计算重叠/把编译与执行结合”的机制:
- Dual Batch Overlap(DBO)设计文档描述其通过在 model runner 中拆分 batch、创建两个 worker threads,并在 MoE kernel 内的 yield points 让两个线程“乒乓”以实现 compute 与通信等待重叠。citeturn9search2turn10view5
--enforce-eager参数会强制使用 eager-mode,禁用 CUDA graph(文档称默认会“CUDA graph + eager 混合”以获得性能与灵活性)。citeturn10view0--async-scheduling在 engine args 中被定义为“避免 GPU 利用率空隙,以提升延迟与吞吐”。citeturn10view3
更底层的 kernel 选择、特定 attention backend 的可用特性矩阵等在文档中存在独立页面,但若你要问“某个模型/某个注意力实现到底走哪条 kernel 路径、与哪些图优化组合最优”,通常需要回到具体 backend/feature 文档或代码;在本报告限定来源范围内,超出上述文档描述部分 文档未说明。citeturn16search22turn10view0
量化与低精度:权重量化、KV cache 量化与硬件适配
vLLM 的量化功能页把量化定位为“用精度换更小内存 footprint,从而在更广泛设备上运行更大模型”,并列出多种支持的量化格式(如 AWQ、GPTQ、bitsandbytes、GGUF、INT8 W8A8、FP8 W8A8、Quantized KV Cache 等),同时给出“不同硬件代际/平台的兼容表”。citeturn17view0--quantization 在 engine args 文档中被定义为“权重量化方法”,若未指定会优先读取模型 config 里的 quantization_config,否则按 dtype 推断权重 dtype。citeturn10view0
KV cache 的 FP8 量化在 Quantized KV Cache 文档中给出非常具体的“收益/限制”表述:当前实现主要通过“让 KV cache 可分配空间约翻倍”提升吞吐(支持更长上下文或更多并发 batch),但由于尚未做 fused dequantization + attention,暂时没有延迟改善;同时指出未来会支持硬件加速的量化 attention。citeturn17view2
与 Hugging Face/Transformers 的集成点:模型解析、tokenizer、权重格式
vLLM 的“Integration with Hugging Face”设计文档以 vllm serve 的执行流程分步骤说明:
- 通过检查/获取
config.json判断模型存在(本地路径或 HF hub/cache),并在需要时使用HF_TOKEN下载。citeturn23view0 - 依据
model_type、architectures等字段映射到 vLLM 的模型类注册表;若架构不在注册表则不被支持。citeturn23view0 - tokenizer 通过 HF 的
AutoTokenizer.from_pretrained加载,且 vLLM 会缓存 tokenizer 的一些昂贵属性。citeturn23view0 - 权重下载默认优先 safetensors,若无则回退到 PyTorch bin;并有
--load-format dummy可跳过下载(用于某些测试/基准场景)。citeturn23view0
这意味着:如果你的系统性能瓶颈包含“模型加载时间、冷启动、tokenizer 开销、权重格式与分布式加载效率”,vLLM 的集成逻辑本身就是需要读懂的性能边界。citeturn23view0turn4view2
性能优化与调优方法论
先定指标:TTFT、TPOT、吞吐、并发、抢占率
vLLM 把指标分为 server-level(全局状态/性能)与 request-level(请求大小与时序,常作为 SLO),并以 Prometheus 的 gauges/counters/histograms 形式暴露。citeturn19search2turn19search5
vLLM 的 /metrics 端点在“Production Metrics”页被明确为对外暴露的 metrics 获取方式。citeturn19search5
同时,vLLM 也提供 vllm bench latency/serve/throughput 用于分别测试单 batch 延迟、在线服务吞吐、离线吞吐。citeturn13view2
你在做系统调优时,建议至少固定以下三类指标口径(否则“调大参数 ≠ 真正更快”):
- 推理侧:TTFT、TPOT、tokens/s、并发下的 p95/p99。citeturn6view4turn13view2
- 系统侧:GPU 利用率与显存占用(尤其是 KV cache 压力导致的抢占/重算)。citeturn3view3turn19search5
- 稳定性侧:抢占计数、错误率与 tail latency(例如冷启动/缓存未命中)。citeturn3view3turn22view0
关键旋钮总览:从“批处理预算”到“显存/并行/编译”
vLLM 官方优化指南在解释“KV cache 不足导致抢占(preemption)”时,给出一组非常工程化的调参方向:
- 增大
gpu_memory_utilization(为 KV cache 留更多显存) - 减小
max_num_seqs或max_num_batched_tokens(降低并发 batch 的 KV cache 需求) - 增大
tensor_parallel_size(分片权重,让单卡腾出更多 KV cache 空间,但可能带来同步开销) - 增大
pipeline_parallel_size(分层到多 GPU,减少单卡权重占用,从而间接增加 KV cache,但可能带来延迟惩罚)。citeturn3view3turn11view1turn3view2
结合 CLI/配置文档给出的参数语义,下表把“你最常用的一组旋钮”按系统效果归类(其中“风险/副作用”严格基于文档能确认的描述进行推导;未明示部分标注为文档未说明):
| 类别 | 关键参数/机制 | 主要收益路径 | 典型风险与边界 |
|---|---|---|---|
| 批处理上限 | --max-num-batched-tokens, --max-num-seqs |
控制每轮迭代的 tokens 预算与并发序列数,影响吞吐/延迟与 KV 压力citeturn11view1turn9search1 | 上限过高会推高 KV 占用并触发抢占/重算citeturn3view3 |
| Prefill 策略 | --enable-chunked-prefill/默认启用(V1) |
先满足 decode,利用剩余预算切块 prefill,改善 decode 侧稳定性并提高 GPU 利用率citeturn9search1turn10view3 | 具体对 TTFT/TPOT 的影响随负载而变;细粒度公平性策略文档未说明citeturn9search1 |
| KV cache 空间 | --gpu-memory-utilization 或 --kv-cache-memory-bytes |
直接扩大 KV cache 可用空间,降低抢占概率citeturn10view1turn3view3 | 设置过高可能 OOM(文档对 gpu_memory_utilization 提示“过高会 OOM”)citeturn19search31turn10view1 |
| KV 精度 | --kv-cache-dtype(含 FP8) |
在支持硬件上用更低精度存 KV,换更大可用容量citeturn10view1turn17view2 | Quantized KV Cache 文档指出当前主要提升吞吐,不带来延迟改善citeturn17view2 |
| Prefix caching | --enable-prefix-caching, --prefix-caching-hash-algo |
复用相同前缀的已计算 KV blocks,避免冗余 prompt 计算citeturn23view1turn11view4 | 非加密哈希(xxhash)存在多租户碰撞/信息泄露理论风险;需权衡安全/性能citeturn23view1turn11view4 |
| 编译/图优化 | --enforce-eager(禁用 CUDA graph)与默认 hybrid |
默认模式下利用 CUDA graph + eager 混合;eager 常用于调试/基准一致性citeturn10view0turn13view2 | 强制 eager 会牺牲图优化收益citeturn10view0 |
| 进程/CPU 资源 | 多 API servers + 多 engine cores + 多 GPU workers | 架构上可扩展并发与隔离citeturn8view0turn19search0 | CPU core 需求随 A + DP + N (+1) 增长;不足会拖累整体吞吐citeturn19search0turn8view0 |
| 并行扩展 | TP/PP/DP(以及 MoE 的 EP) | 单机多卡通过 TP/PP 分片;DP 复制权重处理独立 batch;并可组合citeturn3view2turn10view4 | TP/PP/DP/EP 的同步、通信与调度细节依模型而变;“最佳组合”文档未给固定配方citeturn10view4turn3view2 |
CPU 资源规划:把“进程数”当作硬约束
vLLM 的优化页面提供了一个非常直接的 CPU sizing 公式:当启用数据并行或多 API server 时,最低物理核数 ≈ A + DP + N + (1 if DP > 1 else 0)(A=API server count,DP=data parallel size,N=GPU 总数),并给出 DP=4、TP=2、8 GPUs 时的 17 进程示例。citeturn19search0turn8view0
这意味着:如果你在压测时看到 GPU 还有余量但吞吐上不去,首先应检查 CPU 是否因“API 进程/engine core/worker”争用导致调度与数据准备跟不上。citeturn19search0turn8view0
分布式与多卡:TP/PP/DP 的组合规则与“每 DP rank 的上限”
并行扩展页明确:vLLM 支持 tensor-parallel 与 pipeline-parallel 推理与服务,并描述:单节点默认用 Python multiprocessing,多节点默认用 Ray;可通过 distributed_executor_backend 或 --distributed-executor-backend 指定 mp 或 ray。citeturn3view2turn10view2
数据并行部署页进一步强调:--data-parallel-size 会把权重复制到多实例/多 GPU 处理独立 batch,并提供“在单机 8 GPU 上跑 DP=4、TP=2”的命令示例;同时提醒 --max-num-seqs 是“按每个 DP rank”生效,做容量规划时必须乘上 DP。citeturn10view4turn19search1
对 MoE 模型,数据并行部署页指出可以在 attention 层使用 DP,在 expert 层使用 TP/EP,并说明默认 expert layers 会形成大小为 DP × TP 的 tensor parallel group;如需 expert parallel 则使用 --enable-expert-parallel。citeturn10view4
与 Milvus 的集成与向量检索加速实践
RAG 的系统分层:检索与生成分别优化,再做端到端联调
Milvus 的“Milvus + vLLM + Llama 3.1”教程把典型 RAG 拆成两段:
- 检索:把文本切分/向量化后写入 Milvus,查询时检索相关 chunks;
- 生成:用 vLLM 启动/加载大模型,把“检索到的上下文 + 用户问题”拼成 prompt 生成答案。citeturn15view0turn15view2
这一拆分对高性能系统的意义是:RAG 端到端延迟 ≈ embedding + Milvus search +(可选 rerank)+ prompt 拼接 + vLLM 推理;其中“检索侧的长尾(冷数据/缓存未命中)”往往会直接放大 TTFT。citeturn22view0turn22view1turn19search5
下面用 Mermaid 给出“可落地的 RAG 部署流水线”(抽象图;具体 API 以你的 SDK/网关为准):
索引选择:用“数据是否装得下内存、可接受的召回损失、延迟目标”驱动
Milvus 概览页写明:Milvus 支持多种主流索引(HNSW、IVF、FLAT、SCANN、DiskANN 等)并支持 GPU indexing(如 NVIDIA CAGRA)。citeturn12search23turn22view6
Index Explained 进一步从“Capacity(数据规模 vs RAM)”角度给出选择建议:若仅约四分之一原始数据能进内存,可考虑 DiskANN 以获得稳定延迟;若都能进内存,考虑内存索引与 mmap;也可以用量化索引与 mmap 以牺牲精度换容量。citeturn24search13turn22view5
下表基于 Milvus 官方索引页面对常用索引做对比(仅使用文档明确表述,不擅自补充公式/绝对性能数字):
| 索引 | 适用倾向 | 文档明确的特点 | 典型场景提示 |
|---|---|---|---|
| FLAT | 小数据/高精度基线 | 暴力比对,保证 100% recall(每个向量都被评估)citeturn14search0 | 做“召回上限”和调参对照;大规模会慢citeturn14search0 |
| HNSW | 低延迟、高精度(但吃内存) | 图索引,提高高维浮点向量检索性能;精度好、低延迟,但需要较高内存开销维护分层图结构citeturn24search0 | 内存富余、追求低尾延迟citeturn24search0 |
| IVF_FLAT | 大规模、较快、较高精度 | 通过聚类减少搜索空间,适合需要快速响应与较高精度的大规模数据(且内存足够存簇数据)citeturn14search4 | “能聚类就少扫”;配合 nprobe 调参citeturn14search9turn14search4 |
| IVF_PQ | 更省内存、可接受精度损失 | 量化型 ANN;通常显著降低内存占用,是大数据集的实用选择citeturn24search1 | 内存受限、允许一定 recall 损失citeturn24search1 |
| SCANN | 文档未在索引页给统一一句话总结(但被列为支持项) | Milvus 架构/概览中将 SCANN 列为底层向量库之一citeturn12search23turn24search18 | 若选用需进一步参考 SCANN 专门文档与基准;此处不扩展(文档未说明)citeturn12search23 |
| DiskANN(On-disk) | 超大规模/SSD 优化 | “On-disk Index”页说明 DiskANN 基于 Vamana graphs,面向磁盘优化的大规模向量检索citeturn24search8 | 数据无法完全驻留内存,追求更可控的容量/成本citeturn24search13turn24search8 |
| GPU_CAGRA(GPU Index) | 高吞吐/高召回(GPU 加速) | GPU_CAGRA 为 GPU 优化的图索引;GPU Index Overview 给出其内存使用约为原始向量数据的 1.8 倍citeturn22view6 | GPU 资源充足、追求高吞吐/高召回citeturn12search1turn22view6 |
对于“召回 vs 延迟”的可调参数,Milvus 的 quick reference 明确指出:HNSW 的 ef 越高越准确但更慢;IVF 的 nprobe 越高越准但更慢(本质是扫更多候选)。citeturn14search9turn14search1
因此在 RAG 中,索引选择与参数调优应当与 vLLM 的并发策略一起做“端到端 Pareto”:检索侧多扫一点可能提高答案质量,但会拉长 TTFT;生成侧若靠 chunked prefill 抢占 decode 优先权,检索抖动仍可能成为最先爆的长尾。citeturn9search1turn19search5turn14search9
召回与重排序:过滤、混合检索与 reranking
Milvus 的 Filtered Search 文档说明:若集合包含 embeddings 与 metadata,可在 ANN 之前先做 metadata filtering,以缩小搜索范围并提升相关性(流程是“先过滤,再 ANN,再返回 top-K”)。citeturn22view3
Multi-Vector Hybrid Search 文档给出“多向量字段 + 重排序策略”的范式,适合把 dense/sparse 或多模态向量组合起来并做 reranking。citeturn22view4turn12search0
Boost Ranker 文档则描述一种“通过元数据/规则对原始检索结果打分进行 rerank”的机制(通过 FunctionType.RERANK 与 params 配置)。citeturn12search10
面向 RAG 的工程建议(与文档对齐的部分):
- 先用过滤把“明显不相关的分区/租户/时间窗”排掉,再做 ANN,可减少无效距离计算与后续 rerank 成本。citeturn22view3turn14search3
- 在多 embedding 策略下,用 hybrid + reranking 把“语义相似 + 词面匹配/结构化特征”结合起来。citeturn12search0turn12search10
缓存与并发访问:Warm Up、Chunk Cache 与 Eviction
在“高并发 + 大数据 + 冷热分层”的检索系统中,Milvus 文档给出了三块直接影响“首查延迟/抖动/稳定性”的机制:
- Warm Up(Milvus 2.6.4+):在 segment 可查询前预加载选定字段或索引到缓存,支持 cluster/collection/field-index 三级配置;并强调 Warm Up 用于降低冷数据首次查询延迟,但不建议对低频/大字段滥用。citeturn22view0
- Chunk Cache:在 query nodes 的本地硬盘缓存中预加载数据;Segcore 收到请求先查缓存,命中则更快返回;
warmup可设为async/sync/disable,并给出 Helm/Docker Compose/Operator 三种安装路径下的配置位置。citeturn22view1 - Eviction(Milvus 2.6.4+):用于管理 QueryNode 的缓存资源,超过阈值自动清理;采用 LRU;metadata 永不淘汰。citeturn22view2
这些机制与 vLLM 的关系是:如果检索端存在明显冷启动抖动,你会看到 TTFT 端到端被拉长;即使 vLLM 的 decode 已经通过 chunked prefill 得到优先,也无法抵消“检索前置”的等待。citeturn22view0turn9search1turn19search5
配置示例、命令行与代码模板
以下命令/配置均来自 vLLM 与 Milvus 官方文档示例或由其参数语义直接组合;你可按“单机单卡→多卡→分布式”的顺序逐步套用。citeturn4view2turn3view2turn20view0turn22view0
最小安装与启动
GPU(Linux)安装:
# 推荐:使用全新环境(文档建议)
uv venv --python 3.12 --seed --managed-python
source .venv/bin/activate
# 预编译 wheel(自动选择 torch 后端)
uv pip install vllm --torch-backend=auto
# 或者:pip 安装 CUDA 12.9 变体(示例)
pip install vllm --extra-index-url https://download.pytorch.org/whl/cu129
citeturn4view2turn4view1
启动 OpenAI 兼容服务:
vllm serve NousResearch/Meta-Llama-3-8B-Instruct \
--dtype auto \
--api-key token-abc123
citeturn21search16turn13view0
以 YAML 管理服务参数(便于生产化)
vLLM 支持用 --config 从 YAML 读取 vllm serve 的参数,且优先级为:命令行 > config 文件 > defaults。citeturn21search1turn21search0
# config.yaml (示例)
model: meta-llama/Llama-3.1-8B-Instruct
host: "0.0.0.0"
port: 8000
uvicorn-log-level: "info"
# 常见性能旋钮(示例,按你的 GPU/模型/负载调)
gpu-memory-utilization: 0.90
max-num-batched-tokens: 8192
max-num-seqs: 256
enable-chunked-prefill: true
vllm serve --config config.yaml
citeturn21search1turn11view1turn9search1
Docker 运行(含 HF 缓存与 Token)
docker run --runtime nvidia --gpus all \
-v ~/.cache/huggingface:/root/.cache/huggingface \
--env "HF_TOKEN=$HF_TOKEN" \
-p 8000:8000 \
--ipc=host \
vllm/vllm-openai:latest \
--model Qwen/Qwen3-0.6B
citeturn3view1
若你的宿主驱动较老且符合文档所述“支持的专业/数据中心 GPU”范围,可按 Docker 文档通过 VLLM_ENABLE_CUDA_COMPATIBILITY=1 启用兼容模式(注意这是“可选能力”,并非所有 GPU 都支持)。citeturn3view1
Kubernetes 部署(GPU 示例片段)
K8s 部署指南给出 PVC/Secret/Deployment/Service 的完整示例(下方为核心片段,建议直接按官方文档复制整段 YAML)。citeturn20view0
apiVersion: apps/v1
kind: Deployment
metadata:
name: mistral-7b
namespace: default
spec:
replicas: 1
template:
spec:
volumes:
- name: shm
emptyDir:
medium: Memory
sizeLimit: "2Gi"
containers:
- name: mistral-7b
image: vllm/vllm-openai:latest
command: ["/bin/sh", "-c"]
args:
- "vllm serve mistralai/Mistral-7B-Instruct-v0.3 --trust-remote-code --enable-chunked-prefill --max_num_batched_tokens 1024"
resources:
limits:
nvidia.com/gpu: "1"
citeturn20view0
常用 API 调用:OpenAI client + vLLM extra_body
OpenAI 兼容服务文档指出:vLLM 支持一些超出 OpenAI 规范的参数(如 top_k),可以通过 OpenAI Python client 的 extra_body 透传到 vLLM。citeturn13view0
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="token-abc123",
)
resp = client.chat.completions.create(
model="NousResearch/Meta-Llama-3-8B-Instruct",
messages=[{"role": "user", "content": "Hello!"}],
extra_body={"top_k": 50},
)
print(resp.choices[0].message)
citeturn13view0
vLLM 侧基准测试与环境诊断命令
vLLM CLI Guide 给出:
vllm bench latency/serve/throughput三类基准命令,以及 bench 额外依赖需要pip install vllm[bench]。citeturn13view2vllm collect-env用于采集环境信息(也可用于提交 issue 时的环境复现)。citeturn13view2turn16search0
# 环境采集
vllm collect-env
# 在线服务吞吐基准(示例)
vllm bench serve \
--model meta-llama/Llama-3.2-1B-Instruct \
--host server-host \
--port server-port \
--random-input-len 32 \
--random-output-len 4 \
--num-prompts 5
citeturn13view2
vLLM + Milvus 的最小 RAG 代码骨架
Milvus 的 RAG 教程展示:使用 pymilvus.MilvusClient 连接 Milvus Lite(本地文件),创建集合并写入向量。citeturn15view2
下面给出“工程化骨架”(重点在接口与并发位置;embedding 生成与 chunking 细节在该教程中有展开,但不同业务会差异很大,此处以占位函数表示)citeturn15view2turn22view3:
from pymilvus import MilvusClient
import requests
MILVUS_URI = "milvus_demo.db" # Milvus Lite 示例
COLLECTION = "MilvusDocs"
mc = MilvusClient(MILVUS_URI)
def embed(text: str) -> list[float]:
# 文档未说明:embedding 模型选择/批处理策略
raise NotImplementedError
def retrieve(query: str, topk: int = 5):
qvec = embed(query)
# 文档未说明:具体 search API 参数组合(依索引类型不同)
results = mc.search(
collection_name=COLLECTION,
data=[qvec],
limit=topk,
output_fields=["text"], # 视你的 schema 而定
# filter 可用于先做 metadata filtering(示例占位)
# filter='tenant_id == "t1"'
)
return results
def call_vllm_chat(prompt: str) -> str:
# 调用 vLLM OpenAI Compatible Server
payload = {
"model": "NousResearch/Meta-Llama-3-8B-Instruct",
"messages": [{"role": "user", "content": prompt}],
}
r = requests.post("http://localhost:8000/v1/chat/completions", json=payload, timeout=60)
r.raise_for_status()
return r.json()["choices"][0]["message"]["content"]
def rag_answer(query: str) -> str:
hits = retrieve(query, topk=5)
# 文档未说明:prompt 模板的最佳实践(需结合模型/业务)
context = "\n".join([h["entity"]["text"] for h in hits[0]])
prompt = f"请仅基于以下资料回答问题。\n资料:\n{context}\n\n问题:{query}\n答案:"
return call_vllm_chat(prompt)
citeturn15view2turn22view3turn13view0
基准测试、监控、故障排查与最佳实践
如何设计基准测试:分层测量而非只看端到端
vLLM 提供三种 bench 入口:
bench latency:单 batch 延迟;bench serve:在线 serving 吞吐;bench throughput:离线推理吞吐。citeturn13view2
同时,vLLM Performance Dashboard 页面描述了“持续基准(continuous benchmarking)”会运行 serving/throughput/latency 三类测试,用于跟踪不同模型/GPU 上的性能变化与回归。citeturn6view4
因此建议你把基准拆成三层:
- vLLM 单体层:固定模型与生成参数,扫
max-num-batched-tokens/max-num-seqs/gpu-memory-utilization/kv-cache-dtype,用vllm bench+/metrics观察吞吐/延迟与抢占。citeturn13view2turn19search5turn3view3 - Milvus 检索层:分别测“冷启动(空缓存)”与“热缓存”,并关注 Warm Up / Chunk Cache / Eviction 策略对 p95/p99 的影响。citeturn22view0turn22view1turn22view2turn12search20
- RAG 端到端层:在固定 query 集合上测“正确率/召回相关指标 + TTFT/TPOT + QPS”,并将瓶颈归因到 embedding/检索/rerank/推理阶段(否则很难知道该调 Milvus 还是调 vLLM)。citeturn12search15turn19search2turn13view2
监控工具链:Prometheus/Grafana 与 vLLM Dashboards
vLLM 的 Production Metrics 文档说明:metrics 暴露在 API server 的 /metrics 端点,可直接 curl 验证。citeturn19search5
vLLM 提供 Grafana 与 Perses 两类 dashboard 配置,并列出“需要 Prometheus metrics、数据源配置、vLLM metrics 可访问”等前置条件。citeturn6view3turn19search35
另外,Prometheus/Grafana 示例页面给出用 Docker/Docker Compose 启动监控栈的思路。citeturn19search13
常见问题与故障排查清单
vLLM(推理/服务侧)
- 安装后启动异常或性能异常:优先用
vllm collect-env收集 CUDA/NVIDIA driver/cuDNN 等环境信息(文档提供相关采集函数),并核对是否符合 GPU 安装页的 OS/Python/GPU 要求。citeturn13view2turn16search0turn4view0 - CUDA/驱动不兼容:Troubleshooting 提到 Triton bundle 的 ptxas 与设备不兼容时可设置
TRITON_PTXAS_PATH指向 CUDA toolkit 的 ptxas。citeturn6view2 - NCCL 相关挂起/崩溃:参考 Troubleshooting 对
NCCL_CUMEM_ENABLE历史覆盖、以及 PCIe 机器peer access is not supported报错的处理建议;必要时结合环境变量文档使用VLLM_NCCL_SO_PATH。citeturn6view2turn6view1 - 频繁出现抢占/重算:优化指南提示这是 KV cache 空间不足导致的 RECOMPUTE 抢占,应通过提高
gpu_memory_utilization、降低max_num_seqs/max_num_batched_tokens或调整 TP/PP 来增加 KV cache 余量。citeturn3view3turn11view1turn3view2 - 误用旧参数:Metrics 设计文档指出 V1 里“swap 到 CPU 的预emption”已属 legacy,
--swap-space已移除;因此如果你在旧教程里看到 swap-space,需按新版本的 KV offloading 等机制重新理解。citeturn8view2turn10view1
Milvus(检索侧)
- 首次查询很慢/延迟抖动大:优先检查是否需要 Warm Up(2.6.4+)与 Chunk Cache 的 warmup 配置,尤其在 tiered storage/冷数据访问场景。citeturn22view0turn22view1
- 延迟随运行时间变差:检查 Eviction 是否启用、阈值与 LRU 淘汰是否导致热数据频繁被挤出,同时确认“metadata 永不淘汰”的假设是否与你的 query pattern 匹配。citeturn22view2
- 搜索慢且 QPS 上不去:Milvus 官方排障文章建议包括“给过滤字段建索引、保持过滤表达式简洁、批量 upsert、把 NQ/QPS 控制在可持续水平、资源规划避免 CPU/disk 争用”等。citeturn14search3
最佳实践与逐步上手指南
入门阶段(单机单卡、先跑通再测量)
- 用 vLLM wheel 或官方 Docker 在 Linux 单卡跑通
vllm serve,并立刻验证/metrics是否可抓取。citeturn4view2turn19search5turn3view1 - 开启 chunked prefill(V1 通常默认启用)并通过
vllm bench serve定一个“你的业务长度分布”的基线。citeturn9search1turn13view2 - 把
max-num-batched-tokens/max-num-seqs/gpu-memory-utilization当作第一批调优旋钮,观测是否出现 preemption/重算告警。citeturn11view1turn3view3turn10view1
进阶阶段(单机多卡与检索增强)
- 单机多卡优先尝试
--tensor-parallel-size,必要时再叠加--pipeline-parallel-size;关注同步开销与尾延迟变化。citeturn3view2turn3view3 - 对“重复前缀明显”的业务(例如模板化系统提示词、同一知识库反复问答),系统性评估 prefix caching 命中率与哈希算法(安全/可复现/性能)选择。citeturn23view1turn11view4
- Milvus 侧优先用 Filtered Search 把租户/时间/类别过滤掉,再做 ANN;必要时引入 hybrid search + rerank。citeturn22view3turn12search0turn12search10
生产部署阶段(分布式、可观测性与容量治理)
- 使用 DP/TP 组合时牢记
max-num-seqs按 DP rank 生效,并按 vLLM 给出的 CPU 物理核数公式预留 CPU。citeturn19search1turn19search0 - 上 Prometheus/Grafana(或 Perses)仪表盘,把 TTFT/TPOT/吞吐与抢占、KV cache 压力、进程资源开销纳入 SLO。citeturn6view3turn19search2turn19search5
- Milvus 启用 Warm Up/Chunk Cache/Eviction 的组合策略,明确“冷数据首查延迟”是否在 SLA 内;并在压测中同时覆盖 cold-start 与 warm-cache 两种基准。citeturn22view0turn22view1turn22view2turn12search20
关键文档页面索引
仅列出本报告中引用/依赖的关键页面(均来自 vllm.ai 与 milvus.io)。URL 以可复制形式给出。
# vLLM (docs.vllm.ai / vllm.ai)
https://docs.vllm.ai/en/stable/getting_started/installation.html
https://docs.vllm.ai/en/stable/getting_started/installation/gpu/
https://docs.vllm.ai/en/stable/getting_started/installation/cpu/
https://docs.vllm.ai/en/stable/deployment/docker/
https://docs.vllm.ai/en/stable/deployment/k8s/
https://docs.vllm.ai/en/stable/deployment/frameworks/helm/
https://docs.vllm.ai/en/stable/serving/openai_compatible_server/
https://docs.vllm.ai/en/stable/serving/parallelism_scaling/
https://docs.vllm.ai/en/latest/serving/data_parallel_deployment/
https://docs.vllm.ai/en/latest/design/arch_overview/
https://docs.vllm.ai/en/stable/configuration/engine_args/
https://docs.vllm.ai/en/stable/configuration/optimization/
https://docs.vllm.ai/en/latest/design/prefix_caching/
https://docs.vllm.ai/en/stable/design/hybrid_kv_cache_manager/
https://docs.vllm.ai/en/latest/features/quantization/
https://docs.vllm.ai/en/stable/features/quantization/fp8/
https://docs.vllm.ai/en/v0.11.0/features/quantization/quantized_kvcache.html
https://docs.vllm.ai/en/latest/cli/
https://docs.vllm.ai/en/stable/usage/metrics/
https://docs.vllm.ai/en/latest/benchmarking/dashboard/
https://docs.vllm.ai/en/latest/design/huggingface_integration/
https://docs.vllm.ai/en/stable/configuration/env_vars/
https://docs.vllm.ai/en/latest/usage/troubleshooting/
https://docs.vllm.ai/en/stable/api/vllm/collect_env/
# Milvus (milvus.io)
https://milvus.io/docs/overview.md
https://milvus.io/docs/milvus_rag_with_vllm.md
https://milvus.io/docs/index-explained.md
https://milvus.io/docs/flat.md
https://milvus.io/docs/hnsw.md
https://milvus.io/docs/ivf-flat.md
https://milvus.io/docs/ivf-pq.md
https://milvus.io/docs/disk_index.md
https://milvus.io/docs/diskann.md
https://milvus.io/docs/gpu-index-overview.md
https://milvus.io/docs/filtered-search.md
https://milvus.io/docs/multi-vector-search.md
https://milvus.io/docs/boost-ranker.md
https://milvus.io/docs/warm-up.md
https://milvus.io/docs/chunk_cache.md
https://milvus.io/docs/eviction.md
https://milvus.io/blog/how-to-debug-slow-requests-in-milvus.md
昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链
更多推荐


所有评论(0)