본문 바로가기

Data Science

[개인 프로젝트] MLOps (Machine Learning Operations)에 부딪혀보자

해당 게시글은 4주간의 개인프로젝트 기간동안 시도해보고 정리한 요약글 입니다.

최대한 자세한 내용을 얻었던 출처를 링크로 첨부하였으나,
이해가 안된다면 대화형 튜토리얼를 해보시는걸 권장드립니다.

 

📌 MLOps (Machine Learning Operations)란?

- 머신러닝(ML) 시스템을 위한 지속적 통합(CI), 지속적 배포(CD), 지속적 학습(CT)을 구현하고 자동화하는 기술이다.

-ML Service 화하기 위한 기술로써 기존 ML 프로젝트 진행 방식의 한계를 보완한 방법이다.

자세한 설명 : google

📍 ML + DevOps = MLOps

최신트랜드로 급부상했지만 아직은 생소한 분야로 아직 기본이라고 할만한 거는 없음

📎  기존 ML 프로젝트 진행 방식의 한계 : 

ML 시스템의 요소


- 모델의 서비스 적용의 어려움
- 모델 성능 추적의 어려움
- 모델과 데이터 관리의 어려움
- 협업의 어려움

더보기

+) Hidden Technical Debt in Machine Learning Systems 논문
 Machine Learning: The high-interest credit card of technical debt 논문에 따르면 현실속 ML서비스화에대한 어려움이 논리적으로 적혀있다.

📎 처음 제안된 방법은 DevOps였다

DevOps란?
- 자세한 설명 : https://aws.amazon.com/ko/devops/what-is-devops/

📍MLOps 의 구성요소

큰 관점에서 MLOps 구성요소 나누워 보자면데이터(관리 및 확보) , 모델(학습 및 모니터링), 서비스(배포) 로 이루워져 있다.

  • 데이터 : 데이터 수집 파이프라인(Spark Streaming, Airflow...) > 데이터 저장(MySQL...) > 데이터 관리(TFDV, DVC....)
  • 모델 : 모델 개발(Docker, Kubeflow...)> 모델 버전관리(Git, MLflow, Github Action..)> 모델 학습 스케줄링 관리(Grafana, Kubernetes)
더보기

Data science steps for ML

  1. Data Extraction(데이터 추출)
    데이터 소스에서 관련 데이터 추출
  2. Data Analysis(데이터 분석)
    데이터의 이해를 위한 탐사적 데이터 분석(EDA) 수행
    모델에 필요한 데이터 스키마 및 특성 이해
  3. Data Preparation(데이터 준비)
    데이터의 학습, 검증, 테스트 세트 분할
  4. Model Training(모델 학습)
    다양한 알고리즘 구현, 하이퍼 파라미터 조정 및 적용
    output은 학습된 모델.
  5. Model Evaluation(모델 평가)
    holdout test set에서 모델을 평가
    output은 모델의 성과 평가 metric.
  6. Model Validation(모델 검증)
    기준치 이상의 모델 성능이 검증되고, 배포에 적합한 수준인지 검증
  7. Model Serving(모델 서빙)
    - 온라인 예측을 제공하기 위해 REST API가 포함된 마이크로 서비스
    - 배치 예측 시스템
    - 모바일 서비스의 embedded 모델
  8. Model Monitoring(모델 모니터링)
    모델의 예측 성능을 모니터링

 

 

 


 

 

 

📌쿠버네티스(Kubernetes)란?

- MLOps의 기본 전제인 Reproducibility(실행 환경의 일관성 & 독립성),Job Scheduling(스케줄 관리, 병렬 작업 관리, 유휴 자원 관리),Auto-healing &Auto-scaling(장애 대응, 트래픽 대응) 을 확보하기 위하여 선택

- 도커 vs 쿠버네티스  : 도커는 '기술적인 개념이자 도구'/ 쿠버네티스는 '도커를 관리하는 툴'
자세한 설명 : https://www.redhat.com/ko/topics/containers/what-is-kubernetes

 

📍쿠버네티스(Kubernetes) 사용을 위한 준비(가상환경, 도커,YAML,minikube)

