硅基俊宁.
← 返回文章

端侧模型推理生态:ONNX Runtime、llama.cpp、MLX、Ollama 与 LM Studio 怎么选

俊宁 · 日期未详
文章目录

按模型、制品、运行时、本地服务和应用集成分层,比较 ONNX Runtime、llama.cpp、MLX、Ollama 与 LM Studio 的适用边界。

本文讨论通用机制和设计判断;示意不对应任何具体产品的已交付状态。源码阅读坐标沿用原稿,本次整理不构成新的运行时验收。

端侧模型集成常把模型、制品格式、推理运行时和本地服务混在一起。先把这些对象放回各自层级,再判断它们是竞品还是上下游。

端侧模型推理生态封面

一句话总结

ONNX、ONNX Runtime、llama.cpp、MLX、Ollama、LM Studio 并不是六个同类产品:模型、制品格式、推理运行时、本地服务和应用集成是五层不同问题。

更直白地说:

因此,它们既可能竞争,也可能配合:ONNX Runtime、llama.cpp 和 MLX 在部分推理场景中互为替代;Ollama 与 LM Studio 处在同一产品层,更接近直接竞品;两者又可以使用 llama.cpp 等底层推理引擎,LM Studio 在 Apple Silicon 上还可以使用 MLX。一个真实产品同时使用 ONNX Runtime,并把 Ollama 和 LM Studio 作为两个可选 Provider,是合理的架构。

这次调研还修正了三个容易过度概括的判断:

  1. ONNX Runtime 的 Node 预编译包确实覆盖 Windows、macOS 和 Linux,但默认可用的硬件加速并不相同。CPU 路径覆盖最广,DirectML、CUDA 等 Execution Provider 有各自的平台矩阵;“跨平台 API”不等于“各平台同样加速”。
  2. MLX 仍以 Apple Silicon 为核心设计目标,但当前官方仓库已经提供 Linux CPU / CUDA 安装路径。因此准确说法是“Apple Silicon 优先”,不是“只支持 macOS”;Windows 仍不是它的主路径。
  3. Transformers.js 在 Node 中默认会把首次下载的模型缓存到依赖包目录,并允许访问远程模型。对普通 Node 应用这很方便,对可更新、可签名的 Browser Distribution 却不够显式:缓存目录、是否允许远程下载、模型来源和冷启动并发都必须由产品接管。

先把生态拆成五层

(此版本省略该配图。)

端侧推理只说明“计算主要发生在用户设备”,没有说明模型是什么、由谁加载、跑在哪个进程、是否需要本地服务,也没有说明模型文件由产品随包交付还是由用户自行安装。

把这些概念放回五层,竞品关系就清楚了。

层级回答的问题典型对象主要竞品关系
模型家族模型具备什么能力Qwen、Llama、Gemma、Phi模型与模型竞争
模型制品权重和计算图如何交付ONNX、GGUF、MLX 权重格式与转换路线竞争,但能力不必然等价
推理运行时谁真正执行计算ONNX Runtime、llama.cpp、MLX / MLX-LM局部竞争,任务和平台侧重点不同
本地服务谁管理模型并暴露 APIOllama、LM Studio、自建 server本地服务产品直接竞争
应用集成谁编排能力和承担用户体验应用 Runtime、桌面 App、Browser组合下层能力,不应被某个运行时反向绑死

这里最需要纠正的缩写是 ONNX:ONNX 是开放模型表示格式,ONNX Runtime 才是执行 ONNX 模型的运行时。 只说“我们集成了 ONNX”,可能表示能导入 .onnx 文件,也可能表示已经打包并成功加载 ONNX Runtime,两者不是一回事。

这些方案各自负责什么

ONNX Runtime:通用、跨平台的推理运行时

ONNX Runtime 的核心价值是把训练框架和部署运行时解耦。模型先导出为 ONNX 计算图,运行时再通过 CPU、CUDA、DirectML、CoreML 等 Execution Provider 映射到目标硬件。官方将其定位为跨平台模型加速器,并同时提供原生、Node.js 和 Web 形态。Execution Provider 文档定义了硬件加速扩展边界;Node.js 安装矩阵则显示,预编译 onnxruntime-node 的 CPU 路径覆盖 Windows、Linux 和 macOS,但 DirectML 与 CUDA 只覆盖特定系统和架构。浏览器场景另由 ONNX Runtime Web 覆盖。

