微信扫码
添加专属顾问
近年来,大语言模型和生成式 AI 丰富和改变了我们几乎每个人的生活。在 ChatGPT 这类模型之外,开源模型在这年内同样飞速发展,日益涌现的开源大模型在拥有更好质量的同时,也为个性化的和领域特定的模型部署带来了充分的机遇和挑战:一方面,在云服务器的大模型部署上,能更高效地在多卡上跑更大模型、支持更多并发请求的解决方案取得了新突破,另一方面,大模型在本地设备上的部署也开始取得可喜的进展,这些进展让大家在笔记本、浏览器、手机等设备上运行高质量的量化大模型变成可能。(文档/代码链接见文末)
大模型部署的未来会去向何方?我们相信这两种部署场景会一直共存下去,于是,让每个人都有能力在云服务器和本地部署大模型就变得极其重要。
在过往和现在,包括我们自己 MLC LLM 项目的上一个版本在内,许多 LLM 推理项目都在服务器部署和本地部署上有两套不同的解决方案,两侧各自有各自的实现和优化。比如,服务器上的 LLM 部署方案通常有更好的 continuous batching 和多卡支持,而本地的 LLM 部署方案在跨平台支持上更加便捷。然而,我们觉得整个领域对于能够将所有这些技术结合在一起的大模型部署方案是有需求的。事实上,很多应用在服务器部署或者本地部署的技术往往能直接被应用在另一侧。虽然站在现在这个时间点,诸如 continuous batching 之类的服务器部署技术对于本地的部署场景没有十分的使用价值,我们觉得随着 LLM 的应用发展,这些技术有能够在未来大显身手的潜力。比如,如果 LLM 今后成为操作系统的一部分,那么在本地支持处理多请求和 agent 任务的能力就会尤为重要。因此,我们关心的问题是,我们是否可以打造一个统一的、高效的、能够兼具服务器部署和本地部署能力的 LLM 引擎?
在这篇文章里,我们想为大家介绍 MLC LLM Engine (MLCEngine),一个能够在不同平台上 universally 部署的 LLM 引擎。MLCEngine 既在服务器上具备 high-throughput, low-latency 的 LLM serving 能力,同时又支持在各种本地环境下无缝部署当今高质量的大语言模型。
图1. MLCEngine: Universal LLM Deployment Engine
要支持在各种平台上做 universal deployment 有其独特的挑战。首先,我们需要支持一系列 GPU 编程模型和 runtime,从而能够在不同平台上加速 LLM 推理。一般而言,这样的支持过程往往伴随着大量且重复的 engineering effort,在 CUDA 这样的平台上我们想尽可能利用成熟的 library,而在 Vulkan、WebGPU 这类标准 library 还有待完善的平台上也要能够有相应支持。此外,不同平台上的应用开发通常也使用不同的编程语言和环境,这让在诸如 Swift, Kotlin, Javascript 等平台上引入 LLM 引擎变得愈加复杂。
机器学习编译 (Machine Learning Compilation) 这一技术是帮助我们克服这些挑战、并使 MLCEngine 能够在不同平台上运行的核心 —— 我们使用 Apache TVM 在各种硬件和平台上生成 GPU 代码。同时,我们搭建了一个支持工业级 state-of-the-art LLM serving 优化(包含 continuous batching, speculative decoding, prefix caching 等)的 portable 的 runtime 架构,这大大提升了我们在云服务器和本地环境中同时部署 MLCEngine 的能力。
图2. MLC LLM Workflow
我们将通过 TVM 编译器编译好的模型 library 和这一 universal runtime 结合在一起,在不同的应用开发语言中提供一套直接的 OpenAI-style 的 chat completion 接口,使得我们在不同平台、不同环境下的都能够以同一套标准的 OpenAI 接口与 MLCEngine 进行交互。同时,虽然 MLCEngine 在不同语言里有各自的 binding,所有这些本地应用背后都和 MLCEngine 在服务器上的应用共享同一个引擎、同一套代码。
接下来我们展示如何使用 MLCEngine。最便捷的方式是直接启动 chat CLI,这是一个与 LLM 做交互式对话的界面。下面这个命令能够在终端里通过 chat CLI 和 4-bit 量化的 Llama3 8B 模型进行交互对话:
mlcllm chat HF://mlc-ai/Llama-3-8B-Instruct-q4f161-MLC
图3. Chat CLI
在这行命令背后,我们首先会以 just-in-time 的方式编译 Llama3 模型,生成其在 GPU 上的代码。这种本地、即时的模型编译方式让我们在不同的 GPU 和操作系统上都能够直接运行大模型。
MLCEngine 支持一系列大语言模型,包括 Llama3, Mistral/Mixtral, Phi3, Qwen2, Gemma 等 LLM 模型。
MLCEngine 作为一个 universal LLM 引擎,仅仅能够在不同平台上运行大模型还不足以达成我们的目标。实际上,拥有一套标准的、开发者熟悉的、易用的 API 非常关键。我们在所有的平台上都使用 OpenAI-style API 作为与 MLCEngine 交互的接口。现在我们来看看在不同平台上的这套 API。
LLM serving 作为最经典的 LLM 应用之一,其 server 内部运行着一个 LLM 引擎以处理从网络接受的到所有请求。MLCEngine 提供了一个支持完整 OpenAI API 的 REST server。下面这个命令可以在 localhost 里启动一个REST server,用 4-bit 量化的 Llama3 模型的处理用户发来的 generation 请求。
mlcllm serve HF://mlc-ai/Llama-3-8B-Instruct-q4f161-MLC
图4. Launching LLM Server and Sending Chat Completion Requests
为了满足不同 serving 场景的需求,我们为 server 提供了三种不同的模式:“server”, “local” 和 “interactive”。
对于 “server” 模式,我们在最大限度下使用 GPU 显存,从而提高并发度,使 MLCEngine 能够同时并行处理更多的用户请求。搭配上完整的 FP16 模型和 FP8 variant 模型。“server” 模式在 A100/H100 这类服务器级 GPU 上更为我们所推荐。
相反,在 “local” 和 “interactive” 模式下 MLCEngine 会限制同时处理的请求数量、使用更少的 GPU memory,从而减少 MLCEngine 在整个系统里的压力,也与较为轻量的量化后的模型更加搭配。
在 Python 中,MLC LLM 提供了 MLCEngine 和 AsyncMLCEngine 两个选项,分别服务于同步和异步两种编程模型下的 LLM generation。这两个选项都支持与 OpenAI Python package 相同的 API。
图5. Python API of AsyncMLCEngine
为了在 iPhone 和 iPad 上运行 LLM,我们将 MLCEngine 包装为了一个 Swift SDK。尽管 OpenAI 并没有官方的 Swift API,我们的 Swift SDK 模仿了 OpenAI 的 Python API,所以你可以看到下面的代码在接口上和 Python API 比较相像,都具有相同结构的输入和输出。与此同时,MLCEngine 的 Swift API 利用了 AsyncStream 从而能够以异步 streaming 的方式处理 LLM 生成出来的内容。
图6. iOS/Swift API of MLCEngine
对于 Android,我们也想提供同样的体验,因此我们在 Kotlin 中提供了 MLCEngine 的 Android SDK(一样具有和 OpenAI Python API 相同的接口)。下面这张图展示了 chat completion 的 Kotlin API 和在 Samsung S23 上运行 MLC Chat app 的例子。
图7. Android/Kotlin API of MLCEngine
WebGPU 的整个生态系统在过去几年内逐渐成熟。WebGPU 的工作模式是在运行时将 WSGL (WebGPU Shading Language) shader 翻译为原生的 GPU shader,这一特性让我们在浏览器环境内做大模型的 GPU 计算变得可能。在浏览器环境内通过 WebGPU 做 GPU 计算本身具有高效(原生 GPU 加速)、便捷(无需额外环境设置)、高隐私性(100% 本地浏览器内部的计算)的优点。
图8. JavaScript/TypeScript API of MLCEngine
利用 WebGPU,我们的 MLCEngine 可以通过 JavaScript 在浏览器里运行,这个可以跳转到我们 WebLLM project,有直接在浏览器里跑大模型的 demo 和详细说明。
https://github.com/mlc-ai/web-llm
webllm.mlc.ai
在支持这些平台和环境的过程中,为了让各个平台上的开发都有一致的体验,我们特别注意让所有的接口都与 OpenAI API engine.chat.completions.create 保持对齐。
此外,对于不同的平台上的应用编程语言,我们也尽可能地利用它们各自的语言特性来设计结构化的输入和输出,同时利用 async streaming 从而使得 MLCEngine 在后端的运行不会阻塞应用的前端 UI。
我们想要在支持基本的 chat 功能外更进一步。这段时间来,LLM 的结构化输出生成极大扩展了这些大模型的能力,使我们对于大模型的使用能够跳出基本的 chat 和 plain text 生成的范围。基于可控可自定义的结构化输出生成,LLM 能够作为标准工具被投入和整合到生活生产中。在所有的 structured format 里,JSON 是在许多场景下都最被广泛使用的标准格式。所以,让 LLM 引擎具备生成 JSON strings 的能力具有非凡意义。
MLCEngine 提供了 state-of-the-art 的 JSON 结构化输出生成模式。对于每一个收到的 request,MLCEngine 都会构造和维护一个高性能的 GrammarBNF 状态机(一种基于巴科斯-诺尔范式,Backus-Naur Form,简称 BNF 的语法规则。BNF是一种用于描述编程语言或数据格式语法的正式语法,它使用产生式规则来定义语言的合法结构。在这里,GrammarBNF可能是用来定义和限制输出内容格式的一组规则)。这个状态机在 LLM auto-regressive 的生成过程中限制输出的格式,从而确保生成的内容一定符合所要求的 JSON 格式。。
MLCEngine 支持两种 JSON 模式。第一种模式支持普通的 JSON 输出,保证 LLM 的输出内容符合 JSON 语法。我们可以通过在调用 chat completion 时提供参数 responseformat={"type": "jsonobject"} 来启用这一 JSON 模式:
图9. JSON mode in MLCEngine
更为高级的 JSON 模式是为用户请求自定义输出的 JSON schema。在看到一个请求的 JSON schema 被指定时,MLCEngine 会生成严格符合这个 schema 的输出:
图10. JSON mode with specified JSON schema in MLCEngine
我们团队的工作目标之一一直是让大家在各个平台都能够使用 LLM。在前面我们已经分享了 MLCEngine 在服务器 GPU、Android 和 iOS 上的使用。除此之外,我们验证了 MLCEngine 在更多的硬件和平台上都能够部署大模型, 包括但不限于:
NVIDIA RTX 4090,
NVIDIA Jetson Orin,
NVIDIA T4(in Google Colab),
AMD 7900 XTX,
Steam Deck,
Orange Pi.
这个列表里比较有趣的一个平台是 Steam Deck,因为 Steam Deck 只有有限的 GPU 驱动支持。为了把 LLM 带到 Steam Deck 上,我们选择生成模型的 Vulkan 代码。下面这张照片里,我们在 Steam Deck 上运行了 4-bit 量化的 Llama3 8B 模型。
图11. MLCEngine running Llama 3 8B on SteamDeck
我们在支持各个平台的过程中深切感受到了机器学习编译这项技术所带来的便利。相比起在各个平台上都投入大量的精力,机器学习编译让我们能够对各个平台都复用同一套模型优化 pipeline,再分别做各自的代码生成。这极大地减少了我们的工作量,同时让我们能够广泛支持这么多的硬件,让更多人能够使用这些大模型。
尽管这是 MLCEngine 的第一个 release,我们在性能优化上已经投入了不少努力。整个 MLCEngine 包含了很多关键的系统优化。比如 continuous batching, speculative decoding, paged KV management, common prefix caching, cascade inference 等。在 CUDA 上,我们使用 FlashInfer 这一高性能的 attention 计算库,并通过机器学习编译的代码生成将 FlashInfer 的技术拓展到更多的平台上,从而获得各个平台上的 attention 计算加速。
MLCEngine 有开箱即用的 multi-GPU 多卡支持。下面这个命令会在两张 GPU 上搭起我们的 REST server:
mlcllm serve HF://mlc-ai/Qwen2-72B-Instruct-q0f16-MLC --overrides "tensorparallel_shards=2"
图12. REST Server on 2x NVIDIA RTX 4090
图13. Python API 2x AMD 7900 XTX
MLCEngine 在服务器场景下具备有竞争力的性能,尤其是对于 high-throughput, low-latency 的场景,MLCEngine 的性能能够 scale 到多卡部署上。此外,我们在其它比如 Apple GPU 的平台上保有 state-of-the-art 的性能,还能在诸如 WebGPU 这样逐渐发展的平台提供高性能的 LLM 推理。
值得一提的是,我们发现搭建跨平台 LLM 推理解决方案有很多协同作用。比如,我们能够较为轻松地把比如 attention management, prefix caching, speculative execution 和结构化输出生成这样的技术直接部署在所有这些平台上。相比之下,我们项目过去的解决方案由于工程资源有限,没有支持这些优化。同时,编译器的代码生成让我们能够在不同的平台上应用同样的优化,WebGPU 是其中的一个例子。我们在 WebGPU 上的性能很大程度上来源于我们在本地 GPU runtime 上的优化效果,而这些优化能够通过机器学习编译被直接带到 WebGPU 环境里。
在这篇文章里我们介绍了 MLCEngine,这是我们打造的一个统一的、高效的、同时兼容从云服务器到手机等 edge device 在内各个硬件和平台的 LLM 引擎。
MLCEngine 标志着 MLC LLM 这一项目翻开了崭新一页。在开发 MLCEngine 的过程中,我们非常享受同时也感谢和社区小伙伴一起工作,大家共同为 MLCEngine 贡献包括模型 coverage、系统优化和更多机器学习编译技术在内的很多内容,让 MLCEngine 能够具有更优秀、更 universal 的 LLM 部署。最后我们想感谢来自于 CMU Catalyst group, OctoAI, UW SAMPL group, SJTU 的合作者和开源社区里的众多贡献者。今后我们也会继续和整个开源社区一起,将开源模型带到更多人手中。
欢迎大家尝试 MLCEngine!
快速上手:https://llm.mlc.ai/docs/get_started/quick_start.html#quick-start
文档:https://llm.mlc.ai/docs/index.html
Github repo: https://github.com/mlc-ai/mlc-llm
- 查看往期,【阅读原文】 -
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-04-15
2026-04-22
2026-04-07
2026-04-07
2026-04-09
2026-05-15
2026-04-24
2026-04-17
2026-05-24
2026-04-14
2026-07-04
2026-07-01
2026-06-30
2026-06-28
2026-06-27
2026-06-26
2026-06-26
2026-06-25
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。