Kubeflow 파이프라인 운용하기

Yoo Gyoungyoon
당근 테크 블로그
8 min readApr 16, 2020

작년에 쓰여진 딥러닝 추천 시스템 in production 에서 소개한 당근마켓 딥러닝 추천시스템의 파이프라인과 서빙 시스템이 구축 후 1년 동안 운용하며 어떻게 관리되고 변경되었는지 간단히 소개하려고 합니다.

1. Pipeline

당근마켓은 여전히 Kubeflow Pipelines을 사용하고 있어요. 가끔 발생하는 이슈들로 어려움도 있었지만, 현재까지 아주 만족스럽게 사용하고 있어요. 신규 개발된 머신러닝 시스템은 모두 Kubeflow에서 동작하고 있고, 기존에 머신러닝 시스템들도 관리의 편의성을 위해 Kubeflow로 이전하고 있습니다.

머신러닝 시스템 파이프라인화 작업에 필요한 요소를 공통 모듈로 코드화 하여, 신규 시스템의 파이프라인 구성도 비교적 쉽게 작업 할 수 있습니다.

현재 당근마켓 Kubeflow는 Google Kubernetes Engine(GKE)와 저희가 직접 운용하는 GPU 워크스테이션 Kubernetes Cluster에 배포되어 있어요.

Google Kubernetes Engine(GKE)

Kubeflow는 AWS, Azure, GCP 등 여러 클라우드 서비스에 배포하여 사용 할 수 있지만, GCP의 경우 웹을 통해 간편하게 Kubeflow를 설치 할 수 있고, Google BigQuery, Dataflow, AI Platform 등의 서비스를 편리하게 사용하기 위해 GKE에 Kubeflow Pipelines를 설치하여 프로덕션으로 운용하고 있어요.

Kubeflow Pipelines 단독 설치

현재 당근마켓에서는 GKE에 Kubeflow 전체가 아닌 Kubeflow Pipelines만 단독으로 설치해서 운용하고 있어요. Kubeflow는 여러 어플리케이션의 모음이에요 (Kubeflow application matrix 확인하기). 1년동안 Kubeflow를 운용해보니 Pipelines 외 다른 어플리케이션은 클라우드에서 사용하지 않게 되더라고요. 사용하지 않는 서비스는 컴퓨터 자원을 낭비 하기도 하고 클러스터 관리에 방해가 되기 때문에 Pipelines를 단독 설치하게 되었습니다. 최근에는 GCP에 AI Platform Pipielines라는 관리형 파이프라인 서비스(베타)를 통해서 매우 편리하게 Kubeflow Pipielines를 단독 설치해서 사용할 수 있게 되었어요. Kubeflow의 주된 사용 목적이 파이프라인이라면 단독설치를 추천 드립니다 !

https://cdn-images-1.medium.com/max/1600/1*L9L5gLcHmjylt86UAMCnIA.png

노드 자동 확장

머신러닝 시스템은 파이프라인의 각 단계(전처리/훈련/서빙), 데이터셋의 양, 딥러닝 라이브러리 종류에 따라서 다양한 컴퓨팅 자원이 필요해요. 전처리 단계의 고성능 컴퓨팅 자원, 훈련 단계에서 필요한 GPU 자원은 필요할 때 자동 확장하여 사용하고, 사용이 완료되면 자동 삭제하도록 해야 비용 효율적이에요. 이를 위해 파이프라인이 설치된 GKE에 다양한 머신 유형의 노드풀을 미리 만들고, 파이프라인의 각 단계에 Node SelectorNode Taint를 지정하여 각 단계에 맞는 최적의 노드풀에서 필요한 노드를 자동 확장하여 사용하고 있어요. 자동 생성된 노드는 사용이 완료되면 자동 삭제됩니다. 추가로 일부 실패가 허용되는 파이프라인의 경우는 비용 효율적으로 Preemtible 노드풀도 사용하고 있습니다.

https://cdn-images-1.medium.com/max/1600/1*0TM3_nxd5Id-cDzqX6BnVA.png

Kubeflow On-premise

딥러닝 추천 시스템에 Kubeflow를 도입하고, 팀내에서 프로덕션과 실험 환경이 동일하면 좋겠다는 의견이 있었어요. 실험 환경에서 파이프라인을 충분히 테스트하고 프로덕션에 배포 할 수 있고, 프로덕션에서 동작중인 파이프라인을 그대로 실험 환경으로 가져와 신규 데이터와 모델을 테스트하기 위해서 입니다. 이를 위해 사내 GPU 워크스테이션 2대에 Kubernetes 클러스터를 구축하고 Kubeflow를 설치하여 현재 운용하고 있어요.

클라우드 환경이 아닌 온프레미스(On-premise)에서 Kubeflow를 운용하기 위해서는 클라우드와 다른 설정과 노하우가 필요하지만 동일한 파이프라인을 프로덕션과 실험 환경에서 사용할 수 있어 머신러닝 팀의 개발 및 실험 생산성이 많이 향상 되었어요. 또한, 클라우드 파이프라인에 장애가 발생하면, 온프레미스 파이프라인을 임시로 프로덕션에 사용해요. 일종의 백업 시스템 역할도 하고 있어요.

Pipeline Management

