피드로 돌아가기
GeekNewsBackend
원문 읽기
Show GN: Google CausalImpact R 패키지를 Python으로 포팅 (Gibbs 샘플러는 Rust)
Google CausalImpact R 패키지를 Python으로 포팅하면서 Gibbs 샘플러를 Rust로 구현해 R 대비 약 30배 성능 향상 달성
AI 요약
Context
기존 Python 포팅들이 여러 문제를 가지고 있었다. pycausalimpact는 MLE를 사용해 R과 결과가 달랐고, tfcausalimpact는 3GB 이상의 TensorFlow 의존성을 필요로 했다. 대부분의 포팅이 spike-and-slab 변수 선택 기능을 구현하지 않았는데, 이는 R의 bsts 패키지가 여러 control 시계열 중 적합한 것을 자동으로 선택하는 핵심 기능이다.
Technical Solution
- Gibbs 샘플러를 Rust로 구현하고 PyO3를 통해 Python에서 호출: R의 bsts 패키지와 동일한 Gibbs 샘플러 재현
- 칼만 필터, 시뮬레이션 스무더, spike-and-slab 사전분포를 R과 동일하게 구현: 수치 동등성 검증 범위는 포인트 효과 ±3%, CI 범위 ±5%
- Coordinate-wise 샘플링과 StudentSpikeSlabPrior 기본값(expected.r2=0.8, prior.df=50)을 R 출력과 일치시킴: R CausalImpact 1.4.1과의 매 커밋마다 CI에서 수치 동등성 테스트 실행
- TensorFlow 의존성 제거: 경량의 Python 패키지 구조 달성
Impact
R 대비 약 30배 빠른 성능
Key Takeaway
Language-specific 통계 알고리즘을 포팅할 때는 수치 동등성을 엄격하게 검증하고, 성능이 중요한 부분(Gibbs 샘플러)은 저수준 언어(Rust)로 구현한 뒤 FFI(PyO3)로 연결하는 방식이 의존성 최소화와 성능 최적화를 동시에 달성할 수 있다.
실천 포인트
R/MATLAB 통계 패키지를 Python으로 마이그레이션해야 하는 팀에서는 MLE 기반 근사 대신 원본의 Bayesian 샘플러를 재구현하고, 계산 집약적 부분만 Rust+PyO3로 작성하면 원본과의 수치 호환성을 유지하면서도 30배 성능 향상을 기대할 수 있다.