multi-model-server
统一推理Serving平台,通过 REST API 为 MXNet、ONNX 等框架的深度学习模型提
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
统一推理Serving平台,通过 REST API 为 MXNet、ONNX 等框架的深度学习模型提
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
2017年,深度学习工程师张明(化名)终于完成了他的图像分类模型调参,训练准确率达到了令他满意的92%。他兴冲冲地把模型文件提交给运维团队部署,结果对方犯了难:这个模型是用PyTorch训练的,但公司的生产环境全部跑在MXNet上,需要做框架迁移。更糟糕的是,模型推理还需要封装成HTTP服务、配置端口、处理并发……运维同事挠头说:"这个模型Serving的事情我们不太懂,你们能不能搞个标准包?"
这就是 AWS Multi Model Server(MMS)诞生的核心背景——让深度学习模型的部署像部署普通Web服务一样简单。
Multi Model Server 由 AWS(亚马逊云科技)团队开发并维护,2017年10月首次开源,仓库位于 awslabs/multi-model-server。项目最初的驱动因素是 AWS SageMaker 平台内部对统一模型推理服务的需求——需要一套能同时服务MXNet、PyTorch(通过ONNX)、TensorFlow等多种框架模型的系统。
MMS 获得了 1027 stars、229 forks,Apache-2.0 开源许可, topics 覆盖 ai、deep-learning、inference、mxnet、neural-network、onnx、server 等核心标签,充分反映了项目的技术定位。
MMS 的设计哲学是"Convention over Configuration"——遵循约定,减少配置。
最简部署流程只需三步:
# 1. 安装(pip 一键)
pip install multi-model-server
# 2. 启动服务(指定模型,一行搞定)
multi-model-server --start --models squeezenet=https://s3.amazonaws.com/model-server/squeezenet_v1.1.mar
# 3. 推理请求
curl -X POST http://127.0.0.1:8080/predictions/squeezenet -T kitten.jpg
返回结果示例:
[
{"probability": 0.858, "class": "n02124075 Egyptian cat"},
{"probability": 0.091, "class": "n02123045 tabby, tabby cat"},
...
]
**模型打包机制(.mar 文件)**是 MMS 的核心创新之一。通过 model-archiver 工具,开发者可以将任意框架的模型(Checkpoint文件 + 推理服务代码 + 配置文件)打包成单一 .mar 文件,实现模型的可移植性和版本管理:
model-archiver --model-name my_model --model-file model.py --handler handler.py --extra-files indexer.pkl
MMS 采用经典的 Frontend-Worker 架构:
┌─────────────────┐
│ HTTP Client │
└────────┬────────┘
│ HTTP POST /predictions/{model}
▼
┌──────────────────────────────────────────────────────────┐
│ Frontend(Java) │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────────┐ │
│ │ HTTP │ │ Router │ │ Model Service Loader │ │
│ │ Server │→ │ │→ │ + Worker Manager │ │
│ │(Netty) │ │ │ │ │ │
│ └──────────┘ └──────────┘ └──────────┬───────────┘ │
└─────────────────────────────────────────│────────────────┘
│ 内部通信协议
┌────────────▼────────────┐
│ Backend Worker(Python) │
│ ┌───────────────────┐ │
│ │ BaseModelService │ │
│ │ + inference() │ │
│ │ + preprocess() │ │
│ │ + postprocess() │ │
│ └───────────────────┘ │
└──────────────────────────┘
**Frontend(Java/Netty)**负责:
**Backend Worker(Python)**负责:
handler.py 扩展推理行为这种架构的优势在于:Frontend 用 Java 保证了高性能网络 IO,Backend 用 Python 保证深度学习框架的灵活接入。
MMS 支持同时加载多个模型,并且支持根据硬件自动扩缩容 Worker:
multi-model-server --start --models squeezenet=https://s3.amazonaws.com/model-server/squeezenet_v1.1.mar resnet50=https://s3.amazonaws.com/model-server/resnet50_v1.mar
启动时会自动将 Backend Worker 数量设置为等于可用 vCPU(CPU模式)或 GPU 数量(GPU模式),无需手动配置。
Management API 支持运行时操作:
MMS 对 ONNX(Open Neural Network Exchange)的原生支持是其框架无关性的关键。ONNX 定义了一套标准的模型中间表示格式,主流框架(PyTorch、TensorFlow、Caffe2、Scikit-learn等)均支持导出为 ONNX 格式。这意味着:
MMS 通过 ONNX Runtime 执行推理,实现了真正的框架无关Serving。
| 部署方式 | 难度 | 适用场景 |
|---|---|---|
| pip install | ⭐ 简单 | 快速验证、单机测试 |
| Docker CPU/GPU | ⭐⭐ 中等 | 生产级部署(推荐) |
| AWS SageMaker | ⭐⭐ 简单 | 云原生、弹性伸缩 |
| ECS Fargate | ⭐⭐ 中等 | 无服务器容器部署 |
Docker 部署示例:
# CPU 镜像
docker run -p 8080:8080 -p 8081:8081 awsiam/multi-model-server:cpu multi-model-server --start --models squeezenet=https://s3.amazonaws.com/model-server/squeezenet_v1.1.mar
# GPU 镜像(需要 nvidia-docker)
docker run --runtime nvidia -p 8080:8080 -p 8081:8081 awsiam/multi-model-server:gpu multi-model-server --start --models squeezenet=https://s3.amazonaws.com/model-server/squeezenet_v1.1.mar
项目提供专门的 Dockerfile.cpu 和 Dockerfile.gpu,基于 Ubuntu 18.04 + Python 3 + OpenJDK 8,包含预装的 MXNet MKL/CUDA 版本。
README 明确指出了若干生产环境注意事项:
这些"缺点"实际上体现了 MMS 的设计原则:保持核心职责清晰,将横切关注点交给专业的外部组件处理。
通过代码结构分析,MMS 体现了以下技术特点:
mms/ 目录下有 model_service/、metrics/、protocol/ 等子模块model-archiver/ 独立工具包,可单独 pip install 使用tests/ 和 mms/tests/ 目录提供完整单元测试.circleci/ 配置 CircleCI 自动化构建测试局限性:
现代替代方案:
尽管 MMS 的直接维护已放缓,但它对模型推理服务领域的影响是深远的:
.mar 模型打包格式影响了后续 BentoML 等工具的设计思路对于需要在私有环境部署 MXNet/ONNX 模型的企业来说,MMS 仍然是一个稳定可靠的选择;对于新项目,更推荐评估 Triton 或 BentoML。
项目信息