大模型高并发服务架构详解:从请求调度到分布式推理,构建高性能 LLM 服务系统
一、为什么大模型需要高并发服务架构?
随着大语言模型(LLM)在智能客服、AI Agent、企业知识库、智能办公等场景中的广泛应用,越来越多的企业开始将大模型部署为在线 API 服务。
但大模型服务与传统 Web 服务存在明显区别。
传统 Web 服务通常处理的是数据库查询、业务逻辑和轻量级计算,而大模型推理需要消耗大量 GPU 显存和计算资源,并且一次请求可能持续数秒甚至数十秒。
当大量用户同时发起请求时,系统可能出现以下问题:
-
请求堆积: 大量请求同时进入,GPU 无法及时处理。
-
显存不足: 多个请求同时进行推理,KV Cache 占用大量显存。
-
响应延迟增加: 用户需要等待较长时间才能获得结果。
-
GPU 利用率低: 请求调度不合理,导致 GPU 计算资源无法充分利用。
-
服务稳定性下降: 突发流量可能导致服务超时、OOM 或进程崩溃。
因此,企业部署大模型时,不能只关注模型推理速度,还需要构建一套完整的高并发服务架构。
大模型高并发服务架构的核心目标是:
-
提高 GPU 资源利用率。
-
提升系统吞吐量(Throughput)。
-
降低首 Token 延迟(TTFT)。
-
降低 Token 间隔时间(ITL)。
-
支持动态扩缩容。
-
保证系统在高流量下稳定运行。
二、大模型高并发服务整体架构
一个成熟的大模型在线服务系统,通常由接入层、网关层、请求调度层、推理服务层、缓存层和监控层组成。
2.1 整体架构图

