随着开源大语言模型(LLM)的爆发,越来越多的开发者希望在自己的电脑上运行模型,以保证隐私安全并进行低延迟的调试。
对于手持 Apple Silicon (M1/M2/M3/M4) 芯片的 Mac 用户来说,我们拥有得天独厚的优势:统一内存架构 (Unified Memory)。这意味着 GPU 可以直接访问全部系统内存,让我们能在笔记本上运行其他显卡只能望洋兴叹的大参数模型。
本文将介绍两种在 Mac 上运行 Hugging Face 模型的主流方法,并附带完整代码:
- 通用方案:使用 PyTorch + MPS 加速。
- 原生方案:使用 Apple MLX 框架(性能更优)。
准备工作
在开始之前,请确保你的 Mac 安装了 Python 3.10 或更高版本。
我们需要安装基础依赖。打开终端,输入以下命令:
bash
# 基础依赖
pip install torch torchvision transformers accelerate
# 如果你想尝试第二种更高性能的方法,请安装 MLX
pip install mlx-lm
方法一:使用 PyTorch + MPS (通用性最强)
PyTorch 是目前最流行的深度学习框架。在 Mac 上,PyTorch 利用 MPS (Metal Performance Shaders) 后端来调用 GPU 进行加速。
核心代码实现
新建文件 torch_chat.py。这段代码会自动检测 MPS 设备,加载模型,并开启一个命令行对话界面。
python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
def main():
# 1. 设备检测:优先使用 MPS
if torch.backends.mps.is_available():
device = "mps"
print("✅ 检测到 Apple Silicon (MPS) 加速设备")
else:
device = "cpu"
print("⚠️ 未检测到 MPS,正在使用 CPU (速度较慢)")
# 2. 指定模型 (推荐 Qwen2.5-1.5B,适合 8GB 内存 Mac)
model_id = "Qwen/Qwen2.5-1.5B-Instruct"
print(f"⏳ 正在加载模型: {model_id} ...")
try:
tokenizer = AutoTokenizer.from_pretrained(model_id)
# 3. 加载模型
# torch_dtype=torch.float16 是关键,M 系列芯片对半精度支持极好,省内存且快
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.float16,
device_map=device,
trust_remote_code=True
)
print("🚀 模型加载完成!")
print("--------------------------------------------------")
# 4. 对话循环
messages = [{"role": "system", "content": "你是一个乐于助人的AI助手。"}]
while True:
user_input = input("\n👤 你: ")
if user_input.lower() in ["quit", "exit"]:
break
messages.append({"role": "user", "content": user_input})
# 应用对话模板
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer([text], return_tensors="pt").to(device)
# 生成回复
with torch.no_grad():
generated_ids = model.generate(
inputs.input_ids,
max_new_tokens=512,
do_sample=True,
temperature=0.7
)
# 解码输出
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(f"🤖 AI: {response}")
messages.append({"role": "assistant", "content": response})
except Exception as e:
print(f"❌ 发生错误: {e}")
if __name__ == "__main__":
main()
✅ 优点
- 生态丰富:几乎所有的 Hugging Face 模型都原生支持 PyTorch。
- 代码通用 :这段代码稍作修改(只需改
device)即可运行在 Windows (CUDA) 或 Linux 服务器上。
❌ 缺点
- 内存占用稍高:数据需要在 CPU 和 GPU 之间流转。
- 不支持原生 4-bit 量化 :在 Mac 上使用
bitsandbytes库比较麻烦,难以在小内存机器上运行大模型。
方法二:使用 Apple MLX (性能与效率之王)
MLX 是 Apple 机器学习研究团队专门为 Apple Silicon 打造的框架。它专为统一内存设计,数据无需复制,且支持"惰性求值",启动速度极快。
对于 Mac 用户,这是我强烈推荐的方案。
核心代码实现
新建文件 mlx_chat.py。你会发现代码非常简洁,而且自带流式输出(打字机效果)。
python
from mlx_lm import load, stream_generate
import sys
def main():
# 模型路径
model_path = "Qwen/Qwen2.5-1.5B-Instruct"
print(f"⏳ 正在使用 MLX 加载模型: {model_path} ...")
# 1. 加载模型 (MLX 自动处理设备优化)
model, tokenizer = load(model_path, tokenizer_config={"trust_remote_code": True})
print("🚀 模型加载完毕!(MLX 原生加速中)")
print("--------------------------------------------------")
messages = [{"role": "system", "content": "你是一个基于 Apple MLX 框架运行的高效 AI 助手。"}]
while True:
try:
user_input = input("\n👤 你: ")
if user_input.lower() in ["quit", "exit"]:
break
messages.append({"role": "user", "content": user_input})
# 2. 应用模板
prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
print("🤖 AI: ", end="", flush=True)
# 3. 流式生成回复
response_content = ""
for response in stream_generate(model, tokenizer, prompt=prompt, max_tokens=512, temp=0.7):
print(response, end="", flush=True)
response_content += response
print() # 换行
messages.append({"role": "assistant", "content": response_content})
except KeyboardInterrupt:
print("\n🛑 中断生成")
continue
if __name__ == "__main__":
main()
✅ 优点 (为什么你应该用 MLX)
- 极致省内存 (4-bit 量化):MLX 允许你在加载时直接将模型量化。这意味着 16GB 内存的 Mac 也可以流畅运行 Llama-3-8B 甚至更大的模型。
- 流式输出 :自带
stream_generate,交互体验极佳。 - 零拷贝:直接利用统一内存,无需数据搬运,发热更低。
总结与建议
| 特性 | PyTorch (MPS) | Apple MLX |
|---|---|---|
| 通用性 | ⭐⭐⭐⭐⭐ (全平台) | ⭐⭐⭐ (仅限 Apple Silicon) |
| 上手难度 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ (API 极简) |
| 推理速度 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 内存效率 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ (原生支持 4-bit) |
| 适用场景 | 模型训练、跨平台开发 | Mac 本地推理、微调 |
我的建议:
- 如果你是在做开发 ,需要代码能跑在服务器和 Mac 上,请使用 PyTorch。
- 如果你只是想在 Mac 上高效运行模型 ,或者你的内存较小 (8GB/16GB),MLX 是绝对的首选。
希望这篇指南能帮你顺利在 Mac 上跑起你的第一个本地大模型!
本文代码基于 transformers 4.38+ 和 mlx-lm 编写,测试环境为 macOS Sonoma / Sequoia。