네이버 플레이스 AI개발 부서에서 진행한 프로젝트인 ‘마이플레이스 유저 추천’의 ML Pipeline을 설명합니다.

네이버 마이플레이스 서비스의 유저 추천 영역

과제 요구 사항

매일 전체 ML 파이프라인 수행

‘플레이스 유저 추천’ 과제는 ‘데이터 수집 > 데이터 정제 > 모델 학습 > 모델 배포 > 앱 배포 > 분석 > 서비스 반영’ 까지 전반적인 머신러닝 프로세스를 매일 수행해야 했습니다. 이러한 요구 사항으로 빠른 처리와 자동화가 시스템 구축에 중요한 요소였습니다.

대규모 데이터 처리

대외비 내용이 포함되어 있어, 상세한 수준으로 공개가 불가능한 점 양해 부탁드립니다.

과제에서 처리하는 데이터 규모는 억개 단위, 테라 단위 사이즈 이상의 데이터를 처리하고 있습니다.

플레이스 AI 개발의 시스템 구성도

위 시스템 구성도를 활용하여 파이프라인 구간 별로 설명 드리겠습니다.

과제 ML PIPELINE — 전체

사용자 추천 과제의 파이프라인 입니다. 파이프라인은 크게 데이터 수집, 모델 생성, 서빙으로 나눌 수 있습니다.

과제 ML PIPELINE — 0. 데이터 수집 (feature store)

  • datasource: 원본 데이터 수집
  • datamart: 프로젝트 공통 ML 분석용 데이터

원본 데이터 수집은 원본 데이터인 datasource와 분석에 맞게 정제된 데이터인 datamart로 세분화 됩니다. 이 구간은 여러 프로젝트에서 공통으로 사용할 목적으로 데이터를 수집하고 분석 환경에 맞도록 데이터를 준비하는 구간입니다. offline store인 hdfs에는 하루에 한 번 배치 작업으로 데이터를 적재하고 있습니다.

datamart의 목적

1. 정형화

  • 원천 서비스 DB가 schema-less (mongodb)인 경우가 있음
  • datasource 구간은 schema-on-read 정책으로 ELT(Extract-Load-Transform) 정책
  • datamart에서는 schema를 확정하여 이후 분석 과정에서는 schema-aware한 작업을 수행

2. 정제 (cleansing)

  • 대상: 값 타입 혼용, 결측값, 이상값 등…

3. 파일 포맷 변환

  • 빠르게 처리 될 수 있도록 데이터 포맷 변경 (예: jsonline > parquet)

과제 ML PIPELINE — 1. Feature Engineering

모델 학습을 위해 유저별 취향 목록과 장소 정보를 추출했습니다. 취향 목록은 리뷰와 좋아요 데이터를 활용했습니다.

과제 ML PIPELINE — 2. Model Training

학습 수행

유저추천 모델은 하루마다 처음부터 학습을 합니다. GPU 리소스를 할당받고, 학습데이터를 로드하여 학습 코드를 수행합니다. GPU 자원은 NVIDIA V100 3장을 할당받아 처리하고 있습니다.

결과 파일

모델 학습 결과 데이터를 파일로 저장해서 서빙 환경에서 참조할 수 있도록 제공합니다. 아래는 3가지 결과 파일 입니다.

Model Package 파일 (Model Backend에서 참조)

  • 모델 서빙 플랫폼(torchserve)에서 활용하는 모델 패키지 파일입니다.
  • 학습 결과인 모델 파라미터가 있습니다.
  • model backend에서 모델을 서빙할 때 필요한 파일을 패키지로 묶은 파일입니다.

User Embedding Index 파일 (App 에서 참조)

  • 이 과제에서는 유저간의 유사도 계산이 필요합니다. 사용자간 유사도를 계산할 목적으로 미리 유저별 임베딩 값을 인덱싱 해둔 faiss index 파일입니다.

ID Dictionary 파일 (App 에서 참조)

  • model ID ↔ service ID: model id와 서비스 id를 변환하는 사전 데이터 파일입니다.
  • 모델링 과정에서 부여한 id 값과 서비스 id값이 다르고, 학습과 서빙 환경에서 동일한 매핑값이 필요합니다.
  • 이 과제에서는 user ID, place ID, place region code ID, place category ID 를 변환하는 정보를 담고 있습니다.

과제 ML PIPELINE — 3. Model Backend / App Serving

Model Backend

  • GPU-intensive 한 처리만
  • HTTP API 제공
  • tensor input > tensor output
  • torchserve 프레임워크 활용

Model Gateway

  • CPU-intensive
  • HTTP API 제공
  • 데이터 포맷 전처리/후처리
  • model prediction cache store (same input > same output)
  • network entrypoint (사내 gpu 배포 환경 파편화 대응, 버전 관리)
  • app간 model backend 공유 (같은 model을 여러 app에서 사용)
  • 모델 통합 API 제공 + 문서 (swagger)

App

  • 비지니스 로직 처리
  • API는 HTTP API이나 Pub/Sub API (kafka producing / consuming 활용) 형태로 제공

blue-green 배포

airflow를 활용하여 model backend와 app을 blue-green 배포하고 있습니다. model-gateway은 주로 새로운 model의 endpoint를 추가하는 시점에만 업데이트 합니다.

blue-green 배포 순서: 신규 모델 배포 > 신규 앱 배포 > LoadBalancer 업데이트 > 이전 앱 제거 > 이전 모델 제거

과제 ML PIPELINE — 4. 분석 요청 및 결과 전달

전체 유저에 대한 배치 요청

모든 사용자에 대해서 취향 목록을 만들고 app serving에 분석을 요청하여 모든 유저에 대해 유저 간 유사도를 구합니다.

외부 서비스에 반영 및 결과 저장

사용자 추천 과제의 경우 app serving은 http API를 제공합니다. 분석을 요청하고 결과를 외부 서비스(네이버 마이플레이스)로 전달하고 있습니다. 추가로 결과를 시스템 내부 offline store인 hdfs에 저장하고 있습니다. 저장된 결과 데이터는 apache zeppelin을 활용하여 결과를 협업하는 기획자나 개발자가 조회할 수 있도록 제공하고 있습니다.

Dataflow Overview

전체 데이터 흐름은 이와 같습니다. 처음에 유저와 장소 데이터를 추출해서, 모델을 학습하고, 학습 결과를 모델과 앱 서빙 환경으로 전달합니다. 다음 전체 사용자에 대해서 분석을 요청하고 응답값을 외부로 전달합니다.

전체 ML Pipeline 소요시간

각 구간을 독립적으로 개발하고, airflow를 통해 자동화 했습니다. 전체 파이프라인 소요시간은 15시간 45분입니다. 모델 학습은 12~13시간정도 소요되도록 GPU 리소스를 할당하고 있습니다. (현재: NVIDIA V100 3장)

과제 개발 기여자

(가나다 순)

  • 박미주 / 네이버 플레이스 리뷰 기획자
  • 유원홍 / 네이버 플레이스 AI 개발자
  • 윤동빈 / 네이버 플레이스 AI 개발자
  • 이융성 / 네이버 플레이스 리뷰 기획자
  • 주윤상 / 네이버 플레이스 AI 개발자

채용 공지

NAVER 플레이스 AI 개발에서는 같이 일할 동료 개발자를 찾고 있습니다.

https://www.naver-monthlyopening.com/#category-glace-ai-1

--

--