# 在 Mac 上部署 Strata + Qwen3.8-Flash-Next：新手教程

> 在 M4 Pro 64 GB 的 Mac 上用 Strata 跑 125B 的 Qwen3.8-Flash-Next：按内存选量化、一键安装、调到 64K 上下文、接入 Pi 做成后台服务，再让它无人值守写完一个俄罗斯方块 RPG 网页游戏，附实测速度和踩坑。

- 原文链接: https://laojin.blog/blog/20261015_strata_mac_qwen_flash_next
- 作者: 老金
- 发布日期: 2026-10-15
- 标签: 本地大模型, Strata, Qwen, Mac, Pi

---

![在 Mac 上部署 Strata + Qwen3.8-Flash-Next：新手教程](https://pic-1258874139.cos.ap-hongkong.myqcloud.com/laojinblog/posts/20261015/00_cover.png)

> 适用版本：Strata v0.1.44 / 0.1.44.1（截至 2026-10）
> 资料来源：[Strata README](https://github.com/Niko1221/Strata)、[docs/MAC.md](https://github.com/Niko1221/Strata/blob/main/docs/MAC.md)、[v0.1.44 发布说明](https://github.com/Niko1221/Strata/releases/tag/v0.1.44)
> 实测环境：M4 Pro / 64 GB / macOS 26.5，下文的"实测"数据都来自这台机器。

这篇分三块：
1. 把 Strata 和 Qwen3.8-Flash-Next 装到 Mac 上（第 1–7 节）
2. 接入 [Pi](https://github.com/badlogic/pi-mono) 编程智能体，改成后台服务（第 8–9 节）
3. 实战：让 Pi + Strata 从零写一个"俄罗斯方块 + RPG"网页游戏（第 10 节）

---

## 这是什么？

- Qwen3.8-Flash-Next：一个约 125B 参数的 MoE 大模型。
- Strata：一个免费、MIT 协议的本地推理引擎，专门让这个大模型在普通电脑上跑起来。它把常用的"专家"放在 GPU 上，其余放在内存或 SSD 上，并用推测解码（MTP）提速。
- 跑起来之后你会得到：
  - 浏览器聊天页面：`http://127.0.0.1:8080/`
  - OpenAI 兼容 API：`http://127.0.0.1:8080/v1`
  - Anthropic 兼容 API：`http://127.0.0.1:8080/v1/messages`

数据全在本机，不上传。

---

## 检查 Mac 配置

| 项目 | 要求 |
|---|---|
| 芯片 | Apple Silicon（M1 ~ M5）。**Intel Mac 不能用** |
| 系统 | macOS 15 或更新 |
| 内存 | 最少 32 GB；64 GB 及以上体验好得多 |
| 硬盘 | 至少 80~120 GB 空闲，必须是**内置 SSD** |
| 工具 | Command Line Tools，不需要完整的 Xcode |

在"终端"（按 `⌘ + 空格`，输入 `Terminal`）里运行下面的命令查看配置：

```bash
sysctl -n machdep.cpu.brand_string                          # 芯片
sysctl -n hw.memsize | awk '{print $1/1073741824 " GB"}'    # 内存
sw_vers -productVersion                                     # macOS 版本
df -h ~                                                     # 硬盘剩余空间
```

---

## 安装命令行工具（只需一次）

```bash
xcode-select --install
```

如果提示"已安装"，或者你已经装了 Xcode，直接跳过这一步。

---

## 下载 Strata

```bash
mkdir -p ~/Dev/Qwen/FlashNext && cd ~/Dev/Qwen/FlashNext   # 放在哪里都可以
git clone https://github.com/Niko1221/Strata
cd Strata
```

> 发布页的 zip 里没有现成的 Mac 程序，Mac 版需要在本机编译，下一步的脚本会全自动完成。
> v0.1.44 的问题已在 0.1.44.1 修复，直接 clone 主分支就是最新版。实测启动后显示 `Strata 0.1.44.1-metal`。

---

## 按内存选择模型大小

Metal 最多只让一个程序常驻约 3/4 的内存（64 GB 的 Mac 约 48 GB 可用）。

| 量化版本 | 实际约需内存 | 建议内存 |
|---|---|---|
| Q2_0 | 46 GB | 64 GB 起 |
| IQ3_XXS | 55 GB | 74 GB 起 |
| IQ3_S（官方推荐） | 63 GB | 96 GB 起 |
| UD-Q4_K_XL（Unsloth，质量更高） | 91 GB | 128 GB |
| UD-Q5_K_XL / UD-Q6_K_XL | 放不进内存，从 SSD 流式读取 | 128 GB |

怎么选：
- 32 至 48 GB：Q2_0 或 IQ3_XXS。引擎会自动改为从 SSD 读取专家，能用但慢（官方 M4 mini 32 GB 实测约 8~14 tok/s）。
- 64 GB：选 Q2_0。本教程用的就是它。
- 96 GB：选 IQ3_S。
- 128 GB 及以上：选 UD-Q4_K_XL。

> ⚠️ 如果你还在跑别的本地模型（例如 llama.cpp / LM Studio 里的 Qwen3.8 27B），它们会和 Strata 抢内存。64 GB 的机器上**一次只开一个模型**。

---

## 一键安装并启动

```bash
./setup.sh --check              # （可选）只检查 Mac 是否满足条件
./setup.sh --yes --model Q2_0   # 不提问，直接用 Q2_0 和其他推荐选项
```

想自己回答问题的话，就只运行 `./setup.sh`，每个问题按回车用推荐值。

### 脚本会做的事，以及实测用时

| 步骤 | 做什么 | 实测（M4 Pro） |
|---|---|---|
| 准备 Python | macOS 自带 3.9 太旧，自动下载独立的 Python 3.12 到 `.python`（不需要 sudo 或 Homebrew） | 几秒 |
| 1. 检查 Mac | 芯片、内存、系统、工具、硬盘 | 秒级 |
| 2. 你的选择 | 模型大小、上下文长度（默认 32K） | — |
| 3. Python 依赖 | 安装到 `.venv` | 约 1 分钟 |
| 4. 编译 Metal 引擎 | 生成 `build-metal/strata` | 约 5 分钟 |
| 5. 下载模型 | 两个文件：主模型 37.6 GB + n-gram 表 28.8 GB | 约 2 小时（网速 6~10 MB/s） |
| 6. 准备模型 | 生成模型包和 MTP 草稿层 | 几分钟 |
| 7. 生成配置 | 写出 `strata-q2_0.json` 和 `run-q2_0.sh`，然后启动 | 约 1 分钟 |

> 下载断了就重新跑 `./setup.sh`，会续传。
> 下载要两个小时左右，可以把输出写进日志，放在后台跑：
> ```bash
> ./setup.sh --yes --model Q2_0 > ~/strata-setup.log 2>&1 &
> tail -f ~/strata-setup.log      # 随时查看进度，按 Ctrl+C 退出查看（不影响安装）
> ```

---

## 第一次启动

看到下面这行，就说明启动成功了：

```
ready: http://127.0.0.1:8080/v1  (OpenAI: /v1/chat/completions, Anthropic: /v1/messages, context 32768 tokens)
```

- 启动时 1~3 分钟内电脑可能会卡，它在读几十 GB 的模型，等它读完就好。
- 浏览器会自动打开聊天页面。
- 用命令行测一下：

```bash
curl http://127.0.0.1:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"any","messages":[{"role":"user","content":"用三句话介绍一下你自己。"}]}'
```

### 实测速度（M4 Pro 64 GB，Q2_0）

| 指标 | 实测 |
|---|---|
| 生成速度 | 约 29~37 tok/s（中位数 34） |
| prefill | 约 170~300 tok/s |
| 重复的前缀 | 直接复用缓存，几乎不花时间 |

作为对比，官方 M5 Max 128 GB 的生成速度约 110~120 tok/s。M4 Pro 的内存带宽不到它的一半，慢这么多说得通。

---

## 日常命令

都在 `Strata` 文件夹里运行：

| 想做什么 | 命令 |
|---|---|
| 再次启动（不会重新下载） | `./setup.sh` 或 `./run-q2_0.sh` |
| 换模型或改设置 | `./setup.sh --setup` |
| 只更新，不启动 | `./update.sh` |
| 测速 | `./bench.sh` |
| 重新编译引擎 | `./setup.sh --build` |
| 停止 | 在运行它的终端里按 `Ctrl + C` |

配置文件是 `Strata/strata-q2_0.json`，改完要重启才生效。常改的几项：
- `"--max-context"`：上下文长度
- `"--spec"`：推测解码窗口（Mac 默认 2）
- 在 JSON 顶层加 `"reasoning_effort": "medium"`：没有指定思考档位的请求，就默认用这一档

---

## 接入 Pi 编程智能体

Pi(https://github.com/badlogic/pi-mono) 是一个终端里的编程智能体，可以读写文件、运行命令，和 Claude Code 类似。Strata 的接口支持 Pi 需要的全部功能：工具调用（包括多个并行调用）、`reasoning_content` 思考输出，以及 `reasoning_effort` 的 `minimal`~`xhigh` 全部档位。

### 把上下文调到 64K

Pi 很吃上下文。实战中一次开发会话的上下文最高到了约 55K（见第 10 节），默认的 32K 不够用。

编辑 `Strata/strata-q2_0.json`，先备份：

```bash
cd ~/Dev/Qwen/FlashNext/Strata
cp strata-q2_0.json strata-q2_0.json.bak-32k
sed -i '' 's/"32768"/"65536"/' strata-q2_0.json
grep -A1 max-context strata-q2_0.json     # 应显示 65536
```

> ⚠️ 官方在 Mac 上只测到 32K。64K 在本机实测可用，但如果长对话出现异常，恢复 `.bak-32k` 就行。
> Pi 的 `~/.pi/agent/settings.json` 里如果有 `compaction.reserveTokens`（比如 45056），它必须明显小于上下文长度，否则 Pi 每一轮都会触发压缩。这也是本教程选 64K 的原因之一。

### 在 Pi 里添加 Strata

编辑 `~/.pi/agent/models.json`，在 `providers` 里加一个 `strata`。如果原来已有别的 provider，就和它并列：

```json
{
  "providers": {
    "strata": {
      "baseUrl": "http://127.0.0.1:8080/v1",
      "api": "openai-completions",
      "apiKey": "local",
      "compat": {
        "supportsDeveloperRole": false,
        "supportsReasoningEffort": true
      },
      "models": [
        {
          "id": "qwen3.8-flash-next-q2_0",
          "name": "Qwen3.8 Flash Next Q2_0 (Strata)",
          "reasoning": true,
          "input": ["text"],
          "contextWindow": 65536,
          "maxTokens": 16384
        }
      ]
    }
  }
}
```

| 字段 | 说明 |
|---|---|
| `id` | 必须和 `curl http://127.0.0.1:8080/v1/models` 返回的 id 一致 |
| `supportsReasoningEffort: true` | 让 Pi 的思考档位直接传给 Strata |
| `input: ["text"]` | Mac 版暂不支持图片输入 |
| `maxTokens` | 单次回复的上限。写大文件时会碰到它，见第 10 节的经验 |

在 Pi 里输入 `/model`，选 Qwen3.8 Flash Next Q2_0 (Strata)。也可以直接用命令行测试：

```bash
mkdir -p /tmp/pi-test && cd /tmp/pi-test && echo "hello strata" > note.txt
pi --provider strata --model qwen3.8-flash-next-q2_0 -p "读取 note.txt，用一句话告诉我里面写了什么"
```

实测：Pi 会先调用 `read` 工具读取文件，再正确回答。第一轮约 1 分钟，主要花在读 Pi 约 8.9K tokens 的系统提示上；之后几轮复用缓存，1~2 秒就开始回答。

---

## 做成后台服务

`./run-q2_0.sh` 需要一直开着一个终端窗口，而且每次都会打开浏览器。给 Pi 用的话，更方便的做法是做成后台服务。

### 启动脚本 `~/.local/bin/strata-serve`

```zsh
#!/bin/zsh
# Strata (Qwen3.8-Flash-Next Q2_0) —— 后台启动，:8080，给 pi 用
STRATA="$HOME/Dev/Qwen/FlashNext/Strata"
LOG_DIR="$HOME/Library/Logs/strata"
mkdir -p "$LOG_DIR"

if curl -s -m 2 http://127.0.0.1:8080/v1/models >/dev/null 2>&1; then
  echo "Strata 已在运行: http://127.0.0.1:8080/v1"
  exit 0
fi

# 64 GB 放不下两个模型：先卸载 llama.cpp router 里的 27B（没有就跳过这段）
curl -s -m 5 -X POST http://127.0.0.1:8081/models/unload \
  -H "Content-Type: application/json" \
  -d '{"model":"Qwen3.8-27B-Q4_K_M"}' >/dev/null 2>&1 && echo "已卸载 27B（:8081）"

cd "$STRATA" || exit 1
nohup "$STRATA/.venv/bin/python" "$STRATA/serve/server.py" \
  --engine strata --config "$STRATA/strata-q2_0.json" \
  --host 127.0.0.1 --port 8080 \
  > "$LOG_DIR/server.log" 2>&1 &
echo "Strata 启动中（约 1 分钟），日志: $LOG_DIR/server.log"
```

### 停止脚本 `~/.local/bin/strata-stop`

```zsh
#!/bin/zsh
if pkill -f "serve/server.py --engine strata"; then
  echo "已停止 Strata"
else
  echo "Strata 没有在运行"
fi
```

### 设置权限和别名

```bash
chmod +x ~/.local/bin/strata-serve ~/.local/bin/strata-stop
```

在 `~/.zshrc` 里加上下面两行，然后运行 `source ~/.zshrc`：

```zsh
alias strata-serve="$HOME/.local/bin/strata-serve"
alias strata-stop="$HOME/.local/bin/strata-stop"
```

### 日常用法

```zsh
strata-serve     # 启动（会自动卸载 27B），约 1 分钟后就绪
pi               # /model 选 Strata
strata-stop      # 用完停掉，释放约 46 GB 内存
```

> 在 27B 和 Strata 之间切换：先 `strata-stop`，再在 Pi 里选回 27B。如果 llama.cpp router 设置了 `--no-models-autoload`，就要先手动加载一次 27B。
> ⚠️ 在 Pi 里，模型和服务要对应。如果 Pi 当前选的是 27B，但它已经被 `strata-serve` 卸载了，就会报 `400: model is not loaded`。用 `/model` 切到 Strata 即可。实战中第一条消息就遇到了这个问题。

---

## 实战：用 Pi + Strata 开发一个网页小游戏

### 需求（只发了一句话）

```
开发一个有rpg玩法元素的俄罗斯方块游戏，html格式输出，丰富的动效，游戏可正常运行
```

### 结果

`tetris-rpg.html`：单文件，1077 行，47.7 KB，没有任何依赖，双击就能玩。

![tetris-rpg.html 运行截图：战士 Lv2 对战霜原狼](https://pic-1258874139.cos.ap-hongkong.myqcloud.com/laojinblog/posts/20261015/01_tetris_rpg.png)

- 玩法：3 个职业（战士、法师、刺客）；消行会对敌人造成伤害；有经验值、升级和属性点；每 5 波一个 BOSS；4 个技能（烈焰、圣盾、治愈、冰封），带冷却和法力消耗；6 种遗物；支持 T-Spin、连击和暴击。
- 动效：极光背景、消行闪光和粒子、伤害数字、攻击光束、屏幕震动、升级爆发、低血量警告、落点预览、WebAudio 音效，还有适配手机的触控按钮。
- 测试：模型自己写了两套无头测试，在 Node 里模拟 DOM 和 canvas：
  - `rpg_test.js`：34 项断言，覆盖职业、技能、护盾、冰冻、遗物、死亡、棋盘溢出、T-Spin 等
  - `long_test.js`：连续玩 20 波不出运行时错误，粒子数量有上限，网格始终是 20×10

### 会话数据

| 指标 | 数值 |
|---|---|
| 总用时 | 约 1 小时 50 分钟，全程无人干预 |
| 模型回复轮数 | 135 轮，其中 131 轮是工具调用 |
| 工具调用 | bash 73 次、read 18 次、edit 18 次、write 12 次 |
| 上下文最高 | 约 55K tokens（说明 32K 不够用） |
| Token 用量 | 输入约 46 万（其中 87% 命中缓存），输出约 13 万 |
| 时间去向 | 生成约 68 分钟，读提示约 37 分钟 |
| 生成速度 | 中位数 34 tok/s |

### 写需求的小模板

```
开发一个 <什么东西>，<输出格式>，要求 <关键功能>。
- 文件较大时请分段写入再合并
- 写无头测试（Node）验证核心逻辑，确保全部通过后再结束
- 最后总结功能和测试结果
```

---

## 当前限制（Mac 版）

- 一次只处理一个请求，多个客户端会排队。这会影响 Pi 的子智能体。
- 上下文官方只测到 32K；64K 在本机实测可用。
- 只支持文字，Mac 版没有图片输入（安装时用 `--vision yes` 可以开启，但测试很少）。
- Swift、Coder 版本暂时不能在 Mac 上安装；Qwen3.6 不能在 Mac 引擎上运行。
- 模型文件必须放在内置 SSD 上。

---
