튼튼한 나무

Kubernetes(k8s) 개념 설명 feat. ML 모델 서빙 본문

computing

Kubernetes(k8s) 개념 설명 feat. ML 모델 서빙

공유지식 2023. 8. 16. 11:57

최근 몇 년전부터 쿠버네티스에 대해 관심이 높아지고 있고, 여러 테크 기업에서 시스템을 쿠버네티스 기반으로 전환했다는 내용이 종종 들리고 있어 개념을 정리해보고자 한다.

 

Kubernetes

용어 정리 :

  • 컨테이너 : 앱이 구동되는 환경까지 포함하여, 실행할 수 있도록 하는 격리(독립) 기술
  • 컨테이너 런타임 : 컨테이너를 다루는 도구
  • 도커 : 컨테이너를 다루는 도구 중 가장 유명 한 것
  • 쿠버네티스 : 컨테이너 런타임을 통해 컨테이너를 오케스트레이션 하는 도구
  • 오케스트레이션 : 여러 서버에 걸친 컨테이너 및 사용하는 환경 설정을 관리하는 행위

 

PC 환경에서 예를 들어보자면, 만약 어떤 PC에서 특정 프로그램을 설치하고 실행하고자 한다.

해당 프로그램의 정상 설치 및 실행을 위해선, 특정 경로에 설치를 해야 하거나 환경 변수 설정 등 여러 옵션을 일일이 설정 해주어야 한다.

그러나 컨테이너는 이러한 환경까지 모두 포함하여 독립적으로 프로그램이 실행될 수 있도록 도와주는 기술이다. 따라서, 컨테이너 환경을 묶어서 배포한 컨테이너 이미지라는 프로그램을 내려받아 구동하면, 그 컨테이너 환경에서 실행되기 때문에 각종 설정 과정이 줄어 들어 편하게 사용할 수 있다.

그렇다면, 이 컨테이너를 사용을 위해 필요한 도구가 있을 것인데, 그 것이 컨테이너 런타임이다.

컨테이너를 쉽게 내려받고, 공유하고, 구동할 수 있도록 해주는 도구이다. 종류도 여러가지가 있으나, 가장 유명한 것이 바로 도커이다. 도커가 사용하는 컨테이너 규격은 표준화가 있어서 도커가 아닌 다른 컨테이너 런타임들도 도커로 만든 컨테이너를 사용할 수 있다.

이제 여기서, 이 컨테이너 런타임을 통해 컨테이너를 다루는 도구가 쿠버네티스(k8s)이다.

쿠버네티스는 여러 서버(노드)에 컨테이너를 분산해서 배치하거나, 문제가 생긴 컨테이너를 교체하거나, 컨테이너가 사용할 환경 설정을 관리하는 일 등을 수행할 수 있다. 이것을 컨테이너 오케스트레이션이라고 한다.

즉, 쿠버네티스의 역할은 컨테이너 분산 배치, 상태 관리, 컨테이너의 구동 환경 관리 등을 해주는 도구이며, 도커는 컨테이너를 다루는 도구(컨테이너 런타임) 중 하나이므로, 쿠버네티스는 컨테이너를 다루기 위해 도커 이외의 다양한 컨테이너 런타임 소프트웨어를 사용할 수 있다.

쉽게 이해하자면, 한 개의 컨테이너를 구동 시킬 때는 도커를 이용하고 다수의 컨테이너를 구동하여 환경 관리 및 조율 할 때는 쿠버네티스를 이용할 수 있다.

 

App 배포 환경의 변천사

 

Traditional Deployment : 오래전부터 쓰이던 방식으로, 물리적인 pc 한 대에 하나의 OS를 설치 하고, 여러 프로그램을 설치하는 방식

쉽게 이해하자면, PC에 OS를 하나 설치하고 여러 software를 설치하여 사용하는 방식이다. 그런데, 하나의 OS에서 작동하다 보니, 금융 보안 프로그램을 설치했더니 다른 프로그램의 성능이 떨어지거나 오류가 발생 하는 것처럼 다른 프로그램의 동작을 간섭하거나 성능을 떨어뜨리는 등의 단점이 있다 (이러한 이유로 인해 개발에서 Mac OS가 주목 받는 이유 중 하나라고 생각된다). 그렇다면, 다른 pc를 구입하여 금융 전용으로 사용하면 되지 않을까? 당연하게 너무나 비효율적이며 비용이 많이 든다.

