mosec

GitHub
894 72 简单 3 次阅读 3天前Apache-2.0图像开发框架音频语言模型
AI 解读 由 AI 自动生成,仅供参考

mosec 是一个高性能的机器学习模型在线服务框架,帮助开发者快速将训练好的模型部署为高效、稳定的后端 API。它解决了模型从离线测试到线上服务过程中常见的性能瓶颈问题,比如低吞吐、高延迟和资源利用率不足。mosec 特别适合熟悉 Python 的 AI 开发者或算法工程师使用,尤其适用于需要在云环境中部署 CPU/GPU 混合任务、追求高并发与低延迟的场景。其核心亮点包括基于 Rust 构建的高性能调度层、支持动态批处理(dynamic batching)以提升推理效率,以及通过多阶段流水线(pipelined stages)灵活编排预处理、推理和后处理任务。此外,mosec 原生支持模型预热、优雅关闭和 Prometheus 监控,便于集成到 Kubernetes 等容器化运维体系中,让开发者更专注于模型本身和业务逻辑。

使用场景

某AI创业公司正在为电商平台开发一个“AI商品图生成”服务,用户输入商品描述即可实时生成高质量营销图片,后端基于Stable Diffusion模型提供支持。

没有 mosec 时

  • 直接用Flask封装模型,每个请求独占GPU资源,高并发下GPU利用率低、响应延迟飙升至10秒以上
  • 手动实现批处理逻辑复杂且易出错,难以动态合并不同用户的文本生成请求
  • CPU预处理(如文本编码)和GPU推理耦合在同一进程,无法并行,造成资源闲置
  • 缺乏生产级能力:无优雅停机、无指标监控,Kubernetes部署后难以运维和扩缩容

使用 mosec 后

  • 利用mosec的动态批处理能力,自动聚合多个用户请求,在GPU上批量推理,吞吐量提升4倍,平均延迟降至2秒内
  • 通过mosec的流水线机制,将文本编码(CPU密集)与图像生成(GPU密集)拆分为独立阶段,并行执行,硬件利用率接近满载
  • 内置Prometheus指标暴露、模型预热和优雅关闭功能,轻松集成到现有K8s集群,运维成本大幅降低
  • 仅需编写标准Python类继承Worker,无需修改原有模型代码,快速上线稳定服务

mosec让团队以极低改造成本,将实验阶段的生成模型高效转化为高并发、可运维的生产级API服务。

运行环境要求

操作系统
  • Linux
  • macOS
GPU

未说明

内存

未说明

依赖
notes支持从 PyPI、conda 或源码安装;若从源码构建需先安装 Rust;示例中使用了 msgpack 序列化以支持二进制数据传输;动态批处理可提升吞吐量;支持多阶段流水线和自定义指标监控。
python3.7+
torch
diffusers
transformers
mosec hero image

快速开始

MOSEC

discord invitation link PyPI version conda-forge Python Version PyPi monthly Downloads

让云上的模型服务更高效。

简介

MOSEC

Mosec 是一个高性能且灵活的模型服务(model serving)框架,用于构建支持机器学习模型的后端服务和微服务。它弥合了你刚训练好的任意机器学习模型与高效在线服务 API 之间的鸿沟。

  • 高性能:Web 层和任务协调使用 Rust 🦀 构建,在异步 I/O(async I/O)驱动下,不仅提供极快的速度,还能高效利用 CPU 资源
  • 易于使用:用户接口完全基于 Python 🐍,用户可以以与离线测试相同的代码,以不依赖具体机器学习框架(ML framework-agnostic)的方式部署模型
  • 动态批处理(Dynamic batching):聚合来自不同用户的请求进行批量推理,并将结果分发回各自用户
  • 流水线阶段(Pipelined stages):为流水线的不同阶段启动多个进程,以处理混合了 CPU/GPU/I/O 的工作负载
  • 云原生友好(Cloud friendly):专为云环境设计,内置模型预热(warmup)、优雅关闭(graceful shutdown)以及 Prometheus 监控指标,可轻松通过 Kubernetes 或其他容器编排系统管理
  • 专注做好一件事:专注于在线服务部分,让用户能更专注于模型优化和业务逻辑

安装

Mosec 要求 Python 3.7 或更高版本。可通过以下命令在 Linux 或 macOS 上安装最新的 PyPI 包

pip install -U mosec
# 或使用 conda 安装
conda install conda-forge::mosec
# 或使用 pixi 安装
pixi add mosec

若需从源码构建,请先安装 Rust,然后运行以下命令:

make package

你将在 dist 文件夹中获得一个 mosec 的 wheel 文件。

使用示例

我们演示如何使用 Mosec 轻松将一个预训练的 Stable Diffusion 模型部署为服务。你需要先安装前置依赖 diffuserstransformers

pip install --upgrade diffusers[torch] transformers

编写服务端

点击此处查看带解释的服务端代码。

首先,我们导入所需的库,并设置一个基础的日志记录器(logger),以便更好地观察程序运行情况。

from io import BytesIO
from typing import List

import torch  # type: ignore
from diffusers import StableDiffusionPipeline  # type: ignore

