首页
/ 在 Apple Silicon 上本地运行 Qwen:mlx-lm 安装、推理与模型转换实战指南

在 Apple Silicon 上本地运行 Qwen:mlx-lm 安装、推理与模型转换实战指南

2026-09-10 13:27:52作者:魏献源Searcher

Qwen 官方仓库(GitHub_Trending/qw/Qwen1.5)的 docs/source/run_locally/mlx-lm.md 文档是本文的主体来源,它系统介绍了如何借助 mlx-lm 在 Apple Silicon(M 系列芯片)Mac 上本地运行 Qwen 系列模型。本文在此基础上结合仓库 README.md 与周边文档展开,读者读完后将掌握三件事:如何安装 mlx-lm 环境、如何加载官方 -MLX 后缀模型并完成对话生成、以及如何用一条命令把 Hugging Face 上的模型转换/量化为 MLX 格式。

背景:为什么在 macOS 上选择 mlx-lm

MLX 是 Apple 面向 Apple Silicon 推出的机器学习框架,mlx-lm 则是建立在 MLX 之上的 LLM 推理/训练工具库,专门用于在 Apple Silicon 上运行大语言模型。与 llama.cpp、Ollama 等本地推理方案相比,mlx-lm 的特点是原生面向 Metal(Apple GPU)设计,能够直接利用 Mac 统一内存架构的优势,让模型权重驻留在内存中同时被 CPU 与 GPU 访问。

官方文档明确指出:mlx-lm 仅在 macOS 上可用,使用前提是 Apple Silicon(M1/M2/M3/M4 系列芯片)设备。仓库 README.md 的「Run Qwen3」一节进一步确认,mlx-lm>=0.24.0 已支持 Qwen3,且可通过在 Hugging Face 上搜索以 -MLX 结尾的模型仓库获取官方转换好的模型文件。

需要说明的是:本文所依据的 mlx-lm.md 正文示例以 Qwen2.5 系列为主(文档头部标注了 "To be updated for Qwen3"),但其安装、加载、生成与转换方法对 Qwen3 与 Qwen2.5 完全通用,配合 README 中 mlx-lm>=0.24.0 的版本要求即可平滑切换到 Qwen3 模型。

准备工作:安装 mlx-lm

官方文档给出的最快上手方式是直接安装 mlx-lm 包,支持 pipconda 两种包管理器。

使用 pip 安装:

pip install mlx-lm

使用 conda(conda-forge 通道)安装:

conda install -c conda-forge mlx-lm

安装 mlx-lm 时会一并带入 mlx(核心框架)等依赖。由于 mlx 框架只在 Apple Silicon 的 macOS 上有原生加速实现,请确认你的设备是 Apple Silicon 架构,并在 macOS 环境(含支持 Metal 的图形栈)下执行上述命令。

使用官方 Qwen MLX 模型文件

Qwen 团队已在 Hugging Face 组织下提供了可直接配合 mlx-lm 使用的模型 checkpoints。查找方式非常简单:在 Hugging Face 上搜索仓库名,找到带 -MLX 后缀的仓库即可,例如 Qwen/Qwen2.5-7B-Instruct-MLX

加载模型并生成文本

官方文档给出了一个完整的代码片段,演示了如何加载 tokenizer 与模型,并通过 apply_chat_template 应用对话模板后进行文本生成:

from mlx_lm import load, generate

model, tokenizer = load('Qwen/Qwen2.5-7B-Instruct-MLX', tokenizer_config={"eos_token": "<|im_end|>"})

