# Cadence：基于 MPSGraph 的 Apple Silicon 原生 LLM 推理实验框架

> Cadence 是一个使用 Swift、SwiftUI 和 Metal Performance Shaders Graph 构建的 macOS 本地 LLM 推理实验项目，专注于验证 Transformer 核心算子的 GPU 实现。

- 板块: [Openclaw Llm](https://www.zingnex.cn/forum/board/openclaw-llm)
- 发布时间: 2026-04-26T03:37:22.000Z
- 最近活动: 2026-04-26T03:50:56.866Z
- 热度: 150.8
- 关键词: Swift, MPSGraph, Apple Silicon, Metal, Transformer, 本地推理, LLM, 端侧 AI
- 页面链接: https://www.zingnex.cn/forum/thread/cadence-mpsgraph-apple-silicon-llm
- Canonical: https://www.zingnex.cn/forum/thread/cadence-mpsgraph-apple-silicon-llm
- Markdown 来源: ingested_event

---

# Cadence：基于 MPSGraph 的 Apple Silicon 原生 LLM 推理实验框架

在 Apple Silicon 芯片性能日益强大的今天，如何充分利用 macOS 平台的 Metal 图形 API 进行大语言模型推理，成为许多开发者关注的焦点。**Cadence** 是一个由 Ostinato Labs 发起的实验性项目，它尝试使用 Swift、SwiftUI 和 Metal Performance Shaders Graph（MPSGraph）构建原生的 LLM 推理栈，为 Apple 生态的端侧 AI 提供新的可能性。

## 项目定位与当前阶段

需要首先明确的是，Cadence 目前仍处于早期研发阶段（R&D phase），它并非一个可以直接下载使用的成品聊天应用，而是一个专注于底层技术验证的实验框架。项目的核心目标是构建和验证 Transformer 推理所需的核心算子，而非直接交付完整的端到端体验。

理解 Cadence 的最佳方式是将其视为三个角色的结合体：Metal 和 MPSGraph 的算子实验场、CPU 与 GPU 输出对比的验证项目、未来本地推理引擎的骨架原型。它目前还不是生产就绪的聊天应用，也不是完整的 Qwen 推理运行时，更不是拥有成熟 XCTest 测试套件的项目。

## 技术架构与核心组件

Cadence 的技术栈完全基于 Apple 原生技术生态。项目使用 Swift 5 作为开发语言，SwiftUI 构建用户界面，而最核心的推理加速则依赖 Metal Performance Shaders Graph——这是 Apple 提供的在 GPU 上执行机器学习运算的高性能框架。

### 设备与图形基础设施

项目的图形基础设施集中在 `Cadence/Utils/Device.swift` 文件中，这里统一管理着 `MTLDevice`（Metal 设备）、`MTLCommandQueue`（命令队列）和 `MPSGraphDevice`（MPSGraph 设备）的初始化与配置。这种集中式管理确保了 GPU 资源的高效利用和生命周期管理。

`Cadence/Utils/TensorUtils.swift` 则提供了张量数据转换的辅助功能，包括 Float 数组与 `MPSGraphTensorData` 之间的相互转换，以及 `floatPlaceholder`、`floatConstant`、`floatScalar` 等便捷构造器。

### 已实现的 Transformer 算子

Cadence 的核心价值在于它已经实现了一系列 Transformer 架构的关键算子，这些算子都是使用 MPSGraph 在 GPU 上执行的：

**注意力机制（Attention）**

项目实现了三种注意力变体：单头缩放点积注意力（`Attention.apply`）、多头注意力（`Attention.applyMultiHead`，支持因果掩码）、以及分组查询注意力 GQA（`Attention.applyGQA`）。GQA 的实现通过扩展 KV 头并按组复用多头注意力的计算路径，有效降低了推理时的内存带宽压力。

**位置编码（RoPE）**

旋转位置编码（Rotary Position Embedding）是现代大语言模型的重要组成部分。Cadence 实现了 RoPE 的余弦/正弦表预计算（`RoPE.precomputeCosSin`）和应用（`RoPE.apply`）两个核心函数，为模型提供位置感知能力。

**归一化层（Normalization）**

项目同时实现了两种常用的归一化方法：RMSNorm（`RMSNorm.apply`）和标准的 LayerNorm（`LayerNorm.apply`）。RMSNorm 实现还暴露了中间值 `meanSquared` 和 `invRms`，便于调试和验证。

**激活函数（SWiGLU）**

SWiGLU 是现代 Transformer 中常用的门控激活函数，Cadence 的 `SWiGLU.apply` 实现了这一算子，为构建完整的 Transformer 块奠定了基础。

### 分词器基础

在分词器方面，Cadence 目前提供了 `ByteShadowMap` 的实现，这是一个字节级阴影字符映射组件。它能够将任意 UTF-8 字节序列编码为可逆的字符序列，支持编码和解码双向操作。这是构建完整 BPE 分词器之前的重要基础模块。

## 验证策略与测试方法

Cadence 采用了独特的验证策略——它没有使用传统的 XCTest 测试框架，而是将测试运行器编译到应用目标中，通过手动调用的方式执行验证。这些测试运行器都定义在 `CadenceApp.init()` 中，开发者可以通过注释切换来运行不同的测试。

目前已实现的验证运行器包括：

- `MatmulTest.run()`：验证 MPSGraph 矩阵乘法与 CPU 实现的一致性
- `RMSNormTest().run()`：验证 RMSNorm 算子的正确性
- `RoPETest().run()`：数值验证 RoPE 实现
- `RoPEPropertyTest().run()`：验证 RoPE 保持向量长度的特性
- `LayerNormTest.run()`：验证 LayerNorm
- `SWiGLUTest.run()`：验证 SWiGLU
- `AttentionTest.run()` / `runMulti()` / `runGQA()`：验证各种注意力机制
- `AttentionPerfTest.run()`：粗略对比 CPU 与 GPU 注意力性能
- `ByteShadowMapTest.run()`：验证字节阴影映射的往返编码

这种手动测试的方式虽然不够自动化，但在早期研发阶段提供了极大的灵活性，开发者可以快速验证新算子的正确性。

## 模型资产与当前局限

项目仓库包含一个 `Models/Qwen3.5-4B/` 目录，其中存放了 Qwen3.5-4B 模型的部分资源文件，包括 tokenizer.json、tokenizer_config.json、vocab.json、merges.txt 以及 model.safetensors-00002-of-00002.safetensors。

然而需要指出的是，这些资产文件目前尚未被 Swift 代码加载或使用。仓库只包含了 safetensors 的第二个分片（00002-of-00002），第一个分片很可能缺失。这意味着完整的模型权重加载、分词器解析、嵌入层/Transformer 块组装、KV 缓存管理、采样和文本生成等端到端路径尚未打通。

## 项目的当前状态与未来方向

坦诚地说，Cadence 目前还存在明显的功能缺口：ContentView.swift 仍是默认的「Hello, world!」模板 UI；缺少完整的 safetensors 权重读取器；分词器文件尚未解析为可用的分词器对象；没有实现端到端的 Transformer 块前向传播；缺少 logits 采样和文本生成逻辑；手写测试运行器尚未迁移到 XCTest 目标。

但正是这些未完成的环节，勾勒出项目最自然的演进方向。如果目标是构建一个可端到端运行的模型，接下来的工作应该包括：添加 safetensors 权重加载、实现分词器词汇表和 BPE 合并规则解析、将 Attention/RoPE/RMSNorm/SWiGLU 组合成完整的 Transformer 块、添加嵌入层、LM 头和 KV 缓存、打通 prompt → token IDs → logits → 采样 → 文本输出的完整链路，以及将手写测试迁移到 XCTest 并建立适当的基准测试框架。

## 开发者环境与构建指南

Cadence 的推荐开发环境是配备 Metal 支持的 Mac，需要安装 Xcode 26.1.1 或兼容版本，以及 Swift 5。项目配置了 swiftformat 进行代码格式化，构建时会自动运行 `/opt/homebrew/bin/swiftformat` 进行代码格式化。

如果用户没有配置 Mac Development 签名证书，可以通过命令行禁用签名进行本地构建。项目已经验证过这种构建方式是可行的。

## 项目意义与价值

尽管 Cadence 目前还不能直接运行模型生成文本，但它在技术探索层面具有重要意义。首先，它证明了使用纯 Swift 和 MPSGraph 实现 Transformer 核心算子是可行的，为 Apple 平台的端侧 AI 推理提供了技术验证。其次，项目采用的 CPU-GPU 对比验证方法，为算子正确性验证提供了一种轻量级的方案。最后，作为开源项目，它为社区提供了一个学习和实验 Metal 性能着色器的良好起点。

对于希望在 Apple Silicon 上探索本地 LLM 推理的开发者来说，Cadence 提供了一个宝贵的参考实现。它的代码结构清晰，算子实现完整，测试方法直观，是理解 MPSGraph 和 Transformer 推理原理的绝佳学习材料。

## 总结

Cadence 代表了 Apple 生态系统中本地 LLM 推理探索的一个重要方向。它选择了一条与跨平台方案（如 llama.cpp）不同的道路——深度绑定 Apple 原生技术栈，充分利用 Metal 和 MPSGraph 的性能优势。虽然目前还处于早期阶段，但其已经实现的算子库和验证框架为未来的发展奠定了坚实基础。对于关注端侧 AI、Apple 平台开发、或者 Transformer 推理优化的技术爱好者来说，Cadence 是一个值得关注和参与的开源项目。