쿠버네티스에 대한 공부를 위한 간단한 작업이 목적으로 요금을 내야하는 Kubernetes가 아닌 minikube를 선택
자세한 설명 :
https://subicura.com/k8s/prepare/yaml.html
https://kubernetes.io/ko/docs/reference/kubectl/overview/

🖥 가상머신(VM)을 통하여 나만의 작은 PC를 제작

자세한 설명 : https://dreamdeveloper403.tistory.com/27

더보기

- 도커설치 사용 방법이 window와 MAC에 차이가 있음을 뒤통수로 머리가 깨지고 알았다.(아나콘다로 진행하다가 날라갔다.) 

1.  VirtualBox를 설치한 후 Ubuntu를 실행

- 새로만들기 생성시 설정값 주의

역시, 바로 에러가 나오지...ㅠㅠ...

해결방법 : https://medium.com/@Aenon/mac-virtualbox-kernel-driver-error-df39e7e10cd8

 

 

mac 업데이트후 실행시 검은화면외엔 보이지 않게됨, 추후 해결방안 업데이트 할 예정

🖥 Docker 기본 사용

더보기
sudo apt-get update
  • docker의 prerequisite package 설치
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
  • Docker GPG key 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o
 /usr/share/keyrings/docker-archive-keyring.gpg

 🍀 정상적으로 설치 및 작동이 되는지 확인

docker -v
mac에 설치된 docker version
docker run hello-world

⌨️ Docker 기본 명령어

버전 확인  $ docker -v
이미지 다운로드  $ docker pull [이미지 명]
다운로드된 이미지 목록  $ docker images
컨테이너 생성  $ docker create [옵션] [이미지 명]
컨테이너 생성 및 실행  $ docker run [옵션] [이미지 명]
컨테이너 실행  $ docker start [컨테이너 명]
컨테이너 재실행  $ docker restart [컨테이너 명]
컨테이너 접속  $ docker attach [컨테이너 명]
컨테이너 정지  $ docker stop [컨테이너 명]
실행중인 컨테이너 목록  $ docker ps
정지된 컨테이너 목록  $ docker ps -a
컨테이너 명 변경  $ docker rename [기존 컨테이너 명] [새로운 컨테이너 명]
컨테이너 삭제  $ docker rm [컨테이너 명]

⌨️ Docker 기본 개념


자세한 설명 : https://cultivo-hy.github.io/docker/image/usage/2019/03/14/Docker%EC%A0%95%EB%A6%AC/

🖥 YAML이란?

- 데이터 직렬화에 쓰이는 포맷/양식중 하나로서, 쿠버네티스 마스터에게 요청을 보낼 때 사용한다.

자세한 설명 : https://subicura.com/k8s/prepare/yaml.html

🖥 minikube 설치

- minikube https://minikube.sigs.k8s.io/docs/start/
- kubectl https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-linux/
자세한 설명 : https://minwook-shin.github.io/how-to-install-minikube-on-mac/ 
#설치
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

minikube version  # 버전 확인

🖥 Kubectl 설치

kubernetes cluster (server)에 요청을 간편하게 보내기위해 사용하는 client 툴
# v1.22.1 버전으로 다운
curl -LO https://dl.k8s.io/release/v1.22.1/bin/linux/amd64/kubectl
# 최신버전 다운 가능
curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"

⌨️  Kubectl 설정

kubectl 바이너리를 사용할수있도록 권한과 위치를 변경
공식 문서  https://v1-18.docs.kubernetes.io/ko/docs/tasks/tools/install-kubectl/
#정상 작동 확인
kubectl --help

kubectl version # 버전확인

📍Minikube쿠버네티스(Kubernetes) 사용

필요한 docker image를 다운받고 다운로드가 완료되면 구동을 한다.
자세한 설명 : https://minikube.sigs.k8s.io/docs/start/
#기본 시작
minikube start

#minikube를 docker driver 기반으로 시작 
minikube start --driver=docker

#상태 확인
minikube status

## 주로 밑에처럼 떴다.
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

# minikube 내부의 default pod 확인
kubectl get pod -n kube-system

# 정보 확인
kubectl cluster-info

