L3 · 专题文章

模型服务

模型部署API 服务推理架构

本页只讲 4 条最关键判断,不写百科

4核心点
先记住模型服务不是加载模型,而是交付可运维的推理能力

不掌握并发控制、版本管理与可观测性,服务上线必现延迟抖动或故障难定位。

LIVE
CORE 模型服务
01 WHAT

是什么

模型服务是将训练好的机器学习模型封装为可通过网络调用的 API 或微服务,供业务系统或应用实时获取推理结果。

02 WHY

为什么

业务系统需要低延迟、高可用的推理能力,而原始模型文件无法直接处理并发请求、版本管理与资源调度,模型服务填补了这一工程缺口。

03 HOW

怎么做

通过框架(如 vLLM、Triton、FastAPI)加载模型权重,暴露 REST/gRPC 接口,配置并发控制与自动扩缩容。

04 WHEN

什么时候

当需要对外提供稳定、可监控、可水平扩展的推理能力时使用;若仅需离线批处理或单机调试,则无需引入完整服务架构。

FOCUS

先记住这些

只留最重要的判断,细节见下方实践
01 接口标准化

统一契约是服务化的前提

必须定义清晰的输入输出 Schema,否则下游集成混乱且无法自动化测试。

02 并发与批处理

动态 batching 决定性能上限

固定 batch 会导致长请求阻塞短请求;动态 batching 按显存与超时自动合并请求,是吞吐优化的核心。

03 版本与路由

无版本管理则无法安全迭代

模型更新必须支持灰度发布与秒级回滚,否则线上故障无法快速恢复。

04 可观测性

无指标则无法排障与控本

必须暴露延迟分位数、QPS、GPU 利用率与 Token 用量,否则无法定位瓶颈或优化资源。

PROBLEM / POSITION / INTERFACE

先弄清它为什么存在,以及谁在使用

不从历史开始,从真实工作关系开始。
  1. 01 解决的问题

    业务系统需要实时调用模型进行预测或生成,但直接加载模型文件无法处理并发、版本切换或资源隔离。

    缺乏服务化会导致延迟波动大、无法灰度发布、资源利用率低、故障难以定位与恢复。

    成功标准
    模型以标准接口暴露,支持高并发、低延迟、可观测、可回滚,且资源成本可控。
  2. 02 AI 生态位

    位于模型训练/微调之后、业务应用之前,是 AI 能力交付的工程枢纽。

    上游
    依赖训练好的模型权重、Tokenizer、配置参数及可能的预处理逻辑。
    下游
    为前端应用、Agent 系统、数据管道或第三方服务提供结构化推理输出。
  3. 03 人的生态位

    工程师负责选型、部署、监控与调优;业务方通过接口消费推理结果。

    适合使用
    需要对外提供稳定 API、支持多租户/多版本、要求 SLA 与可观测性时。
    不必使用
    仅做本地实验、离线批处理、或单次调用延迟不敏感且无并发需求时。
  4. 04 独特价值

    提供标准化、可观测、可水平扩展的推理交付层,解耦模型与业务逻辑。

    需平衡延迟、吞吐、显存占用与成本,同时处理版本热更新、故障转移与流量突发。

    复杂度判断
    复杂度不是功能数量,而是控制与验证成本。

INTERFACE FLOW

谁在操作,信息怎样流动

  1. WHO OPERATES

    HUMAN负责服务选型、部署配置、监控告警与版本管理

    SYSTEM负责请求路由、模型加载、并发调度与结果返回

  2. INPUT

    业务请求(文本、图像、结构化数据等)及上下文参数

  3. CONTROL

    并发限制、超时设置、批处理大小、模型版本、路由策略、鉴权机制

  4. OUTPUT

    结构化推理结果(JSON/Protobuf),可能附带元数据如耗时、Token 用量、置信度

FLOW

请求处理流程

01请求接入网关校验鉴权与限流,按路由策略分发至对应模型实例
02动态批处理引擎将等待窗口内的请求按长度与显存合并,执行前向计算
03结果拆分与返回将批处理结果按原始请求 ID 拆分,附加元数据后返回
04指标上报记录本次请求的延迟、Token 消耗与状态码,推送至监控平台
CODE / PYTHON最小 Python 调用
import os
import requests

url = os.environ["MODEL_SERVICE_URL"]
headers = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
payload = {
    "model": "llama-3-8b",
    "messages": [{"role": "user", "content": "用一句话解释动态批处理"}],
    "max_tokens": 50
}
resp = requests.post(f"{url}/v1/chat/completions", json=payload, headers=headers)
print(resp.json()["choices"][0]["message"]["content"])

最短闭环:读环境变量 → 构造请求 → 调用服务 → 打印结果。真实密钥与服务地址不要硬编码。

JSON / RESPONSE典型返回(示意)
{
  "id": "svc-req-789",
  "model": "llama-3-8b",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "动态批处理将多个请求合并为一次 GPU 计算,提升吞吐并降低平均延迟。"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 15,
    "completion_tokens": 22,
    "total_tokens": 37
  },
  "latency_ms": 142
}

PRACTICE

上线前必查项

是否定义了清晰的输入输出 JSON Schema 并附带示例?
是否配置了动态 batching 与最大等待超时?
是否支持多版本共存与灰度流量切换?
是否暴露了 P99 延迟、QPS、GPU 利用率与错误率指标?
是否设置了自动扩缩容阈值与健康检查探针?

FAQ

常见问题

选型、用法与失败,不复述定义。
01模型服务和直接加载模型有什么区别?

服务化提供并发控制、版本管理、可观测性与标准化接口,直接加载仅适合单机调试或离线任务。

避免将实验代码直接推上线导致延迟抖动与故障难定位。
02最小可用方式是什么?

用 FastAPI 或 vLLM 暴露 /v1/chat/completions 接口,配置基础限流与日志即可跑通闭环。

帮助快速验证服务可用性,再逐步叠加高级特性。
03什么时候不需要模型服务?

仅做本地实验、离线批处理、或单次调用延迟不敏感且无并发需求时。

控制系统成本与运维负担,避免过度工程。
04如何判断服务是否出现性能瓶颈?

观察 P99 延迟突增、GPU 利用率低于 60% 或队列积压,通常指向 batching 策略或显存分配不当。

快速定位问题,避免盲目扩容。

NEXT

下一步

推理加速