피드로 돌아가기
Show GN: Google CausalImpact R 패키지를 Python으로 포팅 (Gibbs 샘플러는 Rust)
GeekNewsGeekNews
Backend

Show GN: Google CausalImpact R 패키지를 Python으로 포팅 (Gibbs 샘플러는 Rust)

Google CausalImpact R 패키지를 Python으로 포팅하면서 Gibbs 샘플러를 Rust로 구현해 R 대비 약 30배 성능 향상 달성

merumeru2026년 3월 23일6advanced

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배 성능 향상을 기대할 수 있다.

원문 읽기