# 일시정지
minikube pause

# 재가동
minikube unpause

# 정지
minikube stop

#삭제
minikube delete

 

 🖥 Pod 이란?

- 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 단위
- pod 단위로 스케줄링, 로드밸런싱, 스케일링등의 관리 작업을 수행
 

⌨️  Pod 관련 기본 명령어

자세한 설명 : https://subicura.com/k8s/guide/pod.html

# 기본설정으로 빠르게 생성하기
kubectl run echo --image ghcr.io/subicura/echo:v1

# Pod 목록 조회(Desired state가 아닌 Current State를 출력)
kubectl get pod

# kube-system namespace의 pod 조회
kubectl get pod -n kube-system

# 모든 namespace의 pod 조회
kubectl get pod -A

# 단일 Pod<pod-name> 조회
kubectl get pod <pod-name>

# 단일 Pod<pod-name> 상세 확인
kubectl describe pod <pod-name>

# 단일 Pod 제거
kubectl delete pod/echo

#pod 목록 자세히
kubectl get pod -o wide

# <pod-name>를 yaml 형식으로 출력
kubectl get pod <pod-name> -o yaml

# kubectl get pod 모니터링 - 결과를 계속 보여주어 변화가 있을 때만 업데이트
kubectl get pod -w
 
 
# 권장하는 pod 생성 방법

# yaml 파일이 없다면 생성
vi pod.yaml​

#밑에 형식 변경하여 설정
apiVersion: v1
kind: Pod
metadata:
  name: echo
  labels:
    app: echo
spec:
  containers:
    - name: app
      image: ghcr.io/subicura/echo:v1
      
      
#kubectl apply -f <yaml-file-path>를 수행하면 <yaml-file-path>에 해당하는 kubernetes resource를 생성/변경가능
kubectl apply -f pod.yaml
 
🍀  필수요소
version 오브젝트 버전 v1, app/v1, networking.k8s.io/v1, ...
kind 종류 Pod, ReplicaSet, Deployment, Service, ...
metadata 메타데이터 name과 label, annotation(주석)으로 구성
spec 상세명세 리소스 종류마다 다름

🍀  pod의 상태 확인

kubectl get pod

📍쿠버네티스(Kubernetes)의 Service

파드 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법
자세한 설명 : https://kubernetes.io/ko/docs/concepts/services-networking/service/

- 서비스 기본 예시 코드

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

 

⌨️  Service Type

서비스는 IP 주소 할당 방식과 연동 서비스등에 따라 크게 4가지로 구별.
  • Cluster IP : 고정된 IP,PORT를 제공하지만, 클러스터 내부에서만 접근할수있는 대역의 주소가 할당
  • Load Balancer : 클러스트 외부에서 접근할 수 있지만, Load Balancing 역할을 하는 모듈이 추가적으로 필요
  • Node IP : kubernetes cluster 내부에 배포된 서비스에 클러스터 외부에서 접근 가능
  • External name

📍쿠버네티스(Kubernetes)의 PVC(PersistentVolume, PersistentVolumeClaim)

영구적으로 데이터를 보존하고 싶을 때 사용하는 리소스( docker run의 -v 옵션과 유사한 역할)
자세한 설명 : https://kubernetes.io/docs/concepts/storage/persistent-volumes/

⌨️  PVC 생성

kubectl get storageclass

#or
#yaml 파일 생성하여 적용

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec: 
  accessModes:
    - ReadWriteMany
volumeMode: Filesystem
resources:
requests:
storage: 10Mi
storageClassName: standard


kubectl apply -f pvc.yaml

⌨️  Pod에서 PVC 사용

yaml 파일에서 volumeMounts, volumes부분 수정하여 적용
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html" #mount할 pod의 경로
      name: test
volumes:
  - name: test
    persistentVolumeClaim:
      claimName: myclaim

 


 

📌DVC(Data Version Control) 이란?

머신러닝 프로젝트를 위한 open-source version control 시스템
MLOps의 Data Management으로 많은 데이터관리하기에 적합하지 않은 git(5기가 이하권장)을 대신하여 나타났음
- git과 dvc의 명령어는 상당히 유사
자세한 설명 :
https://devocean.sk.com/blog/techBoardDetail.do?ID=163379
https://dvc.org/

 🖥 DVC 설치

