Deepity: 수작업으로 튜닝된 C++/CUDA 예측 코딩 라이브러리, MNIST에서 jpc (JAX)와 ngc-learn을 능가하다
요약
Deepity는 C++20 기반으로 구축된 예측 코딩(Predictive Coding, PC) 라이브러리입니다. AVX/CUDA 커널 수준의 최적화를 통해 성능을 극대화했으며, MNIST 벤치마크에서 jpc (JAX)와 ngc-learn 대비 우수한 속도를 기록했습니다. Python 바인딩을 제공하여 PyTorch/Keras 환경과 유사하게 사용할 수 있습니다.
핵심 포인트
- Deepity는 C++20 기반의 예측 코딩(PC) 엔진입니다.
- AVX2/AVX-512 및 CUDA 백엔드를 활용한 커널 수준 최적화가 핵심입니다.
- MNIST 벤치마크에서 jpc 대비 높은 속도와 경쟁력 있는 정확도를 보였습니다.
- 클래식 안정화, 잔차 연결 등 다양한 PC 변형을 지원하는 '만능' 구조를 갖췄습니다.
저는 C++20으로 처음부터 예측 코딩(Predictive Coding, PC) 엔진을 구축했으며, 그 위에 얇은 Python 레이어를 추가하여 첫 공개 버전을 출시했습니다. 피드백을 받고자 여기 글을 올립니다. 또한, 실제 커널 수준의 최적화 작업이 뒤따르는 바닥부터 구현된 PC 구현체를 많이 보지 못했기 때문입니다.
예측 코딩이란 무엇인가: 역전파(backprop)가 저장된 계산 그래프를 통해 단일 전역 오류 신호로 거꾸로 흐르는 대신, PCN의 각 레이어는 자신의 상태에 대한 국소적인 믿음(local belief)을 가지고 있으며, 이를 상위 레이어로부터 오는 하향 예측(top-down prediction)과 비교합니다. 학습은 '안정화(settling)' 단계와 해당 레이어 자체의 오류만을 보는 가중치 업데이트가 번갈아 일어납니다. 어떤 레이어도 다른 레이어 가중치의 전치 행렬을 필요로 하지 않으며, 메모리에 보관해야 할 역방향 그래프도 없습니다.
Deepity가 실제로 무엇인가:
- AVX2/AVX-512 SIMD 커널(초월 활성화 함수는 SLEEF를 통해 수작업으로 작성), GEMM을 위한 OpenBLAS/MKL, 그리고 CUDA 백엔드(settling 루프를 위한 cuBLAS + CUTLASS + CUDA 그래프 캡처)로 구성된 C++20 코어입니다. 이 백엔드는 대규모 학습에 대해 여전히 튜닝 중이며 (아직 사용 불가), Python 바인딩은 nanobind를 통해 제공됩니다.
pip install pydeepity를 사용하여 설치하고,import deepity후 PyTorch/Keras에서 네트워크를 정의하는 방식과 동일하게 네트워크를 정의할 수 있습니다. - 여러 PCN 변형이 존재합니다: 일반적인 클래식 안정화(classic-settling) 네트워크, 직접 콜렌-폴락 피드백(Direct Kolen-Pollack feedback)(훨씬 적은 안정화 단계가 필요하며 정확도 손실이 일부 있음), 그리고 µPC 스케일링, 잔차 연결(residual connections), 증분 PC(incremental PC), 오류 기반 PC(error-based PC) 및 모멘텀 안정화를 모두 독립적인 토글로 제공하는 '만능' 네트워크입니다 (기본값은 비활성화).
주요 벤치마크 결과 (세 가지 PC 구현체에 걸쳐 동일한 설정 매칭: 784-512-512-10 시그모이드 네트워크, T=20 안정화 단계, 배치 크기 250, 100 에포크, AdamW): Deepity : 98.21% (487.5초) jpc (JAX) : 97.55% (531.4초) ngc-learn : 98% (1707.7초)
테스트는 단일 머신(12세대 i7-12700H 노트북 CPU)에서 수행되었으며, 저장소에 원시 로그와 함께 재현 가능합니다.
같은 아키텍처에서 순수한 PyTorch 역전파(backprop) 실행은 참고 지점으로서 627.8초에 97.51%를 기록합니다 (PC가 20번의 안정화 패스(settling passes)를 수행하는 반면, 이는 배치당 단일 통과이므로 공정한 비교는 아닙니다). 시간이 실제로 어디에 쓰이는지에 관심이 있다면 커널 수준의 수치를 참고하십시오: 전체 PC 학습 단계를 측정하는 Google Benchmark 하네스(harness)는 약 690 GFLOPS/s를 유지하며, 위에서 언급된 실제 종단 간(end-to-end) MNIST 실행에 동일한 FLOP 계산을 적용하면 약 675 GFLOPS/s로 나옵니다. 솔직히 말씀드리자면 아직 완료되지 않은 부분이 있습니다: 이것은 현재까지 단독으로 유지 관리된 알파 소프트웨어(0.1.0a3)입니다. CPU 경로는 성숙하고 벤치마크가 수행된 부분입니다. CUDA 백엔드는 빌드되고 실행되지만, 대규모 ImageNet 학습에 대해서는 여전히 최적화 중이며, 컨볼루션 경로는 현재 cuDNN 대신 im2col+cuBLAS를 사용합니다 (TF32가 활성화되어 있지만, 여전히 cuDNN의 특수 소형 커널 컨볼루션 알고리즘을 따라가지 못합니다). 제가 실제로 검증하지 않은 수치를 발표하고 싶지 않기 때문에 의도적으로 CUDA 대 CPU 비교 수치는 제공하지 않았습니다.
설치 과정은 의도적으로 가볍게 구성되었으며, numpy와 rich만 포함되어 있고 번들된 머신러닝(ML) 프레임워크는 없습니다: pip install pydeepity
from deepity import SimplePCN, Linear, TanH
import numpy as np
net = SimplePCN(Linear(2, 8), TanH(), Linear(8, 1), batch_size=1)
net.configure(learning_rate=0.05, inference_rate=0.3, lmbda=0.0001, optimizer="SGD")
x = np.array([1.0,-1.0], dtype=np.float32)
y = np.array([1.0], dtype=np.float32)
energy = net.train_step(x, y, steps=50) # returns total pred. error
저장소 (MIT 라이선스): https://github.com/Deepity-HQ/Deepity
PyPI: https://pypi.org/project/pydeepity
알고리즘, 커널 퓨전(kernel fusion) 작업, 또는 역전파(backprop)와 비교했을 때 왜 PC가 시간 가치가 있는지 없는지에 대한 질문에 기꺼이 답변하겠습니다. 또한 기여자도 찾고 있으며, 특히 C++/CUDA 성능이나 빌드 시스템/DevOps 배경을 가진 분들을 환영합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 r/MachineLearning (hot)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기