피드로 돌아가기
GeekNewsBackend
원문 읽기
Show GN: Google CausalImpact R 패키지를 Python으로 포팅 (Gibbs 샘플러는 Rust)
Google CausalImpact R 패키지를 Python으로 포팅하면서 Rust 기반 Gibbs 샘플러로 R 대비 약 30배 성능 향상 달성
AI 요약
Context
기존 Python 포팅들이 여러 문제를 가지고 있었습니다. pycausalimpact는 MLE를 사용해 R과 결과가 상이했고, tfcausalimpact는 3GB 이상의 TensorFlow 의존성이 필요했습니다. 무엇보다 어떤 포팅도 spike-and-slab 변수 선택을 구현하지 않았는데, 이는 R의 bsts 패키지가 제공하는 핵심 기능입니다.
Technical Solution
- Gibbs 샘플러를 Rust로 구현하고 PyO3를 통해 Python에서 호출: R의 bsts 패키지와 동일한 샘플링 로직 재현
- spike-and-slab 변수 선택 구현: Coordinate-wise 샘플링과 StudentSpikeSlabPrior 기본값(expected.r2=0.8, prior.df=50)을 R 출력과 정확히 일치시킴
- 칼만 필터 및 시뮬레이션 스무더 통합: R CausalImpact 구현과의 수치 동등성 확보
- TensorFlow 의존성 제거: 경량 Python 패키지 구조 실현
- 매 커밋마다 수치 동등성 CI 테스트 실행: 포인트 효과 ±3%, 신뢰구간 범위 ±5% 오차 한계 내에서 R 1.4.1과의 정합성 검증
Impact
약 30배의 성능 향상을 R 대비 달성했습니다.
Key Takeaway
통계 알고리즘의 정확한 재현과 cross-language 성능 최적화를 동시에 달성하려면, 핵심 계산 로직을 저수준 언어(Rust)로 구현하고 고수준 인터페이스(Python)와 바인딩하는 하이브리드 접근이 효과적입니다. 이때 매 변경마다 원본 구현(R)과의 수치 검증을 자동화하면 포팅 과정의 정확성을 보장할 수 있습니다.
실천 포인트
R이나 MATLAB의 기존 통계 패키지를 Python 환경으로 포팅해야 하는 상황에서, 알고리즘의 수치 정확성이 중요하면서도 성능 개선이 필요할 때는 Rust + PyO3 조합으로 병목 구간만 저수준 재구현하고, CI에서 원본과의 수치 동등성 테스트를 통합하면 신뢰도 높은 포팅을 빠르게 완성할 수 있습니다.