一、为什么大模型需要高并发服务架构?

随着大语言模型(LLM)在智能客服、AI Agent、企业知识库、智能办公等场景中的广泛应用,越来越多的企业开始将大模型部署为在线 API 服务。

但大模型服务与传统 Web 服务存在明显区别。

传统 Web 服务通常处理的是数据库查询、业务逻辑和轻量级计算,而大模型推理需要消耗大量 GPU 显存和计算资源,并且一次请求可能持续数秒甚至数十秒。

当大量用户同时发起请求时,系统可能出现以下问题:

  1. 请求堆积: 大量请求同时进入,GPU 无法及时处理。

  2. 显存不足: 多个请求同时进行推理,KV Cache 占用大量显存。

  3. 响应延迟增加: 用户需要等待较长时间才能获得结果。

  4. GPU 利用率低: 请求调度不合理,导致 GPU 计算资源无法充分利用。

  5. 服务稳定性下降: 突发流量可能导致服务超时、OOM 或进程崩溃。

因此,企业部署大模型时,不能只关注模型推理速度,还需要构建一套完整的高并发服务架构。

大模型高并发服务架构的核心目标是:

  • 提高 GPU 资源利用率。

  • 提升系统吞吐量(Throughput)。

  • 降低首 Token 延迟(TTFT)。

  • 降低 Token 间隔时间(ITL)。

  • 支持动态扩缩容。

  • 保证系统在高流量下稳定运行。

二、大模型高并发服务整体架构

一个成熟的大模型在线服务系统,通常由接入层、网关层、请求调度层、推理服务层、缓存层和监控层组成。

2.1 整体架构图

整个架构可以分为六个核心模块。

模块核心技术主要职责
接入层CDN、WAF流量接入与安全防护
网关层Nginx、Envoy鉴权、限流、路由
调度层Redis、消息队列请求排队与调度
推理层vLLM、TensorRT-LLMGPU 模型推理
缓存层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 限流中常用的一种方式。

其基本原理是:

  1. 系统按照固定速率生成令牌。

  2. 请求到来时尝试获取令牌。

  3. 获取成功则允许请求通过。

  4. 没有令牌则拒绝请求或进入等待队列。

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实例权重请求分配比例
实例1550%
实例2330%
实例3220%

适合不同配置 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 的显存占用可以近似表示为:

[ M_{KV}=2\times L\times B\times S\times H_{KV}\times D\times P ]

其中:

  • (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 个请求。

那么:

[ M_{KV}=2\times32\times10\times4096 \times8\times128\times2 ]

最终约为:

[ M_{KV}=5.37GB ]

这只是 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 管理逻辑位置与物理位置的映射。

主要优势:

  1. 减少显存碎片。

  2. 提高 KV Cache 显存利用率。

  3. 支持更灵活的请求调度。

  4. 提高系统并发处理能力。

需要注意,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 三种框架对比

对比维度vLLMTensorRT-LLMTGI
核心优势高吞吐量、易部署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 延迟降低首次响应等待
ITLToken 间隔时间提高生成流畅度
P9595 分位延迟控制尾部延迟
GPU UtilizationGPU 利用率提高计算资源利用
KV Cache UsageKV 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 生产环境部署建议

生产环境可以进一步引入:

  1. Nginx 或 Envoy:负责流量接入与负载均衡。

  2. 多个 vLLM 实例:实现模型副本部署。

  3. Redis:缓存热点请求。

  4. Prometheus + Grafana:监控 GPU 和推理性能。

  5. Kubernetes:实现容器编排和动态扩缩容。

  6. 消息队列:承接适合异步执行的长任务。

对于流式生成请求,不建议简单地将所有请求放入普通消息队列后等待完整结果,而应采用支持流式响应和连接生命周期管理的请求调度机制。

十三、企业级大模型高并发架构优化策略

在真实业务中,高并发服务架构往往需要从多个层面协同优化。

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 资源管理、请求调度、分布式计算和云原生技术的综合系统。

从整体来看,可以将其总结为六个关键环节:

  1. API Gateway: 负责身份认证、限流和流量接入。

  2. 负载均衡: 将请求合理分配到多个推理实例。

  3. 请求调度: 通过 Continuous Batching 提高并发处理能力。

  4. 推理引擎: 通过 vLLM、TensorRT-LLM 等框架优化 GPU 推理。

  5. 缓存优化: 通过 KV Cache、Prefix Cache 和 Redis 减少重复计算。

  6. 监控运维: 通过 Prometheus、Grafana 等保障系统稳定运行。

对于想要从事大模型应用开发、推理优化、AI Infra 和大模型部署的同学来说,高并发服务架构是一项非常值得深入学习的核心技术。

真正的大模型工程能力,不仅是能够调用模型 API,更重要的是能够让模型在真实业务环境下稳定、高效、低成本地运行。

Logo

更多推荐