它最适合这些任务:

ONNX Runtime 也能运行部分生成式模型,但“能跑”并不等于“最适合把本地 LLM 产品化”。模型转换、算子支持、KV Cache、量化、采样器和长上下文优化都会进入成本模型。对于以 GGUF 生态为主的本地 LLM,llama.cpp 通常拥有更直接的工具链。

llama.cpp:面向本地 LLM / VLM 的原生推理引擎

llama.cpp 是一个以 C/C++ 为核心、围绕本地大语言模型和视觉语言模型构建的推理引擎。它支持 GGUF、量化、多种 CPU/GPU 后端,也提供本地 server,但它的核心仍是推理引擎,而不是完整的桌面模型商店。llama.cpp 官方仓库列出了 Metal、CUDA、Vulkan、SYCL 等硬件路径;其 server 文档则提供 OpenAI-compatible API、embedding 和 reranking 等接口。

它适合“应用要把生成式模型直接装进自己的进程或受控子进程”这一类需求:

Qwen 官方也直接提供了 Qwen3 使用 llama.cpp 的本地运行指南。不过具体模型是否满足 tool calling、长上下文、吞吐和内存目标,仍应通过目标量化制品和目标机器实测,而不是由“已支持模型名”推导。

MLX / MLX-LM:Apple Silicon 优先的机器学习栈

MLX 是 Apple 推出的机器学习框架,MLX-LM 是建立在其上的 LLM 工具层。它强调 Apple Silicon 的统一内存和数组计算体验,适合在 Mac 上做推理、微调和研究。MLX 官方仓库仍以 Apple Silicon 为核心,同时已经给出 Linux CPU 与 CUDA 安装方式;MLX-LM则提供模型生成、量化、微调和 server 等更贴近 LLM 的能力。

MLX 与 llama.cpp、ONNX Runtime 在 Apple 设备上会发生局部竞争,但它不是“所有平台都换成 MLX”的同义词。一个 Windows/macOS 双平台产品如果选择 MLX,通常意味着增加一条 macOS 专项实现和一套独立模型制品。只有当统一内存、模型适配或性能实测产生足够收益时,这条平台分叉才值得承担。

Ollama 与 LM Studio:同层的本地模型服务

Ollama 解决的是“让用户把本地模型装起来、管起来、通过稳定 API 调起来”。它提供模型拉取、模型配置、进程生命周期和本地 HTTP API;官方 API 默认使用本机环回地址、11434 端口与 /api 路径前缀,详见 Ollama API 文档。Ollama 当前源码也明确维护了对 llama.cpp 的依赖和构建说明,见 Ollama 的 llama.cpp 说明。

LM Studio 解决的是相近问题,但产品重心不同:它提供桌面图形界面、模型搜索与下载、聊天、Runtime 管理,以及 OpenAI-compatible 和 Anthropic-compatible API。LM Studio 在 macOS、Windows 和 Linux 上可以使用 llama.cpp 运行 GGUF;在 Apple Silicon Mac 上还支持 MLX 模型。详见 LM Studio 产品文档与 LM Studio API 文档。

它们与底层推理引擎的关系如下:

若应用同时提供 Ollama 与 LM Studio 两个可选 Provider,可以复用 OpenAI-compatible 适配机制。Provider 管理配置、连接、鉴权和模型标识;本地服务的安装与模型生命周期需要另行说明。

它们怎样配合:三条典型路径

三条端侧模型推理集成路径

路径一:应用内嵌 ONNX Runtime

这条路径适合语义检索、Embedding、分类、OCR 等轻量能力。应用通过 Transformers.js 或自己的 SDK 加载 .onnx 模型,推理发生在应用进程或受控 worker 中。模型体积、原生依赖、缓存目录和硬件后端都属于应用交付链的一部分。

它的优势是跨平台接口清晰、能力边界稳定;代价是 Distribution 必须真正解决原生包安装脚本、签名、模型缓存和冷启动,而不能只看到 node_modules 中存在包名就宣布能力已集成。

路径二:应用内嵌 llama.cpp

