[Hacker News 요약] Swift로 LLM 행렬 곱셈 최적화: Gflop/s에서 Tflop/s로 성능 향상 여정
21
설명
이 글은 Apple Silicon 환경에서 Swift를 사용하여 대규모 언어 모델(LLM) 훈련을 위한 행렬 곱셈 연산의 성능을 극대화하는 과정을 다룹니다. 저자는 Andrej Karpathy의 llm.c를 벤치마크 삼아, 어떠한 외부 프레임워크나 라이브러리 없이 순수 Swift 코드로 Gflop/s 수준의 성능을 Tflop/s까지 끌어올리는 다양한 최적화 기법을 탐구합니다. 이는 Swift가 저수준 수치 연산에서도 C와 동등하거나 그 이상의 성능을 낼 수 있음을 보여주는 심층적인 사례 연구입니다.
### 배경 설명
머신러닝, 특히 LLM 훈련에서 행렬 곱셈은 전체 연산량의 대부분을 차지하는 핵심적인 부분입니다. 모델의 가중치와 입력 데이터를 처리하는 순방향(forward pass) 및 역방향(backward pass) 계산 모두 이 행렬 곱셈에 크게 의존합니다. 따라서 이 연산의 효율성은 LLM 훈련 속도와 직결되며, 온디바이스 AI 시대에 Apple Silicon과 같은 전용 하드웨어에서 최적의 성능을 끌어내는 것이 중요해지고 있습니다.
저자는 기존 Python 기반의 머신러닝 프레임워크들이 내부적으로 C/C++나 CUDA와 같은 저수준 언어로 구현된 연산 엔진을 오케스트레이션하는 방식에 한계를 느끼고, 직접 제어 가능한 Swift로 LLM 훈련 코드를 작성하고자 했습니다. Andrej Karpathy의 간결한 llm.c 구현은 이러한 저수준 최적화의 가능성을 보여주었으며, Swift가 C 코드와 경쟁하며 성능을 향상시키는 여정의 출발점이 되었습니다. 이 과정은 Swift 개발자들이 Apple Silicon의 잠재력을 최대한 활용하여 고성능 수치 연산을 구현하는 데 필요한 통찰력을 제공합니다.
### llm.c 및 기본 Swift 구현
C로 작성된 llm.c의 행렬 곱셈 구현을 기준으로 삼아, 순수 Swift로 포팅한 초기 버전의 성능을 비교합니다. 초기 Swift 구현은 C 대비 15~20배 느린 2.8 Gflop/s 수준으로, LLM 훈련에 사용하기에는 비현실적인 속도를 보였습니다. 이는 Swift의 기본 `Array`가 가지는 Copy-on-Write(COW) 및 참조 검사 오버헤드와 컴파일러 최적화의 한계 때문이었습니다.
### Swift Array 최적화: MutableSpan 및 SIMD/FMA 활용
Swift `Array`의 COW 오버헤드를 해결하기 위해 Swift 6.2에서 도입된 `MutableSpan`을 사용하여 불필요한 복사 및 검사를 제거했습니다. 이 개선으로 훈련 속도가 3배 이상 빨라졌습니다. 또한, C 컴파일러의 FMA(Fused-Multiply-Add) 명령어 활용에 주목하여, `Swift-Numerics` 라이브러리의 `Relaxed.multiplyAdd`를 사용하여 FMA와 유사한 SIMD 연산을 가능하게 했습니다. 이로써 토큰 처리 속도를 약 10배 추가 향상시켰습니다.
### 루프 구조 개선: InlineArray 및 멀티스레딩 도입
C 구현이 8x 루프 언롤링을 통해 효율적인 메모리 접근과 SIMD 파이프라이닝을 유도하는 방식에 착안하여, Swift 6.2의 `InlineArray`를 사용해 C의 스택 할당 배열과 유사하게 중간 결과를 저장하고 루프를 재구성했습니다. 이로써 C와 거의 동등한 성능을 달성했습니다. 나아가, `llm.c`의 OpenMP `pragma` 지시어처럼, Swift에서 `DispatchQueue.concurrentPerform`을 활용하여 주요 루프들을 멀티스레드로 병렬화하여 훈련 속도를 C의 OpenMP 버전보다도 빠른 5.4배 향상시켰습니다.
### 하드웨어 가속: Apple Silicon AMX 유닛 활용
Apple Silicon에 내장된 비공개 AMX(Apple Matrix Coprocessor) 유닛을 역공학하여 직접 활용하는 방법을 탐구했습니다. `AMX_MATFP`, `AMX_LDX`, `AMX_LDY`, `AMX_STZ` 등의 저수준 명령어를 사용하여 매트릭스 연산을 가속화했으며, 이를 통해 CPU 기반 연산에서 훈련 속도를 1.67배 추가 향상시켰습니다. 이는 Apple Silicon의 숨겨진 잠재력을 직접 활용하는 극단적인 최적화 사례입니다.
### Metal GPU 컴퓨트 셰이더를 통한 최종 성능 최적화
최종적으로 GPU의 Metal 컴퓨트 셰이더를 사용하여 행렬 곱셈을 구현했습니다. 초기 Metal 구현은 AMX 대비 큰 이점을 보이지 않았으나, 스레드 그룹(threadgroup) 및 타일링(tiling) 기법을 적용하여 메모리 접근 효율성을 극대화했습니다. 이 과정을 통해 C 기준 30배 이상 빠른 1.1 Tflop/s 성능을 달성하며, Gflop/s에서 Tflop/s로의 성능 향상 목표를 초과 달성했습니다.
### 가치와 인사이트
이 글은 순수 Swift 코드로 LLM의 핵심 연산인 행렬 곱셈을 Gflop/s에서 Tflop/s 수준으로, 즉 382배 이상 가속하는 놀라운 여정을 보여줍니다. 이는 Swift가 단순히 고수준 애플리케이션 개발 언어를 넘어, 저수준 시스템 프로그래밍 및 고성능 수치 연산 분야에서도 C/C++와 견줄 만한 잠재력을 가지고 있음을 입증합니다.
주요 시사점은 다음과 같습니다. 첫째, Swift의 `Array` Copy-on-Write(COW) 오버헤드와 같은 언어적 특성을 이해하고 `MutableSpan` 등으로 회피하는 것이 필수적입니다. 둘째, `Swift-Numerics`의 `Relaxed`와 같은 라이브러리를 통해 FMA와 SIMD 연산을 적극 활용해야 합니다. 셋째, 루프 구조를 재조정하고 `InlineArray`를 사용하여 캐시 효율성을 높이는 것이 중요합니다. 넷째, `DispatchQueue.concurrentPerform`을 통한 멀티스레딩과 AMX, Metal GPU와 같은 하드웨어 가속 장치를 활용하는 것이 최종 성능을 좌우합니다.
비록 이러한 최적화 과정에서 Swift 코드의 가독성이 저하되는 부분도 있었지만, 이는 고성능 컴퓨팅의 본질적인 도전 과제임을 보여줍니다. 실무적으로는 이러한 저수준 최적화된 코드를 직접 작성하기보다는, Apple이 제공하는 Accelerate, BNNS, CoreML, MPSGraph와 같은 고성능 프레임워크를 활용하는 것이 권장됩니다. 하지만 이 글은 해당 프레임워크들이 내부적으로 어떤 원리로 성능을 끌어올리는지에 대한 깊은 이해를 제공합니다.
### 기술·메타
- Swift
- C
- Metal
- Apple Silicon (CPU, SIMD, AMX, GPU)
- LLM (Large Language Model)
- Matrix Multiplication
- Fused-Multiply-Add (FMA)
- Swift-Numerics (Relaxed)
- MutableSpan (Swift 6.2)
- InlineArray (Swift 6.2)
- DispatchQueue.concurrentPerform
- OpenMP
- Accelerate framework (BLAS)
- BNNS
- CoreML
- MPSGraph
### 향후 전망
이 시리즈의 다음 글에서는 Apple Silicon에서 LLM 훈련 및 추론을 위한 Apple의 공식 고성능 라이브러리들, 즉 BLAS, BNNS, CoreML, MPSGraph 등을 탐구할 예정입니다. 저자는 직접 구현한 Metal 코드가 M3 Max GPU의 이론적 성능(15 Tflop/s)에 한참 못 미치는 1.1 Tflop/s를 달성했음을 인정하며, 전문적인 타일링(tiling) 기법을 적용하면 30% 이상의 추가 성능 향상이 가능할 것이라고 전망합니다.
이는 온디바이스 LLM의 미래가 단순히 하드웨어의 물리적 성능뿐만 아니라, 해당 하드웨어에 최적화된 소프트웨어 스택, 특히 저수준 라이브러리와 프레임워크의 역할이 매우 중요함을 시사합니다. 커뮤니티 차원에서는 Swift 언어 자체에서 병렬 처리나 메모리 관리의 편의성을 높이는 기능들이 추가되어, 고성능 코드를 더 안전하고 가독성 있게 작성할 수 있도록 발전할 여지가 있습니다. 궁극적으로는 Apple의 ML 프레임워크들이 이러한 저수준 최적화의 복잡성을 추상화하여, 개발자들이 더 쉽게 고성능 온디바이스 AI 애플리케이션을 구축할 수 있도록 지원할 것으로 기대됩니다.
📝 원문 및 참고
- Source: Hacker News
- 토론(HN): [news.ycombinator.com](https://news.ycombinator.com/item?id=48085685)
- 원문: [링크 열기](https://www.cocoawithlove.com/blog/matrix-multiplications-swift.html)
---
출처: Hacker News · [원문 링크](https://www.cocoawithlove.com/blog/matrix-multiplications-swift.html)
댓글 0
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.