#python과 git이 설치되어있는지 확인
python -V # Python 3.9.6
git --version # git version 2.25.1

#https://dvc.org/doc/install
pip install dvc[all]==2.6.4
dvc --version # 2.6.4

⌨️  DVC 사용

# 실습으로 연습하시는거라면
# 꼭! Directory를 생성하고 그안에서 진행 하시는걸 강력 추천합니다!!!

mkdir dvc #dvc라는 이름의 폴더 생성
cd dvc #dvc 폴더로 진입

git init #git 저장소로 초기화
dvc init # dvc 저장소로 초기화

# 데이터 관리할 폴더를 생성
mkdir data
cd dvc #data 폴더로 진입

#dvc로 tracking
dvc add data/test.txt
코드에 대한 자세한 설명 : https://inahjeon.github.io/dvc/

📌MLflow 이란?

An open source platform for the machine learning lifecycle
개인 미니 프로젝트 MLOps의 Model Management로 선택한 End to End로 머신러닝 라이프 사이클을 관리할 수 있는 오픈소스
자세한 설명 : 
https://zzsza.github.io/mlops/2019/01/16/mlflow-basic/
https://lsjsj92.tistory.com/623
https://github.com/mlflow/mlflow
  • 주요 기능
    • 1) MLflow Tracking
      • 파라미터와 결과를 비교하기 위해 실험 결과를 저장
    • 2) MLflow Projects
      • 머신러닝 코드를 재사용 가능하고 재현 가능한 형태로 포장
      • 포장된 형태를 다른 데이터 사이언티스트가 사용하거나 프러덕션에 반영
    • 3) MLflow Models
      • 다양한 ML 라이브러리에서 모델을 관리하고 배포, Serving, 추론

 🖥 MLflow 설치

pip install mlflow==1.20.2
mlflow --version # mlflow, version 1.20.2

⌨️  MLflow 사용

# MLflow tracking server

mlflow ui
#http://127.0.0.1:5000로 접속하라는 메세지가 나오면 사파리,크롬등 브라우저에서 확인

🍀  본인의 프로젝트를 바로 시도하기전에 간단한 튜토리얼을 시도하길 추천합니다(전 이미 망했어요)

MLflow 소개 및 Tutorial

📌Flask 이란?

현재 글쓴이가 사용할 수 있는 유일한 Service🥲
- 서빙의 간편화를 위한 Seldon Core,TFServing, KFServing, Torch Serve, BentoML 등 있음
자세한 설명 : https://flask.palletsprojects.com/en/2.0.x/

 🖥 flask 설치

# python
python -V # Python 3.8.9

# Flask
pip install -U Flask==2.0.2

# Flask Version
flask --version

 

⌨️  flask 사용

#기본
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"
if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=5000)
    
    #127.0.0.1:5000 진입하면 로컬서버에 Hello, World!가 있음
#Routing : python 함수를 web sever URI에 mapping

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"
@app.route("/hell")
def hello_fastcampus():
    return "<p>Hello, hell!</p>"
if __name__ == "__main__":
  app.run(debug=True, host='0.0.0.0', port=5000)
  
  #127.0.0.1:5000/hell로 접속하면 다른 글씨를 확인할수있음

+) 머신러닝 기능을 넣어보자!

더보기

 

iris data 분류모델

- 머신러닝py 실행 후 build라는 폴더가 생김

- 폴더 안을 확인 시 model.pkl 생성

📌Seldon core 이란?

https://docs.seldon.io/projects/seldon-core/en/latest/workflow/install.html

 

Install Seldon-Core — seldon-core documentation

First install Helm 3.x. When helm is installed you can deploy the seldon controller to manage your Seldon Deployment graphs. Now we can install Seldon Core in the seldon-system namespace. For full instructions on installation with Istio and Ambassador read

docs.seldon.io

 

이 이후 부분은 시간부족으로 진행하지 못했으며,  추후 개인프로젝트로 이어서 진행할 예정이다.