prompt = "Give me a short introduction to large language models."
messages = [
    {"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},
    {"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)

response = generate(model, tokenizer, prompt=text, verbose=True, top_p=0.8, temp=0.7, repetition_penalty=1.05, max_tokens=512)

代码的关键点拆解如下:

  • load():接收模型标识(Hugging Face 仓库名或本地路径),返回 (model, tokenizer) 二元组。其中 tokenizer_config={"eos_token": "<|im_end|>"} 用于显式指定对话结束符。这与仓库中 qwen3_nonthinking.jinja 展示的 Qwen chat 模板一致——Qwen 的对话格式以 <|im_start|> 标记角色、以 <|im_end|> 标记消息结束,<|im_end|> 正是模型在对话场景下的结束序列(EOS)token。
  • apply_chat_template():将 messages 列表(system/user/assistant 等多轮消息)按照模型内置的 chat template 渲染为模型输入格式。tokenize=False 表示只渲染成文本、不做 tokenize;add_generation_prompt=True 表示在末尾附加 assistant 生成提示符,让模型知道轮到自己回答。该 API 与 Transformers 的 tokenizer.apply_chat_template 用法一致,可参照仓库 README.md 中 Qwen3 的 Transformers 示例(同样使用 apply_chat_template + add_generation_prompt=True 的流程)。
  • generate():执行自回归生成,返回生成的文本。prompt 传入的是经 chat template 渲染后的完整文本,verbose=True 会输出详细的过程信息。

生成参数详解

上述示例中的生成参数是 Qwen 官方在 MLX 场景下的推荐起点,含义如下:

参数 示例值 作用说明
temp 0.7 温度系数,控制采样的随机性。值越高输出越多样/发散,越低越确定/保守
top_p 0.8 核采样(nucleus sampling)阈值,只在累计概率达到该值的最小 token 集合内采样
repetition_penalty 1.05 重复惩罚系数,>1 时会抑制重复 token 的出现,缓解文本重复循环
max_tokens 512 单次生成的最大 token 数,防止无界生成长度
verbose True 是否打印推理过程细节(如每步 token、耗时、tokens/s 等)

这些参数与仓库中其他本地推理文档(如 llama.cpp 指南--temp 0.6 --top-k 20 --top-p 0.95 --min-p 0 的组合)思路一致:Qwen 官方建议按实际场景微调采样参数,遇到重复或无限生成时可通过提高重复惩罚来缓解。实际使用时建议以 max_tokens 控制长度,避免单次生成过长占用内存。

自行制作 MLX 模型文件

如果官方 -MLX 仓库中没有你需要的模型规格(例如想要特定量化档位或新发布的模型),可以用 mlx_lm 自带的转换工具将 Hugging Face 上的模型一键转换为 MLX 格式。官方文档给出的命令只有一条:

mlx_lm.convert --hf-path Qwen/Qwen2.5-7B-Instruct --mlx-path mlx/Qwen2.5-7B-Instruct/ -q

各参数含义如下:

  • --hf-path:模型来源,可以是 Hugging Face Hub 上的模型名(如 Qwen/Qwen2.5-7B-Instruct),也可以是本地已有的模型目录路径;
  • --mlx-path:转换后输出文件的存放路径,注意该目录需要预先创建;
  • -q:启用模型量化。开启后转换产物占用更小的磁盘/内存空间,推理速度通常更快,代价是精度有一定损失——这与仓库 quantization 系列文档讨论的量化权衡(如 GPTQ、AWQ、llama.cpp GGUF 量化)是同一思路:在资源有限的本地设备上,量化往往是"能否跑起来"的关键。

转换完成后,把 --mlx-path 指向的本地目录直接传给 load() 即可加载:

model, tokenizer = load('mlx/Qwen2.5-7B-Instruct/')

这也解释了为什么 load() 的第一个参数同时接受 HF 仓库名与本地路径——官方 -MLX 模型与自转换模型在用法上是完全一致的。

与 Qwen 本地运行生态的衔接

mlx-lm 是 Qwen 仓库「Run Locally」章节覆盖的四种本地运行方案之一。仓库 docs/source/index.rst 的 Run Locally 目录同时收录了:

  • llama.cpp 指南:面向 CPU/多硬件(x86/Apple Silicon/NVIDIA 等)的 C++ 推理方案,使用 GGUF 格式;
  • Ollama 指南:跨 macOS/Linux/Windows 的一条命令本地运行方案;
  • LM Studio 指南:桌面应用,同时支持 GGUF 与 MLX 格式;
  • mlx-lm 指南:本文主体,Apple Silicon 原生方案。

选型上的关键差异在于硬件目标:如果你的设备是 Apple Silicon Mac,mlx-lm 是官方文档明确推荐的原生方案(MLX 直接利用统一内存与 Metal GPU);如果需要在 Intel/AMD/NVIDIA 等更广泛的硬件上运行,则应转向 llama.cpp 或 Ollama 路线。三者共享同一个事实:Qwen 官方都提供了对应格式(-MLX / -GGUF)的现成模型,本地运行无需自行转换。

注意事项

  • 版本与硬件前提:本文命令均面向 macOS + Apple Silicon(Apple 芯片)环境;Intel Mac 不在 mlx-lm 的加速范围内。Qwen3 支持要求 mlx-lm>=0.24.0(见 README.md)。
  • 示例模型的时效性mlx-lm.md 正文示例使用 Qwen/Qwen2.5-7B-Instruct-MLX 作为演示对象,文档头部标注了 "To be updated for Qwen3";接入 Qwen3 时只需将模型名替换为 Hugging Face 上带 -MLX 后缀的 Qwen3 仓库即可,API 与流程不变。
  • 量化权衡-q 量化能显著降低内存占用与加速推理,但会引入精度损失;模型过大无法在设备内存中完整加载时,可优先考虑量化档位。
  • 对话结束符:加载 Qwen 系列 chat 模型时,通过 tokenizer_config={"eos_token": "<|im_end|>"} 指定结束符是保证生成正常收敛的关键,不要省略。

延伸阅读

若想进一步深入本地运行与量化主题,可继续阅读仓库内以下文档:

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
docsdocs
暂无描述
Markdown
900
5.83 K
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
860
1.35 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
927
1.85 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.89 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
533
602
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.37 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
396
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.04 K
526