from mosec import Server, Worker, get_logger
from mosec.mixin import MsgpackMixin

logger = get_logger()

接下来,我们仅需 3 个步骤 即可构建一个 API,供客户端提交文本提示(prompt),并基于 stable-diffusion-v1-5 模型 获取生成的图像。

  1. 将你的服务定义为一个继承自 mosec.Worker 的类。这里我们还继承了 MsgpackMixin,以使用 msgpack 序列化格式(a)

  2. __init__ 方法中,初始化模型并将其加载到对应的设备上。你还可以选择性地为 self.example 赋值一些数据,用于模型预热(warmup)(b)。注意,这些数据必须与后续 forward 方法所期望的输入格式兼容。

  3. 重写 forward 方法来编写你的服务处理逻辑(c),其函数签名为 forward(self, data: Any | List[Any]) -> Any | List[Any]。是否接收/返回单个元素或列表,取决于是否启用了动态批处理(dynamic batching)(d)

class StableDiffusion(MsgpackMixin, Worker):
    def __init__(self):
        self.pipe = StableDiffusionPipeline.from_pretrained(
            "sd-legacy/stable-diffusion-v1-5", torch_dtype=torch.float16
        )
        self.pipe.enable_model_cpu_offload()
        self.example = ["useless example prompt"] * 4  # 预热 (batch_size=4)

    def forward(self, data: List[str]) -> List[memoryview]:
        logger.debug("generate images for %s", data)
        res = self.pipe(data)
        logger.debug("NSFW: %s", res[1])
        images = []
        for img in res[0]:
            dummy_file = BytesIO()
            img.save(dummy_file, format="JPEG")
            images.append(dummy_file.getbuffer())
        return images

[!NOTE]

(a) 本例中我们以二进制格式返回图像,而 JSON 不支持二进制数据(除非使用 base64 编码,但这会增大负载体积)。因此 msgpack 更适合我们的需求。如果不继承 MsgpackMixin,则默认使用 JSON。换句话说,服务请求/响应的协议可以是 msgpack、JSON 或其他任意格式(详见我们的 mixins)。

(b) 预热通常有助于提前分配 GPU 内存。如果指定了预热示例,服务将在该示例通过 forward 处理完成后才进入就绪状态。若未提供示例,则首个请求的延迟会较长。example 应设置为单个元素或元组,具体取决于 forward 方法期望接收的数据形式。此外,如果你希望使用多个不同的示例进行预热,可以设置 multi_examples(示例见此处)。

(c) 本例展示的是单阶段服务:StableDiffusion 工作器直接接收客户端的提示请求并返回图像,因此 forward 可视为完整的服务处理逻辑。但你也可以设计多阶段服务,让不同工作器在流水线(pipeline)中分别执行不同任务(例如下载图像、模型推理、后处理等)。此时整个流水线被视为服务处理逻辑,由第一个工作器接收请求,最后一个工作器返回响应,工作器间通过进程间通信传递数据。

(d) 由于本例启用了动态批处理(dynamic batching),forward 方法将接收到一个字符串 列表,例如 ['a cute cat playing with a red ball', 'a man sitting in front of a computer', ...],这些请求来自不同客户端,被聚合后进行 批处理推理(batch inference),从而提升系统吞吐量。

最后,我们将工作器添加到服务器中,构建一个 单阶段 工作流(多个阶段可通过流水线(pipeline) 进一步提升吞吐量,参见此示例),并指定并行运行的进程数(num=1)以及最大批处理大小(max_batch_size=4,即动态批处理在超时前最多累积的请求数;超时时间由 max_wait_time=10 毫秒定义,表示 Mosec 等待发送批次到工作器的最长时间)。

if __name__ == "__main__":
    server = Server()
    # 1) `num` 指定将启动多少个进程并行运行。
    # 2) 当 `max_batch_size` 设置为大于 1 的值时,`forward` 函数中的输入数据将是一个列表(批处理);
    #    否则,输入为单个元素。
    server.append_worker(StableDiffusion, num=1, max_batch_size=4, max_wait_time=10)
    server.run()

运行服务端

点击此处查看如何运行和查询服务端。

上述代码片段已合并到我们的示例文件中。你可以在项目根目录下直接运行。首先查看 命令行参数(详细说明见此处):

python examples/stable_diffusion/server.py --help

然后以调试日志模式启动服务端:

python examples/stable_diffusion/server.py --log-level debug --timeout 30000

在浏览器中打开 http://127.0.0.1:8000/openapi/swagger/ 即可查看 OpenAPI 文档。

在另一个终端中测试服务:

python examples/stable_diffusion/client.py --prompt "a cute cat playing with a red ball" --output cat.jpg --port 8000

你将在当前目录下获得一张名为 "cat.jpg" 的图像。

你还可以查看指标数据:

curl http://127.0.0.1:8000/metrics

搞定!你刚刚成功将 stable-diffusion 模型 部署为一项服务了!😉

示例

更多开箱即用的示例可以在 示例 章节中找到,包括:

