케이뱅크 개인화 프로젝트들은 어떤 구조로 만들어졌을까?

2023. 8. 16.Tech

안녕하세요. 케이뱅크 Data-Biz팀에서 데이터 사이언티스트로 일하고 있는 조용걸입니다.

이 글에서는 케이뱅크 개인화 프로젝트 레이아웃에 대해 소개해 드리고자 합니다.

정리되지 않은 프로젝트 : https://mitcommlab.mit.edu/broad/commkit/file-structure/

 

늘어나는 AL/ML 프로젝트 어떻게 관리해야 할까?

 

AI/ML 프로젝트 구조화하기

 

개인화 프로젝트에 대한 수요와 실 서비스에 사용되는 AI/ML 프로젝트들이 점차 늘어남에 따라 팀 내부뿐만 아니라 협업 부서와의 커뮤니케이션 비용도 함께 높아졌습니다. 또한, 우선순위에 밀려 잠시 중단했던 프로젝트를 다시 진행할 때에 코드 복기와 작업의 work-flow를 파악하는데 많은 시간이 소요되었습니다.

 

불필요하게 발생하는 작업자/타부서 간 커뮤니케이션 비용을 줄이고 업무의 생산성을 높이려는 방안을 고민하였고, 그 첫 단계로 개인화에 사용되고 있는 AI/ML 프로젝트들을 구조화하는 작업을 진행하였습니다.

 

다양한 프로젝트 구조 : https://data-newbie.tistory.com/614, https://github.com/victoresque/pytorch-template

 

 

프로젝트 공용으로 사용되는 부분은 패키지화하기

 

본격적인 작업에 앞서, core 부분 외에 프로젝트 공용으로 사용되는 Logging, AWS Data Access와 같은 유틸리티성 기능들과 모델 평가 지표들(recall, ndcg 등)은 공용 모듈로 패키지화하여 작업자 간 코드를 통일화하였습니다.

 

패키지화된 부분을 제외하고 나머지들을 기존에 제안된 프로젝트 구조들 [1,2,3]과
중요하다고 생각하는 아래 2가지를 고려하여 프로젝트 레이아웃을 설계하였습니다.

① 프로젝트의 work-flow가 어떻게 흘러가는지 쉽게 파악할 수 있어야 함

작업자의 자유도를 많이 해치지 말아야 함

 

아래 내용은 고객들의 소비(이체, 카드, 오픈뱅킹) 행태를 분석하기 위해 사용되는 거래 분류 프로젝트의 layout입니다.

repo-cdcm-curation-transaction-categorizer

 /data/docs, /ml/notebooks/profiles/query(src)/tasks

repo-cdcm-curation-transaction-categorizer
|--data                         <- 프로젝트에 사용되는 메타 및 사용자정보
|    |--dic
|    |   |--*.txt
|    |--cate_info.json
|    |--level_info.csv
|--docs                         <- 회의록 및 보고자료
|    |--20230801_거래분류보고.xlsx
|--ml                           <- AI/ML 작업에 사용되는 소스
|    |--model
|        |--__init__.py
|        |--data_handler.py
|        |--dataset.py
|        |--model_handler.py
|        |--net.py
|        |--trainer.py
|        |--vocab_build.py
|    |--__init__.py
|    |--params.py
|    |--settings.py
|--notebooks                     <- DataEDA, 실험 및 prototype 코드와 같은 노트북 파일
|    |--data_eda.ipynb
|    |--train_model.ipynb
|--profiles                      <- 프로젝트의 work-flow 명시
|    |--task_profile.json
|    |--train_profile.json
|--query                         <- tasks 파일에 사용되는 쿼리 또는 처리 함수
|    |--__init__.py
|    |--ddl_query.py
|    |--inference_dataset_etl_query.py
|    |--post_data_etl_query.py
|    |--pre_data_etl_query.py
|    |--query_tagging_query.py
|    |--train_dataset_etl_query.py
|--tasks                         <- query(src) 파일을 참조하여 task 정의
|    |--__init__.py
|    |--ddl_task.py
|    |--inference_dataset_etl_task.py
|    |--inference_task.py
|    |--post_data_etl_task.py
|    |--pre_data_etl_task.py
|    |--query_tagging_task.py
|    |--train_dataset_etl_task.py
|    |--train_task.py
|--README.MD
|--main.py                       <- profiles 안 작업 명세서를 바탕으로 프로젝트 work-flow(tasks) 실행

/data

프로젝트에 사용되는 메타 및 사용자 정보

 

/docs

회의록 및 보고자료

 

/ml

ㄴ ml/model

model/*.py : AI/ML과 관련된 파일 ex) 모델 layout, dataset 정의 등

params.py : 모델 변수 및 하이퍼 파라미터

settings.py : 프로젝트에 사용되는 Data Table 및 S3 경로 정의

 

/profiles

프로젝트의 work flow 명세 파일

ex)

- task_profile.json : 거래 분류 예측

- train_profile.json : 모델 훈련

profile을 바탕으로 도식화한 프로젝트 work-flow

/notebooks

DataEDA, 실험 및 prototype에 사용되는 노트북 파일

 

/query(src) : task파일과 동일한 이름의 naming

task 파일에서 사용되는 쿼리 또는 기타 함수

(현 개발환경인 AWS SageMaker에서 Data 접근이 S3, Athena를 통해 가능하므로 Data 전처리 대부분을 Query로 수행하고 있습니다.)

 

/tasks

query(src) 소스를 바탕으로 실행되는 task 정의

 

main.py

profiles 안에 작업 명세서를 바탕으로 프로젝트 실행

#메인
python3 main.py -p task_profile.json

#훈련
python3 main.py -p train_profile.json

 

현재 운영되는 다른 개인화 프로젝트들의 구조 또한 위와 같게 구성되어 있습니다.

 

프로젝트 구조화는 팀 내부적으로 업무 공유 및 F/U 그리고 신규 프로젝트 시 생산성 향상과 외부적으로는 소스와 프로세스 순서 변경에 따른 운영/배포 부서와 원활한 커뮤니케이션에 도움이 될 것으로 기대합니다.

 

긴 글 읽어주셔서 감사합니다.

 

* Data-Biz팀 권혁민, 이상현님과 Data와 AI/ML기술을 통해 고객들의 앱 경험 만족도와 행 내 생산성/효율성을 높이기 위해 노력하고 있습니다.

 

[1] https://data-newbie.tistory.com/614

[2] https://towardsdatascience.com/structuring-machine-learning-projects-be473775a1b6

[3] https://github.com/victoresque/pytorch-template

 

 

케이뱅크와 함께 하고 싶다면 🚀