基于 vLLM 与 K8s 的高并发推理服务:PagedAttention 显存优化实践
在将大型语言模型(LLM)从本地原型推向生产高并发场景时,基于传统 HuggingFace Transformers 框架构建的推理服务往往会遭遇严重的吞吐瓶颈。
当几十个并发请求同时涌入时,传统推理框架会因为必须为每个请求预分配最大上下文长度(Max Sequence Length)的 KV Cache,导致 GPU 显存迅速发生碎片化(Fragmentation)并触发 OOM 崩溃。单张 80GB 的 A100 显卡往往只能支撑 5~8 个并发,并发 QPS 惨不忍睹。
vLLM框架引入了受操作系统虚拟内存启发的PagedAttention 算法,将 KV Cache 离散存储在非连续的显存块(Blocks)中,消除了 96% 以上的显存碎片浪费。结合 Kubernetes 的弹性调度与连续批处理(Continuous Batching),能够将单卡并发吞吐提升 5 到 10 倍。
PagedAttention 与传统静态显存分配对比
【传统 HuggingFace 静态显存分配】 Request 1 (预分配 4096 tokens): [████已用 200 tokens | ░░░░░░░░░░░░░░░░ 浪费 3896 tokens 空闲显存] Request 2 (预分配 4096 tokens): [████已用 150 tokens | ░░░░░░░░░░░░░░░░ 浪费 3946 tokens 空闲显存] ==> 显存有效利用率 < 20%,极早触发 OOM 【vLLM PagedAttention 分页显存管理】 物理显存池被切分为标准 Block (每个 Block 存放 16 个 Tokens 的 KV) Logical Blocks (逻辑页) ──[Page Table 页表动态映射]──> Physical GPU Blocks (物理显存块) ==> 显存按需分配,零碎片浪费,并发吞吐提升 5~10 倍生产级 vLLM Kubernetes Deployment 配置
在生产 K8s 集群中部署 vLLM 服务,必须精细配置显存利用率(gpu-memory-utilization)、最大模型上下文长度(max-model-len)以及存活探针:
apiVersion: apps/v1 kind: Deployment metadata: name: vllm-deepseek-service namespace: ai-inference spec: replicas: 2 selector: matchLabels: app: vllm-deepseek template: metadata: labels: app: vllm-deepseek spec: containers: - name: vllm-server image: vllm/vllm-openai:v0.6.2 imagePullPolicy: IfNotPresent command: ["python3", "-m", "vllm.entrypoints.openai.api_server"] args: - "--model=/models/deepseek-7b-chat" - "--port=8000" - "--gpu-memory-utilization=0.90" # 允许 vLLM 占用 90% 显存作为 KV Cache 池 - "--max-model-len=8192" - "--max-num-seqs=256" # 允许单实例最大并发序列数 - "--tensor-parallel-size=1" # 单卡部署设为 1,多卡分布式设为卡数 - "--disable-log-requests" # 生产高并发下关闭全量请求日志,避免 IO 阻塞 env: - name: NCCL_DEBUG value: "INFO" resources: requests: cpu: "8" memory: "32Gi" nvidia.com/gpu: "1" limits: cpu: "16" memory: "64Gi" nvidia.com/gpu: "1" volumeMounts: - name: shared-memory mountPath: /dev/shm - name: model-weights mountPath: /models readOnly: true ports: - containerPort: 8000 # 就绪探针:必须在模型完全加载并分配好 PagedAttention 显存池后才接入流量 readinessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 40 periodSeconds: 10 timeoutSeconds: 5 livenessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 60 periodSeconds: 15 timeoutSeconds: 5 volumes: - name: shared-memory emptyDir: medium: Memory sizeLimit: 8Gi - name: model-weights persistentVolumeClaim: claimName: ceph-model-weights-pvc前端与 BFF 层的流式 SSE 接入与背压控制
vLLM 原生兼容 OpenAI API 规范。在前端或 Node.js BFF 层调用时,采用流式 SSE(Server-Sent Events)接入,并利用TransformStream控制数据流速(Backpressure):
import { createParser, ParsedEvent, ReconnectInterval } from 'eventsource-parser'; export async function* streamLlmInference(prompt: string, signal?: AbortSignal) { const response = await fetch('http://vllm-deepseek-service.ai-inference.svc:8000/v1/chat/completions', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer internal-token', }, body: JSON.stringify({ model: '/models/deepseek-7b-chat', messages: [{ role: 'user', content: prompt }], stream: true, temperature: 0.7, max_tokens: 2048, }), signal, }); if (!response.ok || !response.body) { throw new Error(`vLLM stream error: ${response.statusText}`); } const reader = response.body.getReader(); const decoder = new TextDecoder(); let queue: string[] = []; const parser = createParser((event: ParsedEvent | ReconnectInterval) => { if (event.type === 'event') { if (event.data === '[DONE]') return; try { const json = JSON.parse(event.data); const delta = json.choices[0]?.delta?.content || ''; if (delta) queue.push(delta); } catch (e) { // 忽略残缺 JSON chunk } } }); while (true) { const { done, value } = await reader.read(); if (done) break; parser.feed(decoder.decode(value, { stream: true })); while (queue.length > 0) { yield queue.shift()!; } } }性能压测实测数据对比
使用 Locust 对单张 RTX 4090 (24GB) 运行 7B 模型的集群进行并发压测:
| 框架方案 | 显存碎片率 | 最大安全并发数 | 首字平均延迟 (TTFT) | 整体吞吐 (Tokens/s) |
|---|---|---|---|---|
| 原生 Transformers + FastAPI | 78% | 8 并发 (再高 OOM) | 1250 ms | 142 tokens/s |
| vLLM (PagedAttention) | < 4% | 64 并发 | 180 ms | 1180 tokens/s |
总结
vLLM 与 PagedAttention 将大模型推理从原先的“手工作坊”带入了现代操作系统的“虚拟分页”时代。在 Kubernetes 体系中标准化部署 vLLM,是构建企业级低成本、高并发 AI 基础设施的基石标准。