配置

  • 动态批处理(Dynamic batching)
    • max_batch_sizemax_wait_time(毫秒) 在调用 append_worker 时配置。
    • 确保使用 max_batch_size 进行推理不会导致 GPU 内存溢出(out-of-memory)。
    • 通常,max_wait_time 应小于批处理推理所需时间。
    • 启用后,当累积请求数达到 max_batch_size 或等待时间达到 max_wait_time 时,将触发一次批处理。在高流量场景下,该功能可显著提升服务性能。
  • 其他配置项请参考 参数文档

部署

  • 如果您需要一个已预装 mosec 的 GPU 基础镜像,可以使用官方镜像 mosecorg/mosec。对于更复杂的使用场景,请参考 envd
  • 本服务无需 Gunicorn 或 NGINX,但在必要时仍可配合 Ingress 控制器使用。
  • 本服务应作为容器中的 PID 1 进程运行,因为它会管理多个子进程。如果您需要在单个容器中运行多个进程,则需使用进程管理器,例如 SupervisorHorust
  • 请务必收集 指标(metrics)
    • mosec_service_batch_size_bucket:显示批处理大小的分布。
    • mosec_service_batch_duration_second_bucket:显示每个连接在各阶段的动态批处理耗时(从接收到第一个任务开始计算)。
    • mosec_service_process_duration_second_bucket:显示每个连接在各阶段的处理耗时(包含 IPC 时间,但不包含 mosec_service_batch_duration_second_bucket 所涵盖的时间)。
    • mosec_service_remaining_task:显示当前正在处理的任务数量。
    • mosec_service_throughput:显示服务吞吐量。
  • 请通过 SIGINTCTRL+C)或 SIGTERMkill {PID})信号停止服务,因为服务内置了优雅关闭(graceful shutdown)逻辑。

性能调优

  • 为您的推理服务找出最佳的 max_batch_sizemax_wait_time。指标会显示实际批处理大小和批处理耗时的直方图,这些是调整这两个参数的关键依据。
  • 尝试将整个推理过程拆分为独立的 CPU 和 GPU 阶段(参考 DistilBERT)。不同阶段将以数据流水线(data pipeline) 方式运行,从而保持 GPU 持续忙碌。
  • 您还可以调整每个阶段的工作进程(worker)数量。例如,如果您的流水线包含一个用于预处理的 CPU 阶段和一个用于模型推理的 GPU 阶段,增加 CPU 阶段的 worker 数量有助于为 GPU 阶段生成更多可批处理的数据;增加 GPU 阶段的 worker 数量则能更充分地利用 GPU 内存和计算能力。这两种方式都可能提高 GPU 利用率,从而提升服务吞吐量。
  • 对于多阶段服务,请注意:数据在不同阶段之间传递时会通过 serialize_ipc/deserialize_ipc 方法进行序列化/反序列化,因此过大的数据可能导致整个流水线变慢。默认情况下,序列化后的数据通过 Rust 传递到下一阶段,您可以启用共享内存以潜在降低延迟(参考 RedisShmIPCMixin)。
  • 您应选择合适的 serialize/deserialize 方法,用于解析用户请求和编码响应。默认两者均使用 JSON,但 JSON 对图像和 embedding 等数据支持不佳。您可以选择更快且二进制兼容的 msgpack(参考 Stable Diffusion)。
  • 配置 OpenBLAS 或 MKL 的线程数。它们可能无法自动选择当前 Python 进程所使用的最合适 CPU 核心。您可以通过 env 为每个 worker 单独配置(参考 自定义 GPU 分配)。
  • 从客户端启用 HTTP/2。自 v0.8.8 起,mosec 会自动适配用户使用的协议(如 HTTP/2)。

用户

以下是一些正在使用 Mosec 的公司和个人用户:

引用(Citation)

如果您在研究中发现本软件有用,请考虑引用以下内容:

@software{yang2021mosec,
  title = {{MOSEC: Model Serving made Efficient in the Cloud}},
  author = {Yang, Keming and Liu, Zichen and Cheng, Philip},
  howpublished = {https://github.com/mosecorg/mosec},
  year = {2021}
}

贡献(Contributing)

我们欢迎任何形式的贡献。您可以通过 提交 Issue 或在 Discord 上与我们讨论来提供反馈。您也可以直接贡献代码并提交 Pull Request!

开始开发时,您可以使用 envd 创建一个隔离且干净的 Python 和 Rust 环境。更多信息请参阅 envd 文档build.envd 文件。

版本历史

0.9.62025/11/25
0.9.52025/06/10
0.9.32025/02/23
0.9.22025/02/22
0.9.12025/01/09
0.9.02024/11/18
0.8.92024/11/13
0.8.82024/09/22
0.8.72024/09/04
0.8.62024/06/16
0.8.52024/05/21
0.8.42024/02/27
0.8.32024/01/01
0.8.22023/12/05
0.8.12023/10/14
0.8.02023/08/05
0.7.22023/06/21
0.7.12023/06/06
0.7.02023/06/06
0.6.72023/05/19

常见问题

相似工具推荐

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|今天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|2天前
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|2天前
Agent图像开发框架