Kubeflow는 프로덕션에서 충분히 사용 가능한 시스템이지만 아직 활발히 개발되고 있기 때문에 예상치 못한 버그가 발생하기도 해요. 문제를 잘 해결하면 다행이지만 원인을 찾지 못하면 새로운 Kubeflow로 파이프라인을 이전 해야해요. 당근마켓에서는 운용중인 파이프라인을 안전하게 유지하고 빠르게 이전하기 위해 운용중인 파이프라인과 인프라 설정을 최대한 코드화하여 관리하고 있어요. 추적하기 힘든 클러스터 에러가 발생하거나 새로운 기능이 출시되어 Kubeflow 업그레이드가 필요하면, 새로운 Kubeflow 클러스터를 구성하고 파이프라인을 빠르고 안전하게 새로운 클러스터에 배포 하고 있습니다.

2. Hyper-Parameter Tuning

당근마켓은 카티브(Katib)를 사용하여 하이퍼파라미터 튜닝을 하고 있어요. 카티브는 Kubeflow에 포함된 하이퍼파라미터 튜닝 시스템이에요. 카티브는 Tensorflow, Pytorch, XGBoost등 여러 ML 프레임 워크의 하이퍼파라미터 튜닝을 제공하고 stdout, TF-Event 등 에서 훈련 결과를 수집하여 Web UI에 시각화해요. 저희 팀에서는 모델에 대한 기본적인 실험이 끝나면 하이퍼파라미터 튜닝을 통해 더 나은 성능의 파라미터를 찾거나, 성능은 비슷하지만 더 적은 컴퓨터 자원을 사용하는 파라미터를 찾고 있어요. 엔지니어가 지정한 범위에서 파라미터를 변경하며 “자동”으로 실험하기 때문에 엔지니어는 쉬는 동안에도 하이퍼파라메티 튜닝을 동작 시킬 수 있고, 튜닝이 진행되는 동안 다른 업무를 처리할 수 있어 매우 효율적이에요. 가끔은 무수히 탐색한 결과에서 예상 못한 정보를 얻기도 해요. Kubeflow를 사용중이시라면 Katib를 강력 추천드립니다 !

https://cdn-images-1.medium.com/max/1600/0*vrQuwVJkuN2As4q7.png

3. Monitoring

당근마켓에서는 스택드라이버/프로메테우스/그라파나를 사용하여 Kubeflow를 모니터링 하고 있어요.

Stackdriver Kubernetes Engine Monitoring

Kubeflow를 GKE에 배포하면 기본적으로 GCP Monitoring를 통해 클러스터, 노드, 컨테이너 등의 모니터링 정보를 별도의 설정없이 확인할 수 있어요. 모니터링 뿐만 아니라 알림 정책을 만들어두면 슬랙이나 이메일 등으로 알림을 받을 수 있어 편리해요.

Prometheus/Grafana

프로메테우스는 오픈소스 기반의 모니터링 시스템이에요. 쿠버네티스의 여러 성능 메트릭을 수집하여 저장하고 PromQL이라는 쿼리언어를 통해 간편하게 데이터를 조회할 수 있어요. Prometheus의 데이터를 Stackdriver로 전송하여 Stackdriver의 모니터링/알람 기능을 사용할 수도 있어요. (단, Stackdriver에 많은 데이터를 전송하면 많은 과금이 발생할 수 있으니 조심하세요.)

그라파나는 프로메테우스의 데이터를 시각화 할 수있는 데시보드에요. 다양한 유형의 차트를 제공하고 PromQL을 통해 데이터를 가공하여 간단하게 데시보드로 구성 할 수 있어요. 다른 유저들이 만들어 공개한 데시보드 템플릿을 다운받아 사용할 수 있어 편리해요.

Kubeflow 패키지 전체를 설치했다면 istio모니터링을 위해 Prometheus와 Grafana가 같이 설치 되요. 이미 설치된 모니터링 시스템이니 사용해보시 길 추천 드립니다.

https://cdn-images-1.medium.com/max/1600/1*GTIKtMjqnb5OcI03S4b6vg.png

4. Serving

머신러닝 시스템 서빙 인프라는 AWS ECS 에서 동작하고 있어요. Tensorflow Serving과 Faiss Server를 사용하여 빠르게 서빙하고 있어요.

Kubeflow의 서빙 시스템인 KF-Serving을 최근에 새로운 프로젝트 서빙에 적용하여 테스트 중이며 향후 전면 도입을 고려해보고 있어요. KF-Serving은 여러 ML 프레임워크의 서빙 시스템을 추상화하여 사용하기 편리한 인터페이스를 제공하고, 모델 배포시 Canary 롤아웃, 트래픽에 따른 서버 Auto Scaling 등 의 편리한 기능을 제공해요. 다만, 문제가 발생하면 서비스에 큰 영향을 주는 서빙 시스템인 만큼 좀 더 보수적으로 접근할 필요가 있다고 생각해요. 현재(2020.4.13) 시점에서는 Tensorflow Serving grpc 지원이 개발중에 있고, Inference Service Pod을 지정된 노드로 보내는 API가 논의중에 있기 때문에 제 생각에는 아직 더 개발이 필요하다고 생각 되요. KF-Serving은 편리한 기술이기 때문에, 이번에 적용한 KF-Serving을 관리하며 지속적으로 개발 동향을 파악하고 운용 노하우를 축적하여 향후에 확대 적용하고 싶습니다.

5. 마치며

당근마켓 머신러닝 팀은 오픈소스와 클라우드 서비스를 적극 활용하여 머신러닝 서비스를 개발하고 있어요.

  • 딥러닝 모델을 서비스에 적용하고 싶으신 분
  • 클라우드 머신러닝 파이프라인 구축에 관심 많은신 분

저희와 함께 머신러닝 기술을 활용하여 당근마켓을 더 좋은 서비스로 만들고 싶으신 분 연락주세요.

당근마켓 채용 공고

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

--

--