Skip to content

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级别的计算性能。

设计原理

优化路径

文章展示了一个清晰的优化阶梯,每一步都有具体的性能数据和原理:

  1. Basic Swift:朴素四层循环,最慢的起点
  2. Span优化:使用Swift Span替代指针,减少边界检查
  3. 缓存友好(Tiling):分块计算提高缓存命中率
  4. 多线程:利用CPU多核并行
  5. SIMD intrinsics:手动使用ARM NEON指令集
  6. AMX(Apple Matrix Coprocessor):Apple Silicon专有矩阵加速单元
  7. 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特有优化技巧

  1. withUnsafeBufferPointer:绕过数组边界检查
  2. @inlinable:强制内联消除函数调用开销
  3. 内存布局控制:确保数据连续存放,利用缓存行
  4. 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本地矩阵运算的对比视角

可执行建议

  1. 端侧AI基础:如果往端侧AI方向走,理解矩阵乘法优化是必修课——这是所有神经网络计算的核心操作
  2. 鸿蒙/Android移植:文章的优化思路(缓存友好→SIMD→GPU)可以平移到移动端,ARM NEON在Android上同样可用
  3. Metal vs Vulkan:对比Metal GPU优化与Android Vulkan compute shader,理解跨平台端侧AI计算的差异
  4. 性能分析工具:学习文中使用的性能测量方法,用于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计算单元层次图有原创价值;与移动端开发的关联建议具体;性能数据来自实际测试而非理论估算。