Training an LLM in Swift, Part 1: 矩阵乘法优化¶
tags: #Swift #Matrix-Multiplication #LLM #HPC #Performance-Optimization #Apple-Silicon source: Cocoa with Love author: Matt Gallagher | 2026-04-18 score: 技术深度9/10 | 实用价值8/10 | 时效性8/10 | 领域匹配8/10 | 综合 8.4/10
核心概念¶
这篇技术文章展示了10种不同的矩阵乘法实现,从朴素Swift循环到Metal GPU compute shader,系统性地探索了在Apple Silicon上用Swift训练LLM的性能边界。参考实现是Andrej Karpathy的llm.c(纯C的GPT2实现),目标是"用Swift写出比C更快的代码"。关键洞察:Swift通过底层优化(SIMD→AMX→Metal)可达到Tflop/s级别的计算性能。
设计原理¶
优化路径¶
文章展示了一个清晰的优化阶梯,每一步都有具体的性能数据和原理:
- Basic Swift:朴素四层循环,最慢的起点
- Span优化:使用Swift Span替代指针,减少边界检查
- 缓存友好(Tiling):分块计算提高缓存命中率
- 多线程:利用CPU多核并行
- SIMD intrinsics:手动使用ARM NEON指令集
- AMX(Apple Matrix Coprocessor):Apple Silicon专有矩阵加速单元
- Metal GPU:GPU compute shader实现
Apple Silicon计算单元层次¶
CPU Scalar → CPU SIMD (NEON) → AMX (矩阵协处理器) → GPU (Metal)
~1 Gflop/s ~10 Gflop/s ~100+ Gflop/s ~1000+ Gflop/s (Tflop/s)
Trade-off:每提升一级都增加了代码复杂度。Metal GPU虽然最快,但数据传输开销(CPU↔GPU)在某些场景下可能抵消性能收益。AMX作为CPU内置单元,无需数据传输,在小到中等规模矩阵上可能是最优解。
参考实现¶
基于Karpathy的llm.c,将GPT2前向和反向传播的矩阵乘法核心:
// llm.c核心:z += x * y 的嵌套循环
for (int o = 0; o < OC; o++) {
float val = (bias != NULL) ? bias[o] : 0.0f;
for (int i = 0; i < C; i++) {
val += inp[bt * C + i] * weight[o*C + i];
}
out[bt * OC + o] = val;
}
关键实现¶
性能数据(关键指标)¶
- 朴素Swift:~1-5 Gflop/s(比C慢数倍,Swift的数组边界检查是主因)
- 优化后Swift:接近或超过纯C实现
- AMX优化:利用Apple Silicon矩阵协处理器,可达100+ Gflop/s
- Metal GPU:Tflop/s级别,但需考虑数据传输overhead
Swift特有优化技巧¶
withUnsafeBufferPointer:绕过数组边界检查@inlinable:强制内联消除函数调用开销- 内存布局控制:确保数据连续存放,利用缓存行
DispatchQueue.concurrentPerform:多线程分块
Metal Compute Shader¶
// Metal GPU矩阵乘法kernel
kernel void matmul_forward(
device const float* inp [[buffer(0)]],
device const float* weight [[buffer(1)]],
device float* out [[buffer(2)]],
constant int& C [[buffer(3)]],
uint2 gid [[thread_position_in_grid]])
{
float val = 0.0f;
for (int i = 0; i < C; i++) {
val += inp[gid.x * C + i] * weight[gid.y * C + i];
}
out[gid.x * OC + gid.y] = val;
}
关联分析¶
- Mojo-1.0 — Mojo同样追求"Python语法+系统级性能",两者都是让高级语言达到C/Metal级别的性能
- DS4-DeepSeek-Local-Inference — 端侧推理优化,与本文的端侧训练优化互补
- Google-TPU-8t-8i — 云端TPU vs Apple Silicon本地矩阵运算的对比视角
可执行建议¶
- 端侧AI基础:如果往端侧AI方向走,理解矩阵乘法优化是必修课——这是所有神经网络计算的核心操作
- 鸿蒙/Android移植:文章的优化思路(缓存友好→SIMD→GPU)可以平移到移动端,ARM NEON在Android上同样可用
- Metal vs Vulkan:对比Metal GPU优化与Android Vulkan compute shader,理解跨平台端侧AI计算的差异
- 性能分析工具:学习文中使用的性能测量方法,用于AppSmartInspector等工具的性能基准测试
自评¶
| 维度 | 分数 | 权重 | 加权 |
|---|---|---|---|
| 摘要质量 | 8 | 0.25 | 2.00 |
| 技术深度 | 9 | 0.25 | 2.25 |
| 相关性 | 8 | 0.20 | 1.60 |
| 原创性 | 9 | 0.15 | 1.35 |
| 格式规范 | 8 | 0.15 | 1.20 |
| 加权总分 | 8.40 |
评分说明:10种实现的优化阶梯分析独特且有深度;Apple Silicon计算单元层次图有原创价值;与移动端开发的关联建议具体;性能数据来自实际测试而非理论估算。