预览版推出:LM Link立即开始

在 LM Studio 中引入统一的多模态 `MLX` 引擎架构

2025年5月30日·

LM Studio 的 MLX 引擎 (MIT) 利用了两个强大的 Python 包,以在 Apple Silicon M 系列芯片上高效运行大语言模型:用于文本生成的 mlx-lm(由 @awni@angeloskath、Apple 开发)和用于视觉语言模型的 mlx-vlm(由 @Blaizzy 开发)。

mlx-engine 提交记录 f98317e(应用内引擎 v0.17.0 及更高版本)开始,我们迁移到了一个新的统一架构,该架构将这些包的底层基础组件融合在一起。现在,系统始终使用 mlx-lm 的文本模型实现,而 mlx-vlm 的视觉模型实现则作为“插件”(add-ons)模块化使用,用于生成文本模型可理解的图像嵌入(embeddings)。

mlx-engine 的统一视觉模型架构。使用 mlx-vlm 视觉插件扩展 mlx-lm 文本模型

这大幅提升了在使用多模态 MLX 视觉语言模型(VLM)(例如 Google 的 Gemma 3)时的性能和用户体验。例如,现在与 VLM 进行纯文本对话也可以受益于提示词缓存(prompt caching)——这一功能此前是纯文本 LLM 独有的——从而极大地加快了后续回复的速度。这使得 MLX VLM 在处理文本任务时可以与纯文本 LLM 无缝互换,同时还额外提供了视觉能力。

👓 请继续阅读,深入了解 LM Studio 的 MLX 引擎中所面临的问题、解决方案,以及我们如何实现这一统一架构的技术细节。

👷 非常欢迎对 LM Studio 的 MLX 引擎进行开源贡献!如果您想帮助我们将统一架构扩展到更多模型,请参阅此 GitHub Issue,这是一个很好的起点。

什么是多模态模型?

多模态大语言模型(LLM)是指能够接收多种模态输入的 LLM。这意味着,除了能够处理文本输入之外,该 LLM 还可以接收图像和/或音频输入。

新的 MLX 引擎目前尚不支持音频,但我们计划让该方案也适用于音频输入。


通常,具备视觉能力的 LLM 通过以下流程摄取图像输入

多模态视觉 LLM 的通用运行流程:将图像转换为文本模型可理解的嵌入(embeddings),然后由文本模型生成输出

  • 提示词包含文本和图像
  • (1a) 模型的“文本”部分将文本编码进模型的嵌入空间中
    • "What is this?"[0.83, 0.40, 0.67, ...]
  • (1b) 模型的“视觉”部分将图像编码进文本模型的嵌入空间。这会将图像转换为文本模型可以理解的格式
    • image.png[0.28, 0.11, 0.96, ...]
  • (2) 文本嵌入和图像嵌入融合在一起
    • [0.83, 0.40, 0.67, ...] + [0.28, 0.11, 0.96, ...][0.83, 0.40, 0.67, ..., 0.28, 0.11, 0.96, ...]
  • (3) 融合后的嵌入被传递给文本模型,模型根据文本和图像中的信息生成文本

如果提示词中没有图像,那么“融合后的嵌入”就仅仅是文本嵌入。


MLX 生态系统中的模型实现

MLX Python 生态中,有两个主要库为在 Apple Silicon 上与 LLM 交互提供模型实现和基础设施:

  • mlx-lm:文本模型实现及与之交互的基础设施
  • mlx-vlm:文本模型实现、视觉模型实现以及与之交互的基础设施

在过去,mlx-lm 包含没有多模态功能的纯文本模型的实现,而 mlx-vlm 则是 MLX VLM 实现的事实上的大本营。

mlx-lm 和 mlx-vlm 中的模型实现组件。黄色 = 文本模型组件。蓝色 = 视觉模型组件

LM Studio 的 mlx-engine 最初采用简单的“分叉”架构开发,以同时支持纯文本模型和具备视觉能力的模型

mlx-engine 的分叉视觉模型架构。黄色 = 文本模型组件。蓝色 = 视觉模型组件

如果某个模型具备视觉能力,则会独占性地使用 mlx-vlm 模型实现(文本 + 视觉)。如果该模型是纯文本的,则会独占性地使用 mlx-lm 模型实现(文本)。

每条路径中都使用了一个截然不同(不同来源)的文本模型实现(来自 mlx-lm 或来自 mlx-vlm)。

