GPU 기반 데이터 병렬 확률 추론을 위한 Augur 모델링 언어

Augur는 Scala에 내장된 확률 프로그래밍 DSL로, 베이지안 네트워크 모델을 선언하면 컴파일러가 조건부 독립성을 분석해 GPU용 CUDA 코드를 자동 생성한다. 데이터‑병렬 메트로폴리스‑헤이스팅과 깁스 샘플러를 제공해 수천 개 코어에서 대규모 모델(LDA 등)을 효율적으로 추론한다.

저자: Jean-Baptiste Tristan, Daniel Huang, Joseph Tassarotti

GPU 기반 데이터 병렬 확률 추론을 위한 Augur 모델링 언어
**1. 서론** 확률 모델링은 모델 설계와 추론 구현 두 단계가 필요해 비전문가에게 높은 진입 장벽을 만든다. 기존 PPL(Probabilistic Programming Language)은 모델을 선언하면 자동으로 추론 코드를 생성하지만, 성능이 GPU와 같은 데이터‑병렬 아키텍처에 최적화되지 않아 실용성이 떨어진다. 저자들은 두 가지 관찰에 기반해 설계를 진행한다. 첫째, 적절한 추론 알고리즘 선택이 성능의 핵심이며, 이를 컴파일러가 모듈식으로 교체·확장 가능하도록 해야 한다. 둘째, 현대 하드웨어는 대규모 데이터 병렬성을 제공하므로, 조건부 독립성을 활용한 데이터‑병렬 추론이 가능해야 한다. **2. Augur 언어** Augur는 Scala에 내장된 DSL로, `bayes { … }` 블록 안에 베이지안 네트워크를 선언한다. 모델은 `sig` 클래스로 파라미터 구조를 정의하고, `bayes` 내부에서 확률 분포(예: Gaussian, Dirichlet, Categorical)를 샘플링한다. 예시로 LDA와 다변량 회귀 모델을 제시한다. LDA에서는 토픽‑문서‑단어 관계를 선언하고, `observe(w)` 로 관측 데이터를 지정한다. 회귀 모델은 가중치와 편향, 노이즈 파라미터를 정의하고, 입력 데이터 `x`와 출력 `y`를 관측한다. 선언형 모델은 일반 Scala 코드와 동일하게 객체화되어 재사용 및 테스트가 가능하다. **3. 컴파일러 구조** 컴파일러는 두 단계로 나뉜다. *프론트엔드*는 Scala 매크로를 이용해 `bayes` 블록을 파싱하고, 확률 분포와 연산을 심볼릭 IR로 변환한다. 이 IR은 트리 형태로 각 노드가 연산자·분포·변수를 나타낸다. *백엔드*는 런타임에 IR을 받아 최적화하고, 선택된 추론 알고리즘에 맞춰 CUDA 커널을 생성한다. 매크로 시스템 덕분에 기존 Scala 컴파일러의 타입 검사·상수 폴딩·데드코드 제거를 그대로 활용한다. 또한, 런타임에 하이퍼파라미터와 데이터 크기를 알 수 있어 병렬 전략을 동적으로 결정한다(예: 문서 수가 토픽 수보다 많을 경우 문서‑단위 병렬화). **4. 데이터‑병렬 추론 생성** - *메트로폴리스‑헤이스팅*: 모델의 사전·우도 곱을 로그‑공간에서 합산 형태로 전개한다. 각 데이터 포인트는 독립적인 항이므로 GPU 스레드가 동시에 평가한다. 결과 로그값을 합산해 제안된 샘플을 수용한다. - *깁스 샘플러*: 각 변수의 조건부 분포를 IR에서 추출하고, 조건부 독립성을 이용해 변수별 업데이트를 병렬화한다. 현재는 단일 변수 깁스만 지원하지만, 구조적으로 블록‑깁스나 콜랩스드 샘플러를 추가하기 쉬운 설계다. IR은 `Q`와 같은 심볼을 사용해 “이 서브트리는 병렬 가능”을 명시한다. 이는 GPU 커널 생성 시 메모리 접근 패턴을 최적화하고, 전역 메모리와 연산 비율을 높여 레이턴시를 숨긴다. **5. 실험 및 결과** 베이스라인으로 JAGS, Stan, 그리고 CPU‑기반 구현을 사용했다. LDA(수천 문서, 수백 토픽)에서는 GPU 구현이 12배~18배 가속을 보였으며, 메모리 사용량도 30% 이하로 감소했다. 다변량 회귀와 Gaussian Mixture Model에서도 비슷한 수준의 속도 향상이 관찰되었다. 특히, 데이터 포인트 수가 늘어날수록 GPU 스케일링이 선형에 가깝게 유지되었다. **6. 관련 연구 및 논의** 기존 PPL은 주로 CPU 중심 설계이며, 그래프 기반 모델 재현이 메모리 오버헤드를 초래한다. Augur는 심볼릭 IR을 통해 그래프 재현 없이도 조건부 독립성을 활용한다는 점에서 차별화된다. 그러나 현재는 콜랩스드 깁스, 변분 추론 등 고급 기법을 자동 생성하지 못한다는 제한이 있다. 향후 연구에서는 IR에 대한 정규화 규칙을 추가해 결합 가능성 탐지를 자동화하고, 다양한 추론 알고리즘을 플러그인 형태로 확장하는 것을 목표로 한다. **결론** Augur는 Scala와 GPU를 결합한 데이터‑병렬 확률 추론 프레임워크로, 모델 선언만으로 고성능 추론 코드를 자동 생성한다. 조건부 독립성을 심볼릭 IR로 명시하고, 두 단계 컴파일 파이프라인을 통해 유연한 알고리즘 교체와 최적화를 가능하게 한다. 실험 결과는 대규모 베이지안 네트워크에 대한 실용적인 가속을 입증한다.

원본 논문

고화질 논문을 불러오는 중입니다...

댓글 및 학술 토론

Loading comments...

의견 남기기