本地大模型部署最佳实践

从权重下载到生产推理的完整流程 — 以 MoE 大模型为例


为什么选择 M2.5

特性MiniMax M2.5竞品 (GLM-5等)
架构MoE (稀疏混合专家)Dense
MLX 支持需自行转换,4-bit/8-bit 均可部分模型无 MLX 版
推理速度 (8-bit)~25 tok/sGLM-5 太慢不可用
推理速度 (4-bit)~51 tok/s (3x faster)-
权重大小 (8-bit)237 GBGLM-5: 417 GB
质量MoE 4-bit 损失极小Dense 4-bit 损失明显
特性必带 <think> 推理不一定

关键认知: MoE 模型的 4-bit 量化质量损失远小于 Dense 模型,因为每个 expert 独立量化。


前置条件

  • Mac Studio M3 Ultra 512GB RAM (或其他 Apple Silicon 256GB+)
  • macOS 15+ (Sequoia)
  • Homebrew + Python 3.11+
  • 至少 250GB 可用磁盘空间

第一步:下载原始权重

使用 huggingface-cli 加速下载:

code
pip install -U huggingface-cli hf_transfer
 
# 启用并行下载 (实测 ~11GB/min)
export HF_HUB_ENABLE_HF_TRANSFER=1
 
# 下载 M2.5 原始权重
huggingface-cli download MiniMaxAI/MiniMax-M1 --local-dir ~/models/MiniMax-M1-raw

⚡ 总下载约 500GB,~11GB/min 约需 45 分钟。建议在 SSD 上操作。


第二步:MLX 格式转换

M2.5 没有官方 MLX 版,需要自行转换:

code
pip install -U mlx-lm
 
# 转换 8-bit 量化 (推荐,质量最佳)
mlx_lm.convert \
  --hf-path ~/models/MiniMax-M1-raw \
  --mlx-path ~/models/MiniMax-M2.5-MLX-8bit \
  --quantize --q-bits 8
 
# 转换 4-bit 量化 (速度优先)
mlx_lm.convert \
  --hf-path ~/models/MiniMax-M1-raw \
  --mlx-path ~/models/MiniMax-M2.5-MLX-4bit \
  --quantize --q-bits 4
量化版本大小推理速度推荐场景
8-bit237 GB~25 tok/s生产推理(质量优先)
4-bit120 GB~51 tok/s多任务/快速响应(速度优先)

💡 MoE 模型 4-bit 质量损失极小,适合不需要最高精度的场景。


第三步:安装 oMLX 推理引擎

oMLX 是 MLX 的生产级推理服务器,支持 Anthropic + OpenAI 双 API:

code
# 创建虚拟环境
python -m venv ~/omlx-env
source ~/omlx-env/bin/activate
 
# 安装 oMLX
pip install omlx
 
# 或从源码安装(推荐,方便 patch)
git clone https://github.com/jundot/omlx.git ~/omlx-repo
cd ~/omlx-repo
pip install -e .

第四步:配置 oMLX

创建配置文件 ~/.omlx/model_settings.json

code
{
  "models": [
    {
      "model_id_or_path": "~/models/MiniMax-M2.5-MLX-8bit",
      "is_default": true
    },
    {
      "model_id_or_path": "~/models/MiniMax-M2.5-MLX-4bit"
    }
  ]
}

第五步:启动推理服务

code
# 前台启动(调试用)
omlx serve --port 8000 --max-model-memory 450GB
 
# 验证
curl http://localhost:8000/v1/models
 
# 测试推理 (Anthropic API)
curl http://localhost:8000/v1/messages \
  -H "Content-Type: application/json" \
  -H "x-api-key: any" \
  -d '{
    "model": "MiniMax-M2.5-MLX-8bit",
    "max_tokens": 1000,
    "messages": [{"role": "user", "content": "你好"}]
  }'

⚠️ max_tokens 必须 ≥ 1000,因为 M2.5 的 <think> 推理会消耗大量 token budget。


第六步:开机自启 (LaunchAgent)

创建 ~/Library/LaunchAgents/ai.omlx-server.plist

code
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>ai.omlx-server</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Users/neo/omlx-env/bin/omlx</string>
    <string>serve</string>
    <string>--port</string>
    <string>8000</string>
    <string>--max-model-memory</string>
    <string>450GB</string>
    <string>--paged-ssd-cache-dir</string>
    <string>/Users/neo/.omlx/cache</string>
  </array>
  <key>EnvironmentVariables</key>
  <dict>
    <key>MLX_METAL_FAST_SYNCH</key>
    <string>1</string>
  </dict>
  <key>RunAtLoad</key>
  <true/>
  <key>ThrottleInterval</key>
  <integer>60</integer>
  <key>StandardOutPath</key>
  <string>/Users/neo/logs/omlx.log</string>
  <key>StandardErrorPath</key>
  <string>/Users/neo/logs/omlx.err</string>
</dict>
</plist>
code
# 加载
launchctl load ~/Library/LaunchAgents/ai.omlx-server.plist
 
# 验证
launchctl list | grep omlx

⚠️ ThrottleInterval 必须 ≥ 60s,否则 Metal OOM 崩溃后会进入崩溃循环。


接入 Claude Code

Claude Code 可以直接通过 Anthropic API 格式连接 oMLX:

code
# 设置环境变量
export ANTHROPIC_BASE_URL=http://localhost:8000
export ANTHROPIC_API_KEY=any  # oMLX 不验证 key
 
# 启动 Claude Code
claude

接入 OpenClaw

OpenClaw 配置 (~/.openclaw/openclaw.json):

code
{
  "models": {
    "MiniMax-M2.5-MLX-8bit": {
      "provider": "openai",
      "baseUrl": "http://localhost:8000/v1",
      "apiKey": "any"
    }
  }
}

性能调优

环境变量

code
export MLX_METAL_FAST_SYNCH=1  # GPU-CPU 同步加速

内存监控

code
# 查看真实内存占用 (Wired = 模型权重 + 系统)
vm_stat | grep "wired"
 
# 8-bit 稳态: Wired ~234GB, Free ~240GB
# 4-bit 稳态: Free ~380GB

模型切换

code
# 快速切换到 4-bit (释放 117GB 内存)
ai-switch 4bit
 
# 切回 8-bit
ai-switch 8bit

常见问题

Q: M2.5 回复总是带 <think> 标签?

A: 正常。M2.5 的推理标签是必带的,无法禁用。oMLX 会自动过滤 <think> 标签。

Q: Metal OOM 崩溃后 Wired 内存不释放?

A: Metal GPU Hang 后驱动层可能泄漏内存(Wired 残留 245GB+)。唯一修复方式是重启机器。

Q: 推理突然变慢(25→10 tok/s)?

A: 这是 GPU Hang 的前兆信号。立即保存工作并准备重启。

Q: SSD Cache 会影响推理速度吗?

A: 不会。SSD Cache 存的是 KV Cache(注意力结果),不影响推理速度(稳态~25 tok/s)。


下一步


最后更新: 2026-02-16