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

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

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

merumeru2026년 3월 23일6advanced

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에서 원본과의 수치 동등성 테스트를 통합하면 신뢰도 높은 포팅을 빠르게 완성할 수 있습니다.

원문 읽기
Show GN: Google CausalImpact R 패키지를 Python으로 포팅 (Gibbs 샘플러는 Rust) | Devpick