1. 推理服务概述

大家好,我是你们的讲师。今天咱们聊聊推理服务——这个在AI落地中绕不开的话题。

说实话,我见过不少团队,模型训练得漂漂亮亮,一到上线就抓瞎。为什么?因为训练和推理,根本是两码事。你想想看,训练时你可以用A100慢慢跑,batch size调大点,精度用float32,没人催你。但推理呢?用户点一下按钮,你必须在几百毫秒内给出结果,还得稳定、还得省钱。

嗯,这就是推理服务要解决的问题。

什么是推理服务

推理服务,说白了就是把训练好的模型部署到生产环境,对外提供API接口,让业务系统能调用它做预测。

它不只是一个模型文件加一个HTTP服务那么简单。一个成熟的推理服务,至少得管这几件事:

  • 模型加载与管理——模型放哪、怎么加载、要不要热更新
  • 请求处理——接收输入、做预处理、跑模型、后处理、返回结果
  • 资源调度——GPU显存怎么分、并发请求怎么排队、要不要做批处理
  • 监控与日志——延迟、吞吐量、错误率,这些都得盯着
  • 版本管理——模型迭代了,怎么平滑切换,怎么回滚

核心要点:推理服务不是"把模型跑起来"就完事了,而是"让模型在生产环境稳定、高效、可运维地跑起来"。

推理服务与训练的区别

我刚开始带团队时,有个同事直接把训练代码改了个端口就当推理服务上线了。结果呢?显存爆了、延迟飙了、用户投诉了。后来我让他把训练和推理的区别列了个表,贴在工位上——

维度 训练 推理
目标 找到最优参数 快速、稳定地预测
精度需求 高精度(float32/16) 可接受精度下尽量低精度(int8/FP8)
延迟要求 不敏感,几小时都行 敏感,通常要求毫秒级
吞吐量 单次大batch 高并发、小batch或动态batch
硬件利用 尽量占满GPU 平衡延迟与利用率
框架依赖 PyTorch/TF完整框架 可优化、可剪裁、可转ONNX/TensorRT
运维需求 低,实验环境即可 高,需要监控、扩缩容、版本管理

你看,从精度到延迟,从框架到运维,几乎每个维度都在"反着来"。所以千万别拿训练代码直接当推理服务用——我曾经吃过这个亏,那次事故让我加了三天班。

常见的推理框架对比

市面上推理框架不少,我挑三个最有代表性的聊聊:Triton Inference Server、TorchServe、BentoML。这三个我都用过,各有各的脾气。

Triton Inference Server

NVIDIA出品,业界标杆。我最早接触Triton是在一个视频理解项目里,模型又大又杂,有PyTorch的、有TensorRT的、还有自定义算子。Triton的多框架支持让我省了不少事——一个服务端,同时管着不同框架的模型,互不干扰。

它最厉害的是动态批处理和并发模型执行。你想想看,如果每个请求都单独跑一次模型,GPU利用率低得可怜。Triton会自动攒一批请求,凑够一定数量或等够一定时间,再一起送进GPU。吞吐量能翻好几倍。

不过,Triton的配置有点繁琐。你得写模型配置文件,定义输入输出格式、batch策略、优化选项。我第一次配的时候,光一个模型就折腾了大半天。

TorchServe

PyTorch官方出品,跟PyTorch生态无缝衔接。如果你团队全是PyTorch栈,TorchServe上手最快——模型导出、打包、部署,一条龙。

我记得有个小团队,模型迭代特别快,一周发两三个版本。TorchServe的模型版本管理和RESTful API让他们很舒服,改个版本号就能切换,不用改代码。

但TorchServe的性能优化不如Triton。它不支持动态批处理,也不支持多框架混布。如果你的场景对延迟和吞吐要求不高,或者模型比较单一,TorchServe够用。否则,还是得看Triton。

BentoML

BentoML走的是"开发者体验"路线。它把模型、预处理、后处理、依赖环境打包成一个Bento,然后一键部署成REST API或gRPC服务。

我个人很喜欢BentoML的Python原生体验。你写一个Python类,定义好输入输出,加几个装饰器,服务就搭好了。对于快速原型验证,BentoML简直是神器。

但BentoML的生产级特性相对弱一些。它的动态批处理是后来才加的,多GPU支持也不如Triton成熟。如果你做的是中小规模服务,或者团队以Python工程师为主,BentoML很合适。大规模生产环境,还是Triton更稳。

三框架对比一览

特性 Triton TorchServe BentoML
框架支持 多框架(PyTorch/TF/ONNX/TensorRT/自定义) 仅PyTorch 多框架(PyTorch/TF/ONNX/Scikit-learn等)
动态批处理 原生支持,成熟 不支持 支持,但较新
性能优化 最强(TensorRT集成、并发模型执行) 一般 中等
上手难度 较高(配置多) 低(PyTorch用户友好) 低(Python原生)
生产运维 强(监控、扩缩容、版本管理) 中等 中等
适用场景 大规模、高性能、多模型混布 PyTorch单一模型、快速部署 快速原型、中小规模、Python团队

我的建议:如果你刚开始做推理服务,从BentoML或TorchServe入手,先跑通流程。等业务量上来了,再迁移到Triton做性能优化。别一上来就搞Triton,配置能把人劝退。

推理服务的核心流程

不管用哪个框架,推理服务的基本流程都差不多。我画了张图,帮你理清思路——

推理服务核心流程 推理服务核心流程 客户端请求 请求预处理(解析/校验/转换) 模型推理 后处理(解码/过滤/格式化) 返回响应 关键优化点 • 动态批处理:攒请求一起跑 • 模型量化:int8/FP8加速 • 异步推理:不阻塞主线程 常见坑 • 预处理/后处理太慢 • 显存泄漏没释放 • 模型版本没管理

流程看着简单,但每个环节都有坑。我举几个例子——

  • 预处理太慢:有一次,我的模型推理只用了5ms,但图片解码用了50ms。后来我把解码挪到客户端做,延迟直接降了10倍。
  • 后处理没优化:NMS(非极大值抑制)在CPU上跑很慢,换成GPU实现后,吞吐量翻了一倍。
  • 动态批处理没开:默认单请求推理,GPU利用率只有10%。开了动态批处理后,利用率飙到80%。

避坑指南:我曾经在一个OCR服务里,预处理用了PIL的resize,后处理用了Python的for循环。结果模型推理只占20%的时间,剩下80%全耗在前后处理上。后来我把预处理换成OpenCV,后处理用numpy向量化,整体延迟降了60%。记住——推理服务的瓶颈往往不在模型,而在数据流。

小结

这一章我们聊了推理服务是什么、它跟训练的区别、三个主流框架的对比,以及核心流程。说白了,推理服务就是把模型从"实验室"搬到"生产线"的过程。框架选型没有银弹——Triton适合大厂、TorchServe适合PyTorch团队、BentoML适合快速迭代。选哪个,取决于你的团队、场景和资源。