노트북 코드에서 완벽한 추상화 계약과 모노레포로 나아간 DS와 MLE의 3단계 협업 진화기
토스뱅크 ML 서비스 팀이 데이터 사이언티스트(DS)와 머신러닝 엔지니어(MLE) 간의 협업 갈등을 해결하고 생산성을 극대화한 여정을 다룹니다. 주피터 노트북 파일 직접 전달의 한계에서 시작해 공통 패키지 추상화 설계, uv 기반 모노레포, 그리고 AI 코딩 스타일 통합 팩까지 단계별로 진화한 과정을 생생하게 풀어냅니다.
ML 모델 이관 과정에서 환경 불일치와 모호한 R&R로 배포 주기가 지연되는 팀, 혹은 파편화된 AI 작성 코드로 인해 리뷰 피로도가 높은 MLOps 엔지니어 및 테크 리더에게 강력 추천합니다.
데이터 사이언티스트(DS)가 개발한 모델을 머신러닝 엔지니어(MLE)가 서빙 환경으로 이관하는 과정에서 환경 차이와 불명확한 역할 분담으로 소통 비용이 증가했습니다. 또한, 각 모델의 실행 구조가 다르고 AI 기반 코드 작성 스타일마저 제각각이어서 일관된 유지보수가 어려웠습니다.
전처리, 추론, 후처리 과정을 규격화한 공통 추상 클래스 기반의 패키지를 정의하여 협업을 코드 계약 형태로 전환하고, 'uv' 모노레포를 통해 이를 관리했습니다. 추가적으로 AI 도구 도입으로 다양해진 스타일의 격차를 좁히기 위해 'pfmls-stylepack' 규칙 모음을 적용하여 컨벤션을 자동 정렬했습니다.
이전 작업에 수일씩 소요되던 과정을 단 하루 만에 완료(첫 커밋부터 배포까지 당일 완료)할 수 있도록 단축시켰습니다. 더불어 패키지 매니저를 기존 'poetry'에서 'uv' 워크스페이스로 전면 전환하며 빌드 속도를 기존 대비 3~5배 개선했습니다.
Trade-off
공통 인터페이스를 고치면 이에 의존하는 모노레포 내 모든 모델이 영향을 받아 고도의 주의와 추가 영향도 평가가 요구됩니다. 또한 모델 수가 점차 누적되면서 장기적으로 저장소가 무거워져 지속적인 경량화 및 툴링 최적화 노력이 동반되어야 합니다.
상속받는 여러 하위 클래스가 특정 인터페이스나 핵심 구조적 기능을 반드시 상속 및 구현하도록 규칙을 정의해 두는 설계 기법입니다.
여러 라이브러리나 앱 등 독립적으로 구분되는 프로젝트 소스 코드를 단일 저장소 내에서 유기적으로 조율하며 개발하는 아키텍처 모델입니다.
Rust 기반으로 개발되어 신속함을 무기로 앞세운 최신 Python 패키지 인스톨러 겸 대규모 워크스페이스 관리 도구입니다.







