머신러닝 오퍼레이션 자동화, MLOps



  • ML + DevOps = MLOps

  • 데이터 사이언스는 2개의 workflow로 일반화됨
    • Model Development
    • Model Serving(Prediction)
  • 만약 팀이 작을 경우
    • 유지할 수 있는 소수의 모델
    • 데이터 과학자들이 머리속에 모델에 대해 기억할 수 있음
    • 각자 진행 상황을 추적할 수 있는 방법이 있음
  • 그러나 팀이 점점 성장하면 생기는 이슈들
    • 1) Data 흐름의 복잡도 증가
      • 데이터 처리 workflow가 많음
      • 표준화된 흔적 없이 데이터가 수정됨
      • flow와 스케쥴의 복잡성을 관리하는 것이 점점 힘듬
    • 2) 각자 선호하는 도구가 다름
      • Tensorflow, R, Spark, Keras, PyTorch, MXNet 등
    • 3) Serving model은 점점 어려워짐
      • 다른 환경에서 실행되는 다른 모델 버전
      • 모델 배포 및 복귀(롤백)가 더 복잡해짐
    • 4) 무엇이 잘못되었는지 추적하기 힘듬
      • 데이터 과학자들은 파이프라인 버그라고 하는데
      • 데이터 엔지니어는 모델의 문제라고 함

직군별 Task

  • Data Scientist
    • 모델 개발
  • Data Engineer
    • 데이터 파이프라인 개발
  • DEVOPS / DATAOPS / MLOPS Engineer
    • 모델, 데이터 파이프라인 및 Production 부분 담당

컨셉

  • 모델(이나 기술)이 성장하며 인프라를 사용해야 함
  • ML-Ops의 2가지 원칙
    • Reproducibility ( 재현성 )
    • Orchestration ( 배치/정렬 자동화 )

원칙 1. MODEL & DATA VERSIONING

  • 각 단계별 특정한 data in/out이 있고, code나 config가 존재
  • 추상화하면
    • Data cleaning, Feature Generator, Model
  • 재현성이 가능하게 해주는 것
    • 오류를 디버깅할 때 추적 가능
    • 결과가 균일
    • 재사용할 수 있도록 컴포넌트 모듈화
    • 여러 라이브러리를 추상화
    • 이전 릴리즈로 되돌아 가야 할 경우 재현

원칙 2. MODEL DEPLOYMENT ORCHESTRATION

  • Production에서 모델 serving의 복잡도를 다룸
  • CI / CD / 모니터링과 유사하나 완벽히 다름
  • 모니터링
    • 모델의 Quality Control 과정은 반드시 필수!!!!
  • Compliance
  • 컴퓨터 자원 할당
    • 다양한 계산 그래프가 있는 경우 적절한 리소스를 할당해야 함
    • 아래와 같은 소프트웨어에서 가능
      • ETL framework
      • HDFS-based service
      • Kubernetes cluster
      • Distributed framework
    • 자원 할당이 만드는 차이 - 기존(전통) 서버 할당과 비교 가능
      • auto scale
      • serverless

Existing Tools

PMML

  • sklearn2pmml Github
  • Storage 및 serialisation을 위한 기계학습 모델 파이프라인을 표현하는 방법
  • 여러 시스템이 이 방법으로 플랫폼간 모델 전송
from sklearn import datasets, tree
iris = datasets.load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)

from sklearn_pandas import DataFrameMapper
default_mapper = DataFrameMapper(
    [(i, None) for i in iris.feature_names + ['Species']])

from sklearn2pmml import sklearn2pmml
sklearn2pmml(estimator=clf,
             mapper=default_mapper,
             pmml="D:/workspace/IrisClassificationTree.pmml")

DATA VERSION CONTROL(DVC)

  • link
  • 데이터 과학 프로젝트를 위한 버전 컨트롤 시스템
  • iterative.ai에 의해 빌드된 git fork는 데이터, config, 코드를 그룹화할 수 있음
# add your data
dvc add images.zip

# connect data input, model output and code
dvc run -d images.zip -o modl.p ./cnn.py

# add repository location (s3)
dvc remote add myrepo s3://mybucket

# push to the location specified
dvc push

ModelDB

  • Github
  • 함수 자체를 확장해 라이브러리 수준에서 input, output, config를 추적하는 암묵적인 방법
  • 사용된 모든 단계와 모델 결과, prediction을 저장
  • 저장된 모델을 사용 가능
def fit_and_predict(data):
    model.fit_sync(data)
    preprocessor.transform_sync(data)
    model.predict_sync(data)

PACHYDERM

  • Github
  • 재현 가능한 파이프라인 정의를 허용하는 End to End 모델 버전 관리 프레임워크
# create a repo
$ pachctl create-repo training
$ pachctl list-repo
NAME                CREATED             SIZE
training            2 minutes ago       0 B

# commit data (with -c flag) into the repo
$ pachctl put-file training master -c -f data/iris.csv
# Build
# pytrain.py

...import dependencies

cols = [ "Sepal_Length", "Sepal_Width", "Petal_Length", "Petal_Width", "Species" ]
features = [ "Sepal_Length", "Sepal_Width", "Petal_Length", "Petal_Width" ]

# Load training data
irisDF = pd.read_csv(os.path.join("/pfs/training", 
    "iris.csv"), names=cols)

svc = svm.SVC(kernel='linear', C=1.0).fit(
    irisDF[features], irisDF["Species"])

# Save model to pachyderm /pfs/out
joblib.dump(svc, os.path.join("/pfs/out", 'model.pkl'))
# dockerfile
FROM ubuntu:14.04

...install dependencies 

# Add our own code.
WORKDIR /code
ADD pytrain.py /code/pytrain.py
# computational pipeline 정의
{
  "pipeline": {
    "name": "model"
  },
  "transform": {
    "image": "pachyderm/iris-train:python-svm",
    "cmd": ["python3", "/code/pytrain.py",]
  },
  "input": {
    "atom": {
      "repo": "training",
      "glob": "/"
    }
  }
}

ORCHESTRATION을 위한 도구

MLeap

  • Github
  • 모델 직렬화에 대한 깊은 다이빙
# run the server
$ docker run \ 
    -p 65327:65327 \
    -v /tmp/models:/models \
    combustml/mleap-serving:0.9.0
    
# load a model 
curl -XPUT -H "content-type: application/json" \
  -d '{"path":"/models/<my model>.zip"}' \
  http://localhost:65327/model   

Seldon-core


이 글이 도움이 되셨다면 공감 및 광고 클릭을 부탁드립니다 :)




© 2017. by Seongyun Byeon

Powered by zzsza