这条路径适合产品自带本地对话、Agent 或 VLM。应用通过 Native bridge 调用 llama.cpp,模型通常以 GGUF 交付。产品可以统一控制启动、资源上限、模型版本和降级,也必须承担 ABI、量化制品、GPU 后端和不同平台打包的复杂度。

这里的关键决策不是“llama.cpp 性能好不好”,而是“本地生成式模型是否是产品必须随包保证的能力”。如果答案是肯定的,内嵌引擎比把用户安装 Ollama 或 LM Studio 作为硬依赖更可控。

路径三:应用连接 Ollama 或 LM Studio

这条路径适合开发调试、专业用户自带模型,以及不希望应用接管模型分发的场景。应用通过 OpenAI-compatible Provider 连接 Ollama 或 LM Studio,模型下载、量化选择和更新由用户或本地服务负责。

它非常适合作为可选 Provider,却不应轻易成为面向普通用户的唯一端侧路径。否则“端侧能力”实际上依赖用户预装服务、端口可用、版本匹配和模型已下载,产品必须把这些条件做成可诊断状态。

什么时候用什么

端侧模型推理方案选择矩阵

可以按下面的顺序做判断,而不是先站队某个框架。

1. 先看任务类型

Embedding、分类、OCR、语音等稳定计算图优先评估 ONNX Runtime。对话、Agent、代码生成、VLM 等 autoregressive generation 优先评估 llama.cpp 或平台专项的 MLX / MLX-LM。不要因为两类任务都叫“AI”就强行共用一个运行时。

2. 再看交付边界

如果能力必须开箱即用,运行时、模型、缓存和回退都应由产品受控,适合内嵌 ONNX Runtime 或 llama.cpp。如果目标用户愿意自行安装和管理模型,Ollama 或 LM Studio 可以作为 BYO Provider。谁负责模型生命周期,比“API 长得像不像 OpenAI”更重要。

3. 然后看目标平台

跨 Windows、macOS、Linux 的主路径优先选择跨平台运行时;Apple Silicon 专项能力可以评估 MLX。专项优化应建立在同模型、同量化、同输入、同输出质量的基准之上,不能只比较一次 token/s。

4. 最后才看模型格式和性能

模型家族、量化、上下文长度、内存峰值、首 token 延迟、稳态吞吐、工具调用正确率和制品体积要一起测。格式转换不是免费的:一个模型从原始权重转换为 ONNX、GGUF 或 MLX 权重后,支持的算子、量化方式和输出质量可能发生变化。

下面这张简表可以直接用于方案评审:

需求首选方向原因需要额外证明
跨平台 Embedding / 分类 / OCRONNX Runtime通用计算图和硬件后端边界清晰原生包、Execution Provider、模型缓存、冷启动
产品内置本地 LLM / VLMllama.cpp + GGUF本地生成式生态成熟,应用可控ABI、量化、内存、工具调用、平台打包
只做 Apple Silicon 专项能力MLX / MLX-LM统一内存和 Apple 生态适配相对 llama.cpp 的实测收益、平台分叉成本
开发者或用户自带本地模型Ollama / LM Studio Provider下载、管理和 HTTP API 已封装安装检测、端口、版本、模型存在性、降级
同时有语义模型和生成式模型ONNX Runtime + llama.cpp不同任务使用各自更合适的引擎两套资源预算和模型生命周期
既要开箱即用又要允许自带模型内嵌运行时 + 可选 Ollama / LM Studio默认体验可控,高级用户可扩展Provider 优先级、健康检查和一致的权限策略

我的判断框架

我会用一句话记住五者:

ONNX Runtime 跑通用计算图,llama.cpp 跑跨平台本地生成式模型,MLX 做 Apple 平台专项,Ollama 与 LM Studio 管理并对外提供本地模型服务。

真正做方案时,再追问四个问题:任务是语义模型还是生成式模型;能力必须随产品交付还是允许用户自备;目标平台是跨平台还是 Apple 专项;模型生命周期由应用、Distribution 还是用户负责。

回答完这四个问题,绝大多数“到底选 ONNX Runtime、llama.cpp、MLX、Ollama 还是 LM Studio”的争论都会自然消失。因为工程上真正要选的从来不是一个名词,而是一条可以被构建、签名、安装、诊断和验收的完整运行路径。

参考资料