文章摘要
这篇文章介绍了作者在Swift中手动编写矩阵乘法代码以优化大型语言模型(LLM)训练性能的过程,目标是探索在Apple Silicon芯片(CPU/SIMD/AMX/GPU)上实现从Gflop/s到Tflop/s的性能突破。这是系列文章的第一篇,后续将探讨苹果的机器学习框架。作者采用"无框架、无库"的纯代码方式,不仅编写矩阵乘法内核,还将其应用于完整的LLM实现中,参考了Andrej Karpathy的llm.c项目。
文章总结
在Swift中训练LLM(第一部分):从Gflop/s到Tflop/s的矩阵乘法优化
本文作者探索了如何在Swift中通过手写矩阵乘法代码来高效训练大型语言模型(LLM),旨在展示Swift数学代码优化的关键步骤,并比较Apple Silicon上不同计算单元(CPU、SIMD、AMX和GPU)的性能表现。
优化历程
作者从Andrej Karpathy的llm.c项目获得灵感,这是一个用纯C实现的GPT2兼容模型。初始Swift实现性能极差,比C版本慢15-20倍。
通过以下优化步骤,作者最终将性能提升了382倍:
- 基础Swift实现:直接翻译C代码,性能仅达C的7.3%
- 使用mutableSpan:消除数组唯一性检查开销,训练速度提升3倍
- Relaxed数学运算:使用Swift-Numerics的Relaxed.multiplyAdd实现融合乘加(FMA)操作,推理速度提升10倍
- 循环展开:采用InlineArray实现类似C的循环展开,性能超越C版本
- 多线程优化:使用DispatchQueue.concurrentPerform,获得5.4倍加速
- AMX指令:利用Apple Matrix协处理器秘密指令,再获1.67倍加速
- Metal GPU实现:最终采用GPU计算着色器,达到1.1 Tflop/s性能
性能对比
| 实现方式 | 推理速度(tokens/s) | 训练速度(iterations/s) | 相对C性能 | |---------|-------------------|-----------------------|----------| | 基础C实现 | 0.926 | 0.175 | 100% | | 基础Swift | 0.054 | 0.014 | 7.3% | | 优化后Swift | 0.918 | 0.189 | 106.6% | | 多线程Swift | 4.356 | 1.014 | 558.5% | | AMX实现 | 5.884 | 1.678 | 958.8% | | 基础Metal | 4.29 | 2.302 | 1315.3% | | 优化Metal | 11.123 | 5.351 | 3057.7% |
结论
作者强调这些代码仅用于教学目的,实际开发应使用Apple提供的加速框架(如BLAS、BNNS、CoreML等)。下一篇文章将探讨macOS内置的高性能机器学习库。
虽然通过优化使Swift性能超越了C,但作者指出Swift在多线程实现时的代码可读性较差,期待Swift能提供更优雅的并行数组操作API。
完整代码和测试工具可从CwlLlmSwift获取,需要配合llmc-starter-pack数据集使用。
评论总结
这篇评论总结围绕四个主要观点展开:
- 文章质量高度评价
- 认为这是关于Swift性能优化的杰出文章,即使不关心LLM的人也会受益(评论1:"This is a pretty phenomenal article...great article on optimizing Swift performance")
- 作者Matt Gallagher被赞为iOS开发学习历程中的重要资源(评论3:"major highlights from the early days of my journey in learning iOS development")
- GPU性能讨论
- 指出实际GPU性能往往远低于理论峰值(评论2:"The real ceiling...is going to be 3-5 Tflop/s")
- 强调Nvidia的软件优势在于CUDA的精细优化(评论2:"CUDA has so many small kernels tuned for peak performance")
- 编译器优化争议
- 强烈反对普遍使用"-ffast-math",建议改用"-ffp-contract=fast"(评论4:"one must not use -ffast-math to get FMA")
- 批评编译器默认禁用FMA是过时的保守策略(评论4:"This policy...should have become obsolete")
- 技术细节探讨
- 对AMX指令是否保密提出疑问(评论1:"I'm curious if the AMX instructions are truly secret")
- 指出FMA在多数情况下能提高计算精度(评论4:"using FMA produces more accurate results")
不同观点保持平衡:既包含对文章的高度赞赏,也包含对技术细节的严谨讨论,特别是关于编译器优化的争议性观点。