整个架构可以分为六个核心模块。
| 模块 | 核心技术 | 主要职责 |
|---|---|---|
| 接入层 | CDN、WAF | 流量接入与安全防护 |
| 网关层 | Nginx、Envoy | 鉴权、限流、路由 |
| 调度层 | Redis、消息队列 | 请求排队与调度 |
| 推理层 | vLLM、TensorRT-LLM | GPU 模型推理 |
| 缓存层 | Redis | 缓存热点数据 |
| 监控层 | Prometheus、Grafana | 性能监控与告警 |
三、API Gateway:大模型服务的流量入口
API Gateway 是整个大模型服务系统的入口。
所有用户请求首先经过 API Gateway,再由网关转发给后端推理服务。
它主要负责以下工作:
3.1 身份认证
通过 API Key、JWT 等机制验证用户身份。
例如:
def authenticate(api_key, valid_keys):
if api_key not in valid_keys:
raise PermissionError("Invalid API Key")
return True
在真实生产环境中,还需要结合用户权限、密钥有效期以及密钥轮换机制。
3.2 请求限流
如果某个用户在短时间内发送大量请求,就可能占用过多 GPU 资源。
因此需要通过限流控制请求频率。
常见算法包括:
-
固定窗口算法
-
滑动窗口算法
-
漏桶算法
-
令牌桶算法
令牌桶算法是 API 限流中常用的一种方式。
其基本原理是:
-
系统按照固定速率生成令牌。
-
请求到来时尝试获取令牌。
-
获取成功则允许请求通过。
-
没有令牌则拒绝请求或进入等待队列。
3.3 请求路由
当系统部署多个模型实例时,网关需要根据请求类型选择合适的推理服务。
例如:
-
普通文本请求 → 轻量级模型。
-
复杂推理请求 → 大参数模型。
-
向量化请求 → Embedding 服务。
-
图像理解请求 → 多模态模型。
合理的请求路由可以避免所有请求都集中到同一个模型实例。
四、负载均衡:如何分配多个 GPU 推理实例?
当模型部署在多台 GPU 服务器上时,需要通过负载均衡实现请求分发。
常见的负载均衡策略包括:
4.1 轮询(Round Robin)
按照固定顺序分配请求。
请求1 → GPU实例1
请求2 → GPU实例2
请求3 → GPU实例3
请求4 → GPU实例1
优点:实现简单。
缺点:无法感知 GPU 当前负载。
4.2 加权轮询(Weighted Round Robin)
根据不同实例的计算能力分配请求。
例如:
| GPU实例 | 权重 | 请求分配比例 |
|---|---|---|
| 实例1 | 5 | 50% |
| 实例2 | 3 | 30% |
| 实例3 | 2 | 20% |
适合不同配置 GPU 混合部署的场景。
4.3 最少连接(Least Connections)
优先将请求分配给当前连接数较少的实例。
但对于大模型服务来说,连接数并不完全代表计算负载。
一个正在生成 2000 个 Token 的请求,与一个刚开始执行的请求,其 GPU 资源占用可能完全不同。
因此,生产环境还需要综合考虑:
-
GPU 显存使用率。
-
当前运行请求数量。
-
等待队列长度。
-
KV Cache 使用率。
-
Prefill 和 Decode 阶段的负载。
-
预计剩余生成 Token 数量。
核心思想:负载均衡不能只看请求数量,更要关注 GPU 实际计算和显存压力。
五、请求调度:大模型高并发的核心技术
请求调度是整个大模型服务架构中非常重要的部分。
传统 Web 服务通常采用线程池或连接池处理请求,而大模型推理需要更加精细的调度策略。
这是因为大模型推理主要包含两个阶段。
5.1 Prefill 阶段
Prefill 是输入提示词处理阶段。
例如用户输入:
请详细解释 Transformer 的注意力机制。
模型需要将输入文本转换为 Token,并通过 Transformer 网络计算输入序列的隐藏状态和 KV Cache。
Prefill 阶段的特点:
-
需要处理整个输入序列。
-
通常具有较高的计算并行度。
-
输入越长,计算量通常越大。
5.2 Decode 阶段
Decode 是逐 Token 生成阶段。
模型根据已有上下文,逐步预测下一个 Token。
例如:
Transformer
↓
是一种
↓
基于注意力机制
↓
的神经网络架构
Decode 阶段的特点:
-
通常每一步生成一个 Token。
-
需要持续访问历史 KV Cache。
-
对显存带宽和访存效率较为敏感。
-
单个请求的生成速度会影响整体响应时间。
5.3 Continuous Batching:连续批处理
传统静态 Batch 的处理方式是:
Batch 1:
请求A ─────────────── 完成
请求B ─────────────── 完成
请求C ─────────────── 完成
Batch 2:
等待 Batch 1 全部结束后再执行
这种方式存在一个问题:
如果请求 A 很快完成,而请求 B 还需要生成大量 Token,那么请求 A 释放出来的计算资源可能无法及时用于新请求。
Continuous Batching(连续批处理)解决了这个问题。
其核心思想是:
请求可以动态进入 Batch,已经完成的请求可以动态退出 Batch。
例如:
时间 T1:
请求 A + 请求 B + 请求 C
时间 T2:
请求 A 完成
请求 D 加入
时间 T3:
请求 B 完成
请求 E 加入
时间 T4:
请求 C + 请求 D + 请求 E
这样可以减少 GPU 空闲时间,提高整体吞吐量。
vLLM、TensorRT-LLM 等推理系统都支持面向动态请求的高效批处理能力,但具体调度机制和实现有所不同。
六、KV Cache:解决高并发推理的显存瓶颈
KV Cache 是大模型推理优化中的关键技术。
在 Transformer 自回归生成过程中,每生成一个新 Token,都需要利用历史 Token 的 Key 和 Value。
如果每次都重新计算历史 Token 的 K、V,会产生大量重复计算。
因此,大模型会将历史 Key 和 Value 缓存起来,这就是 KV Cache。
6.1 KV Cache 的工作原理
输入 Token
|
v
Transformer Layer
|
+------> Key (K)
|
+------> Value (V)
|
v
KV Cache
|
v
下一 Token 生成
|
v
读取历史 K 和 V
|
v
计算 Attention
KV Cache 能够减少重复计算,但也会占用大量 GPU 显存。
6.2 KV Cache 显存计算
对于标准多头注意力模型,KV Cache 的显存占用可以近似表示为:
其中:
-
(L):Transformer 层数。
-
(B):Batch 中的请求数量。
-
(S):每个请求的上下文 Token 数量。
-
(H_{KV}):Key/Value Head 数量。
-
(D):每个 Head 的维度。
-
(P):每个元素占用的字节数。
-
2:分别表示 Key 和 Value。
例如:
假设模型具有:
-
32 层 Transformer。
-
8 个 KV Head。
-
Head Dimension 为 128。
-
FP16 精度,每个元素占用 2 字节。
-
上下文长度为 4096 Token。
-
同时处理 10 个请求。
那么:
最终约为:
这只是 KV Cache 的理论占用,还没有计算模型权重、激活值、运行时开销和显存碎片。
6.3 PagedAttention
vLLM 提出的 PagedAttention 是解决 KV Cache 显存管理问题的重要技术。
传统 KV Cache 通常按照连续空间进行分配,容易产生显存碎片和空间浪费。
PagedAttention 借鉴操作系统虚拟内存分页的思想,将 KV Cache 划分为固定大小的 Block。
传统 KV Cache:
请求A:[连续显存空间---------]
请求B:[连续显存空间------]
请求C:[连续显存空间------------]
PagedAttention:
请求A:[Block 1][Block 5][Block 8]
请求B:[Block 2][Block 6]
请求C:[Block 3][Block 4][Block 9]
不同请求可以使用非连续的物理 Block,通过 Block Table 管理逻辑位置与物理位置的映射。
主要优势:
-
减少显存碎片。
-
提高 KV Cache 显存利用率。
-
支持更灵活的请求调度。
-
提高系统并发处理能力。
需要注意,PagedAttention 优化的是 KV Cache 的内存管理,并不意味着 KV Cache 本身不再占用显存。
七、推理引擎:vLLM、TensorRT-LLM 与 TGI
推理引擎是大模型高并发服务的核心执行组件。
它负责加载模型、管理 GPU 资源、执行模型计算以及生成 Token。
目前常见的推理框架包括:
7.1 vLLM
<Entity value="vLLM" category="software" disambig="开源大语言模型推理与服务框架"/>
vLLM 是一个专注于高吞吐量大模型推理和服务的开源框架。
核心技术:
-
PagedAttention。
-
Continuous Batching。
-
KV Cache 管理。
-
多 GPU 推理支持。
-
OpenAI 兼容 API。
适合需要快速构建高吞吐量 LLM API 服务的场景。
官方项目:https://github.com/vllm-project/vllm
7.2 TensorRT-LLM
<Entity value="TensorRT-LLM" category="software" disambig="NVIDIA 大语言模型 GPU 推理优化框架"/>
TensorRT-LLM 是 NVIDIA 推出的高性能大模型推理优化框架。
核心技术包括:
-
算子融合。
-
多 GPU 并行。
-
KV Cache 管理。
-
量化推理。
-
高性能 Attention 实现。
适合 NVIDIA GPU 环境下追求高性能和深度推理优化的场景。
官方项目:https://github.com/NVIDIA/TensorRT-LLM
7.3 Hugging Face TGI
<Entity value="Text Generation Inference" category="software" disambig="Hugging Face 大语言模型推理服务框架"/>
TGI 是 Hugging Face 推出的文本生成推理服务框架。
提供:
-
流式 Token 输出。
-
动态批处理。
-
Tensor Parallelism。
-
量化支持。
-
Prometheus 指标。
适合基于 Hugging Face 模型生态构建推理服务的场景。
官方项目:https://github.com/huggingface/text-generation-inference
7.4 三种框架对比
| 对比维度 | vLLM | TensorRT-LLM | TGI |
|---|---|---|---|
| 核心优势 | 高吞吐量、易部署 | NVIDIA GPU 深度优化 | Hugging Face 生态 |
| Paged KV 管理 | 支持 | 支持相关 KV Cache 优化 | 支持相关缓存管理 |
| 动态批处理 | 支持 | 支持 | 支持 |
| 多 GPU | 支持 | 支持 | 支持 |
| 部署难度 | 相对较低 | 相对较高 | 相对较低 |
| 典型场景 | 通用 LLM API | 高性能推理 | 模型生态集成 |
具体性能取决于模型结构、GPU 型号、推理参数、输入输出长度和框架版本,不能简单认为某个框架在所有场景下都最快。
八、分布式推理:如何实现多 GPU 并行?
当模型参数量非常大,单张 GPU 无法容纳模型权重和推理所需显存时,就需要使用多 GPU 并行技术。
常见方式包括:
8.1 Tensor Parallelism(张量并行)
张量并行是将模型中的矩阵计算拆分到多张 GPU 上执行。
例如,一个大型矩阵乘法可以被拆分成多个子矩阵:
输入 X
|
+--------+--------+
| | |
v v v
GPU 0 GPU 1 GPU 2
W0 W1 W2
| | |
+--------+--------+
|
v
汇总
|
v
输出 Y
优点:
-
可以将单层计算拆分到多个 GPU。
-
降低单张 GPU 的显存压力。
-
支持部署更大的模型。
缺点:
-
需要 GPU 之间进行通信。
-
对网络带宽和通信延迟较为敏感。
8.2 Pipeline Parallelism(流水线并行)
流水线并行将模型的不同 Layer 分配给不同 GPU。
例如:
输入
|
v
GPU 0:Layer 1 - Layer 8
|
v
GPU 1:Layer 9 - Layer 16
|
v
GPU 2:Layer 17 - Layer 24
|
v
GPU 3:Layer 25 - Layer 32
|
v
输出
优点:
-
将模型层分布在多张 GPU 上。
-
减少单卡模型权重占用。
缺点:
-
可能出现流水线气泡。
-
阶段间存在通信和调度开销。
8.3 Data Parallelism(数据并行)
数据并行主要用于多个 GPU 副本同时处理不同请求。
用户请求
|
v
负载均衡
+--------+--------+
| | |
v v v
GPU 0 GPU 1 GPU 2
模型副本 模型副本 模型副本
| | |
v v v
结果0 结果1 结果2
| | |
+--------+--------+
|
v
返回结果
对于在线推理服务,数据并行通常意味着部署多个模型副本来承接独立请求,而不是每次推理都进行梯度同步。
8.4 三种并行方式对比
| 并行方式 | 拆分对象 | 主要作用 |
|---|---|---|
| 张量并行 | 模型计算矩阵 | 加速单层计算 |
| 流水线并行 | Transformer Layer | 分摊模型层 |
| 数据并行 | 模型副本 | 提高请求处理能力 |
在大型模型部署中,还可以将多种并行方式组合使用。
九、缓存优化:减少重复推理请求
除了 GPU 推理优化,还可以通过缓存减少重复计算。
在企业级大模型应用中,部分请求具有较高重复率。
例如:
用户A:什么是 RAG?
用户B:什么是 RAG?
用户C:什么是 RAG?
如果每次都调用大模型重新生成答案,会造成不必要的计算资源消耗。
9.1 Redis 缓存
<Entity value="Redis" category="software" disambig="内存数据结构存储与缓存系统"/>
可以将常见问题及其答案缓存到 Redis 中。
import redis
import hashlib
r = redis.Redis(
host="localhost",
port=6379,
decode_responses=True
)
def get_cache_key(prompt):
return hashlib.sha256(
prompt.encode("utf-8")
).hexdigest()
def query_cache(prompt):
key = get_cache_key(prompt)
return r.get(key)
def save_cache(prompt, answer):
key = get_cache_key(prompt)
r.setex(key, 3600, answer)
当用户请求到来时:
用户请求
|
v
Redis 查询缓存
|
+---- 命中 ----> 返回缓存结果
|
+---- 未命中 --> 调用 LLM
|
v
生成答案
|
v
写入缓存
|
v
返回用户
实际生产环境中,缓存 Key 不能只考虑 Prompt,还应考虑模型版本、系统提示词、采样参数、用户权限和知识库版本等因素。
此外,还需要处理缓存过期、并发击穿、热点 Key 和隐私隔离问题。
9.2 Prefix Cache
Prefix Cache 是一种针对相同前缀上下文的缓存优化技术。
例如,多个用户都使用相同的系统提示词:
你是一个专业的 AI 技术助手。
用户问题:什么是 Transformer?
系统可以复用相同前缀对应的 KV Cache,从而减少重复 Prefill 计算。
对于具有大量共享 Prompt 的企业应用,Prefix Cache 可以带来明显收益。
十、流式输出:提升用户响应体验
大模型生成答案通常需要一定时间。
如果等到所有 Token 生成完毕后再返回,用户可能需要等待较长时间。
因此,生产环境通常采用流式输出(Streaming)。
常见实现方式包括:
-
SSE(Server-Sent Events)。
-
WebSocket。
-
HTTP Chunked Transfer Encoding。
其中,SSE 非常适合大模型文本生成场景。
10.1 SSE 工作流程
用户请求
|
v
API Gateway
|
v
LLM 推理服务
|
v
逐 Token 生成
|
+---- Token 1 ----> 用户
|
+---- Token 2 ----> 用户
|
+---- Token 3 ----> 用户
|
+---- Token N ----> 用户
10.2 Python 流式输出示例
以下使用 FastAPI 和 OpenAI 兼容接口演示一个简单的 SSE 服务。
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from openai import OpenAI
app = FastAPI()
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="EMPTY"
)
@app.get("/chat")
def chat(prompt: str):
def generate():
response = client.chat.completions.create(
model="your-model",
messages=[
{"role": "user", "content": prompt}
],
stream=True
)
try:
for chunk in response:
content = chunk.choices[0].delta.content
if content:
yield f"data: {content}\n\n"
yield "data: [DONE]\n\n"
finally:
response.close()
return StreamingResponse(
generate(),
media_type="text/event-stream"
)
注意:这是用于说明流式传输的简化示例。生产环境还需要实现 SSE 数据编码、异常处理、客户端断连检测、超时控制和并发连接管理。
十一、监控与性能优化:如何判断服务是否健康?
一个高并发大模型系统,不能只关注 QPS。
因为大模型请求的计算成本差异很大。
例如:
-
请求 A:输入 100 Token,输出 50 Token。
-
请求 B:输入 10000 Token,输出 5000 Token。
虽然两者都只算一次请求,但 GPU 资源消耗完全不同。
因此需要从多个维度监控。
11.1 核心性能指标
| 指标 | 含义 | 优化目标 |
|---|---|---|
| QPS | 每秒请求数 | 提高请求处理能力 |
| TPS | 每秒生成 Token 数 | 提高 Token 吞吐量 |
| TTFT | 首 Token 延迟 | 降低首次响应等待 |
| ITL | Token 间隔时间 | 提高生成流畅度 |
| P95 | 95 分位延迟 | 控制尾部延迟 |
| GPU Utilization | GPU 利用率 | 提高计算资源利用 |
| KV Cache Usage | KV Cache 使用率 | 控制显存压力 |
| Queue Length | 等待队列长度 | 避免请求堆积 |
| Error Rate | 请求错误率 | 提高系统稳定性 |
11.2 监控架构
LLM 推理服务
|
v
Metrics Exporter
|
v
Prometheus
|
v
Grafana
|
+--------+--------+
| | |
v v v
GPU监控 延迟监控 吞吐量监控
| | |
+--------+--------+
|
v
告警系统
常见技术:
-
Prometheus:指标采集与存储。
-
Grafana:性能可视化。
-
DCGM Exporter:NVIDIA GPU 指标采集。
-
OpenTelemetry:分布式链路追踪。
-
ELK:日志分析。
十二、实战:使用 vLLM 搭建高并发大模型 API 服务
下面通过一个简单案例,搭建基于 vLLM 的大模型推理服务。
12.1 安装 vLLM
pip install vllm
实际安装时需要根据 CUDA、GPU 和 PyTorch 环境选择兼容版本。
12.2 启动模型服务
vllm serve Qwen/Qwen2.5-7B-Instruct \
--host 0.0.0.0 \
--port 8000 \
--max-model-len 8192 \
--max-num-seqs 128
这里:
-
--host:指定服务监听地址。 -
--port:指定服务端口。 -
--max-model-len:最大模型上下文长度。 -
--max-num-seqs:调度器允许处理的最大序列数量。
注意,参数需要根据模型配置、显存大小和 vLLM 版本调整,max-num-seqs 不代表一定可以同时成功运行这么多长上下文请求。
12.3 发送并发请求
安装依赖:
pip install aiohttp
使用 asyncio 实现简单并发测试:
import asyncio
import aiohttp
import time
URL = "http://localhost:8000/v1/chat/completions"
async def send_request(session, index):
payload = {
"model": "Qwen/Qwen2.5-7B-Instruct",
"messages": [
{
"role": "user",
"content": f"请介绍人工智能的发展历史,编号:{index}"
}
],
"max_tokens": 128,
"temperature": 0.7
}
async with session.post(
URL,
json=payload
) as response:
result = await response.json()
return response.status, result
async def main():
concurrency = 20
connector = aiohttp.TCPConnector(
limit=concurrency
)
async with aiohttp.ClientSession(
connector=connector
) as session:
start = time.time()
tasks = [
send_request(session, i)
for i in range(concurrency)
]
results = await asyncio.gather(
*tasks,
return_exceptions=True
)
elapsed = time.time() - start
success = sum(
1 for item in results
if not isinstance(item, Exception)
and item[0] == 200
)
print("总请求数:", concurrency)
print("成功请求数:", success)
print("总耗时:", elapsed)
asyncio.run(main())
这段代码可以帮助我们验证服务在一定并发量下的基本运行情况。
但需要注意:
一次发送 20 个并发请求,并不等于系统能够稳定承载 20 QPS。
真正的压测还需要考虑持续时间、请求到达速率、输入输出 Token 分布、P95/P99 延迟、错误率和 GPU 显存情况。
12.4 生产环境部署建议
生产环境可以进一步引入:
-
Nginx 或 Envoy:负责流量接入与负载均衡。
-
多个 vLLM 实例:实现模型副本部署。
-
Redis:缓存热点请求。
-
Prometheus + Grafana:监控 GPU 和推理性能。
-
Kubernetes:实现容器编排和动态扩缩容。
-
消息队列:承接适合异步执行的长任务。
对于流式生成请求,不建议简单地将所有请求放入普通消息队列后等待完整结果,而应采用支持流式响应和连接生命周期管理的请求调度机制。
十三、企业级大模型高并发架构优化策略
在真实业务中,高并发服务架构往往需要从多个层面协同优化。
13.1 模型层优化
-
FP16/BF16 推理。
-
INT8/INT4 量化。
-
FlashAttention。
-
KV Cache 优化。
-
Speculative Decoding。
目标:减少计算量、显存占用和推理延迟。
13.2 推理引擎优化
-
Continuous Batching。
-
PagedAttention。
-
Prefix Caching。
-
Chunked Prefill。
-
合理设置最大并发序列数。
目标:提高 GPU 利用率和 Token 吞吐量。
13.3 服务层优化
-
API 限流。
-
动态负载均衡。
-
请求优先级调度。
-
超时控制。
-
熔断与降级。
-
流式输出。
目标:提升服务稳定性和用户体验。
13.4 基础设施优化
-
多 GPU 部署。
-
Kubernetes 容器编排。
-
GPU 资源监控。
-
自动扩缩容。
-
多机分布式推理。
目标:提高系统可用性和资源弹性。
十四、总结
大模型高并发服务架构,本质上是一个融合了模型推理、GPU 资源管理、请求调度、分布式计算和云原生技术的综合系统。
从整体来看,可以将其总结为六个关键环节:
-
API Gateway: 负责身份认证、限流和流量接入。
-
负载均衡: 将请求合理分配到多个推理实例。
-
请求调度: 通过 Continuous Batching 提高并发处理能力。
-
推理引擎: 通过 vLLM、TensorRT-LLM 等框架优化 GPU 推理。
-
缓存优化: 通过 KV Cache、Prefix Cache 和 Redis 减少重复计算。
-
监控运维: 通过 Prometheus、Grafana 等保障系统稳定运行。
对于想要从事大模型应用开发、推理优化、AI Infra 和大模型部署的同学来说,高并发服务架构是一项非常值得深入学习的核心技术。
真正的大模型工程能力,不仅是能够调用模型 API,更重要的是能够让模型在真实业务环境下稳定、高效、低成本地运行。
更多推荐


所有评论(0)