问题所在:分叉架构

mlx-engine 朴素的分叉架构面临以下问题:

  • mlx-lmmlx-vlm 的功能没有完全对齐,或者在行为上存在细微差异时,我们应该使用哪一个?
    • 我们如何限制在与多模态模型交互与纯文本模型交互时体验上的分化?
    • 假设其中一个实现性能更好,或者包含另一个没有的 bug。我们如何一致地决定是使用 mlx-lm 还是 mlx-vlm?我们是否应该根据请求在两者之间热插拔加载(这会很复杂)?
  • 如果我们在两者之间进行任何切换,或者支持使用多模态模型的纯文本变体(例如,这个 Gemma 3 纯文本模型),那么给定模型的 bug 面和维护成本就会增加一倍。这是因为存在两个共存的实现,它们被有条件地用于对同一个底层模型进行推理。因此,我们必须确保这两个独立的模型都毫无 bug,才能在 LM Studio 中提供无 bug 的体验。

同一个文本模型存在两个不同的版本

我们的解决方案:两全其美

我们试图将 mlx-lmmlx-vlm 的核心组件结合起来,为所有 MLX LLM 和 VLM 构建一个“统一”(无分叉)的推理引擎。

在与 @awni@Blaizzy 进行了非常宝贵的讨论后,我们通过以下贡献实现了这一目标:

mlx-lm

mlx-vlm

mlx-engine 的统一视觉模型架构。使用 mlx-vlm 视觉插件扩展 mlx-lm 文本模型

在这种统一架构中,多模态 LLM 的核心文本模型始终从 mlx-lm (2) 加载,不再可能从 mlx-vlm 加载可能存在细微差异的文本模型。

然后,我们有条件地加载一个 VisionAddOn,它利用 mlx-vlm 的功能 (3, 4) 从图像中生成 mlx-lm 文本模型可以理解的嵌入(参见 mlx-engine 中的 Gemma3VisionAddOn 实现)。

通过这种设计,我们能够以精简和单路径的方式对多模态模型进行推理。这有助于我们发布更干净、更易于维护且性能更佳的 LM Studio MLX 引擎。

Gemma 3 12B QAT,两款均为在 M3 MacBook Pro 运行的 MLX 4-bit 版本。使用统一架构后,后续首字延迟(TTFT)提升了约 25 倍


技术细节:mlx-engine 中的 VisionAddOns

LM Studio 新的 mlx-engine 统一架构的核心要义在于,它允许我们在所有多模态模型中,都使用来自 mlx-lm 的文本模型实现,同时仍然能够利用 mlx-vlm 的视觉模型组件来生成文本模型可理解的图像嵌入。

这是通过引入 VisionAddOns源码)来实现的。它们是模块化组件,可用于为多模态模型生成图像嵌入。这些 VisionAddOns 实现了由 BaseVisionAddOn 抽象类定义的通用接口,例如:

class BaseVisionAddOn:
    """
    Base class that defines the interface for a VisionAddOn.
    """

    @abstractmethod
    def __init__(self):
        """
        Where load of vision model components is intended to occur.
        """

    @abstractmethod
    def compute_embeddings(
        self,
        text_model: nn.Module,
        prompt_tokens: mx.array,
        images_b64: List[str],
    ) -> mx.array:
        """
        Returns input embeddings for the language model after
        text/image merging of the prompt
        """

VisionAddOns 能够生成图像嵌入,并可将其输入到 mlx-lmstream_generate() 函数的新参数 input_embeddings 中(请参阅对 mlx-lm 提交的 commit)。

目前,Gemma 3(Gemma3VisionAddOn)和 Pixtral(PixtralVisionAddOn)是仅有的两个已迁移到统一架构的模型。然而,该架构在设计上允许轻松将更多 VisionAddOns 添加到 mlx-enginevision_add_ons 目录中,然后通过 此处的 ModelKit 进行连接。

    VISION_ADD_ON_MAP = {
        "gemma3": Gemma3VisionAddOn,
        "pixtral": PixtralVisionAddOn,
    }

非常欢迎在我们开源仓库 https://github.com/lmstudio-ai/mlx-engine 中贡献力量,以扩展此模式!例如,请参阅 mlx-engine 的 issue:将 VisionAddOn 模式扩展至 Qwen2.5VL #167


反馈与贡献

© . This site is unofficial and not affiliated with Element Labs, Inc.