*Kubeflow Pipelines
- Kubernetes에서 동작하는 Docker 컨테이너 기반 머신러닝 워크플로우 플랫폼
- 구글에서 오픈소스로 만들고 있음
*파이프라인 만들기
- 추천 시스템 워크플로우를 Kubeflow Pipelines에서 동작하도록 파이프라인을 만들어야 함
- 기존 추천 시스템 작업들을 컨테이너 기반으로 작성
- 작성된 파이프라인을 Kubeflow Pipelines에 업로드
- Create run 버튼으로 바로 실행 가능
*Scheduling
- 추천 시스템 파이프라인에서 꼭 필요한 부분
- 파이프라인을 지속적으로 업데이트하기 위해서 cron 작업 같이 주기적으로 자동 실행을 해야 함
- Kubeflow Pipelines에서 제공하는 Recurring runs 기능으로 간편히 설정 가능
*Pipelines API
- 추천 시스템 파이프라인 패키지 파일을 만든 후 Pipelines 웹화면에서 설정하는 단계
- 1. 패키지 파일 업로드
- 2. Experiment 만들기
- 3. 새로운 파이프라인으로 반복 실행 설정
- 4. 기존 반복 실행 중지/삭제
- 5. 기존 파이프라인 삭제
- 추천 시스템을 개선해나가면서 파이프라인이 변견될 때마다 웹에서 설정해야 하는 단계를 거치는게 매우 번거로움
- Pipelines API의 배포 설정의 모든 단계를 처리하는 스크립트로 만들어서 파이프라인을 변경하면 스크립트를 실행하여 손쉽게 파이프라인 배포 가능
*머신러닝 파이프라인
- 1. 데이터 수집
- 2. 전처리
- 3. 학습
- 4. 유사 검색 학습 / 모델 저장소 복사
- 5. 배포
*데이터 수집
- 당근마켓 안드로이드/iOS 클라이언트에서 firebase를 통해 기록된 이벤트 로그는 BigQuery에 저장됨
- 추천 시스템에서 필요한 사용자가 본 글에 대한 로그는 클라이언트에서 이벤트가 발생하도록 구현하고, BigQuery에서 필요한 데이터를 수집할 수 있음
- 최종 수집된 데이터 테이블은 BigQuery에서 제공하는 csv 추출 기능으로 Cloud Storage로 저장함
- 문제는 BigQuery 테이블이 매우 크다는 점
- 모든 이벤트 로그의 많은 정보가 한 테이블에 기록되기 때문에 스캔해야 하는 테이블 용량이 커서, 자주 요청한다면 시간과 비용이 높아짐 (날짜 단위로 파티션되지만 일간 방문자수가 많아져서 고려해야 함)
- 하루에 여러 번 반복적으로 모든 데이터가 아닌 필요한 데이터만 조회하기 위해 중간 단계의 테이블을 수집하도록 함
- 외부 cron 작업으로, 새로운 필요한 데이터만 지속적으로 수집하여 업데이트
- 필요한 데이터로 축소된 테이블을 통해 수집하여 시간/비용 문제를 해결
*전처리
- 글/지역 ID 사전 구축
- x개 이하 존재하는 데이터 제외
- ID를 index 번호로 변환
- 빠르게 읽기 위한 tfrecords 형식으로 저장
- Tensorflow Transform 사용 (배포 시스템에서 많은 이점을 얻을 수 있음)
- 사전과 함께 전처리 작업을 최종 배포 모델에 포함
- 전처리 과정을 tensorflow 모델에 추가
- 사전 파일 자동 구축
- Cloud Dataflow 환경에서 병렬로 실행하여 시간 단축
- 쉽게 사용할 수 있는 전처리 함수 제공
*학습
- 실제 서비스에 안정적으로 학습되기 위해서 클라우드 환경인 Cloud ML Engine을 사용
- 기존 다른 프로젝트의 모델도 Tensorflow Estimator API 를 작성하여 CMLE 환경에서 분산 학습을 보다 쉽게 사용
- 학습된 모델은 Cloud Storage에 저장, 추가 작업으로 모델에서 학습된 글 embeddings 값을 추출함
- 추출된 데이터는 binary 파일로 Cloud Storage에 저장하고, 이후 유사 벡터 인덱스의 학습과 서빙에서 사용함
*Pipeline Metrics
- evaluation 값은 Kubeflow Pipelines의 형식에 맞게 파일로 저장
- prediction도 markdown, html 형식 등의 파일로 저장하면 Kubeflow 웹 화면에서 쉽게 확인 가능
*Output Viewer
- Kubeflow Pipelines 의 Output Viewer 기능으로 Tensorboard를 아주 쉽게 실행 가능
*유사 검색 학습
- 빠르게 후보를 뽑기 위해서 실제 예측에는 벡터 인덱스를 사용
- faiss 라이브러리 사용
- faiss index 에 데이터가 많아지면 검색속도가 느려지고 메모리 사용량이 늘어남 (faiss index 학습을 통해 해결)
*모델 저장소 복사
- 학습한 Tensorflow 모델은 Google Cloud Storage에 저장되는데, 추천 서버는 AWS에 배포되어 있어 AWS S3 저장소로 복사 (이 작업은 유사 검색 학습과 의존성이 없어서 동시에 실행)
*배포
- AWS ECS에 배포되어 있는 경우, aws cli 명령으로 ECS 서비스를 재시작 요청하여 새롭게 학습된 모델 데이터를 추천 서버에 적용함
*서빙
- Cloud Dataflow, ML Engine을 활용하기 위해 머신러닝 워크플로우는 Google Cloud 에서 실행되지만, 당근마켓 서버는 AWS seoul region에서 운영되고 있음
- 서버 간 직접적인 빠른 통신을 위해 머신러닝 관련 서버는 당근마켓 서버와 동일한 AWS에서 동작하도록 함
- 당근마켓 서버 → input data → Tensorflow Serving →user vector → 당근마켓 서버 → user vector → Faiss Server → top200 → 당근마켓 서버 (총 응답 시간 0.01초 이하)
- CPU만으로 충분해서 GPU 미사용
- 접속량이 늘어도 자동으로 확장되는 Auto Scaling 기능을 적용
- 워크플로우 작업과 마찬가지로 머신러닝 관련 서버도 컨테이너 기반을 개발하여 AWS ECS에 배포하고 Auto Scaling 기능을 적용하여 운용하기 간편함
*당근마켓 서버
- 접속하는 사용자마다 즉시 개인화된 추천 요청을 하기 위해 필요한 사용자 정보를 (최근 본 글 50개) 빠르게 읽어야 함
- 이 정보는 BigQuery에 저장되어 있지만 빠르게 읽을 수 없고, 기본 저장소인 RDBMS에서는 부담이 될 수 있음
- Redis 메모리 저장소를 활용하여 사용자 정보를 빠르게 읽을 수 있도록 구현
*Tensorflow Serving
- 추천 시스템 tensorflow 모델을 tensorflow-serving Docker 이미지를 사용하여 컨테이너 기반 서버를 실행
- tensorflow serving은 tensorflow에서 공식 제공하는 docker 이미지로 production 서빙하기에 가장 쉽고 빠른 방법
*Faiss Server
- faiss 라이브러리로 faiss index 기능을 서비스하는 gRPC pytho 서버
- 서버 실행 시 학습된 faiss index 데이터 파일을 로드하고 vector 값으로 검색 요청을 받으면 가장 유사한 벡터의 상위 ID 목록을 응답하도록 구현
'스타트업 > AI' 카테고리의 다른 글
[AI] Faiss (0) | 2020.08.14 |
---|---|
[AI] redis (0) | 2020.08.14 |
[AI] 카테고리 추천 모델(당근마켓) (0) | 2020.08.13 |
[AI] 워드 임베딩(Word Embedding) (0) | 2020.08.07 |
[AI] mecab (0) | 2020.08.07 |