共计 1553 个字符,预计需要花费 4 分钟才能阅读完成。
背景与痛点
最近尝试在 M4 Mac Mini 上部署私有 ChatGPT,发现本地部署 AI 模型确实有不少坑。总结下来主要有这几个痛点:

- 依赖冲突 :Python 包版本管理简直就是一场噩梦,特别是当你的系统里还有其他项目时
- 硬件资源限制 :内存和显存不够用的时候,模型跑起来就像老牛拉破车
- 配置复杂 :各种环境变量、参数设置看得人眼花缭乱
技术选型
在决定部署方案时,主要考虑了两个方向:
- 容器化部署 (Docker)
- 优点:环境隔离好,依赖管理简单
-
缺点:M1/M2 芯片的兼容性问题较多,镜像体积大
-
原生安装
- 优点:性能更好,资源占用更少
- 缺点:需要手动解决依赖关系
考虑到 M4 Mac Mini 的性能和我的使用场景,最终选择了原生安装方案。
核心实现
环境准备
首先确保你的系统满足以下条件:
- macOS 12.0 或更高版本
- Python 3.8-3.10(推荐 3.9)
- 至少 16GB 内存(8GB 也能跑,但会比较卡)
安装必要的依赖:
brew install cmake protobuf rust
pip install torch numpy transformers sentencepiece
部署脚本
下面是我整理的一个精简版部署脚本,带详细注释:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
# 设置设备(自动检测 M1/M2 GPU)device = "mps" if torch.backends.mps.is_available() else "cpu"
# 加载模型和分词器
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained(
"gpt2",
torch_dtype=torch.float16, # 使用半精度减少内存占用
).to(device)
# 生成文本的函数
def generate_text(prompt, max_length=50):
inputs = tokenizer(prompt, return_tensors="pt").to(device)
outputs = model.generate(
**inputs,
max_length=max_length,
do_sample=True,
temperature=0.7,
)
return tokenizer.decode(outputs[0], skip_special_tokens=True)
# 测试
print(generate_text("你好,我是"))
模型权重优化
为了节省空间和提高加载速度,可以考虑:
- 使用量化模型(4bit 或 8bit)
- 提前下载好权重文件放在本地
- 对于大模型,可以只加载部分层
性能考量
在 M4 Mac Mini 上测试了不同配置下的表现:
| 配置 | 内存占用 | 推理速度 (token/s) |
|---|---|---|
| FP32 | ~8GB | 12 |
| FP16 | ~5GB | 18 |
| 8bit | ~3GB | 15 |
避坑指南
- 权限问题
- 症状:安装时出现 “Permission denied”
-
解决:使用
pip install --user或虚拟环境 -
CUDA 兼容性
- 症状:报错 “CUDA not available”
-
解决:M1/M2 芯片要用
mps而不是cuda -
内存不足
- 症状:程序崩溃或响应极慢
- 解决:减小模型大小或使用量化
进阶建议
如果想扩展功能,可以考虑:
- 添加自定义知识库:
- 用 LangChain 等框架接入本地文档
-
实现 RAG(检索增强生成)架构
-
优化推理流程:
- 实现流式输出
- 添加缓存机制
思考题
最后留个思考题:如何优化 prompt 设计来提升本地模型的响应质量?可以从以下几个方面考虑:
- 提供更明确的指令
- 添加示例
- 限制输出格式
欢迎在评论区分享你的想法和实践经验!
正文完