Virtualized Deployment : 위 문제를 해결하기 위해 가상화 배포 방식을 사용할 수 있다. VM(가상화 머신)을 사용해 배포하는 것이다. 이를 위해, 하나의 시스템 상에서 가상화 머신을 여러 개 구동할 수 있도록 해주는 hyper-visor가 존재하고 각 App를 실행하는데 필요한 환경과 관련된 파일인 Bin 파일 및 Library가 존재한다.

하나의 pc 안에 여러 가상화 머신으로 동작하기 때문에 서로 간섭을 일으키지 않게 되며, 가상 머신의 물리적인 스펙을 조절할 수 있다. 또한, 다중화와 분산 처리가 중요한 시스템이라면 필요에 따라 가상머신 개수를 늘리고 줄이는 등 다양하게 처리할 수 있다.

그러나, 가상머신은 그 자체로 완전한 pc이므로 일일이 os를 설치해야 해서 컨테이너 중심의 배포보다는 무겁다.

Container Deployment : 컨테이너 중심의 배포는 가상화 기반의 배포와 비교하면 hyper-visor는 container runtime으로 대체되었고 가상머신은 VM으로 대체되었다. 또한, 구동을 위해 OS가 필요한 것이 큰 특징이다. 즉, 하나의 OS만 사용한다.

간단하게 설명하자면, Container Deployment는 게임과 금융 보안 프로그램이 하나의 os 상에서 구동된다. 여기서, 각 프로그램은 서로의 간섭을 일으킬 수 없도록 하는 하나의 벽을 만든다. 그래서, CPU, 메모리 등의 물리적인 자원을 독립적으로 사용할 수 있도록 할당하고 관리한다. 이를 OS 커널을 공유하는 가상화라고 부른다.

다시 말해, 리눅스에서 내가 실행한 프로그램이 독립된 환경에서 실행되는 것처럼 격리 시켜주고, 물리적인 자원도 실행한 프로그램이 독립적으로 사용할 수 있도록 해주는 namespace 및 cgroup과 같은 기술이 있다.

 

 

MLOps and Model serving

 

MLops는 Machine Learning + DevOps의 합성어이다. 프로세스와 기술을 통합하여 프로덕션 환경에서 ML 시스템을 배포하고 관리하는데 큰 도움을 준다. 이러한 ML workflow를 자동화 해주는 A.I 플랫폼의 종류가 수없이 많이 들어봤을 Amazon의 SageMaker, Google의 Kubeflow, MLflow 등이 있다.

일단 먼저, 쿠버플로우는 기본적으로 쿠버네티스를 기반으로 동작하는 컨테이너 오케스트레이터인데, 이는 그 어렵다는 쿠버네티스를 잘 이해해야 한다. 다시 말해, 데이터 사이언티스트가 쿠버네티스 API를 직접 사용하기에 쿠버네티스는 너무 high low-level 시스템으로 개발되어 있고 굉장히 복잡한API 구조를 가지고 있다. 또한, 위 그림처럼 Kubernetes Cluster 내에서 작동한다.

그러나, MLflow는 모델에 대한 실험 혹은 버전을 트래킹함으로써 구동되는 파이썬 프로그램으로, 실제 실행은 내가 지정한 환경(로컬 혹은 특정 서버)에서 실행된다.

kubeflow는 기본적으로 쿠버네티스에 대한 깊은 이해가 필요하여, mlflow를 더욱 선호하는 경향이 많으나 kubeflow는 어려운 만큼 높은 생산성과 확장성을 가져 최근 여러 테크 기업에서 많이 사용되고 있다.

본 포스팅에서는 Kubeflow에 대해 간단히 알아보고자 한다.

 

Kubeflow란?

쿠버플로우는 End-to-End AI 플랫폼이며, 머신러닝 워크플로우의 모델 학습부터 배포 단계까지 모든 작업에 필요한 도구와 환경을 쿠버네티스 위에서 쿠버플로우 컴포넌트로 제공한다.

쿠버플로우는 jupyter, tensorflow, pytorch, MXNet 등의 ML tools로 부터 출발하며,

그 후의 Kubernetes 위에서 작동하는 Central Dashboard, Training Operators, Katib, Pipelines와 KServe가 존재한다.

간단히 소개하자면,

쿠버네티스 위에서 동작하도록 하는 Notebooks를 생성할 수 있고,

tensorflow, pytorch, MXNet 등 다양한 딥러닝 프레임워크에 대해 쿠버네티스 상에서 모델 분산 학습을 지원하는 Training Operations를 사용할 수 있으며,

Katib를 사용하여 AutoML 기능인 Hyper-params tuning, Neural Architectures Search (NAS) 등을 사용할 수 있다.

KServer는 쿠버네티스에 ML 모델을 배포하고 추론 기능을 제공한다.

Comments