5 분 소요

내용 출처 : Aiffel

학습 목표

  • MLOps 이론에 대한 기초를 알 수 있습니다.
  • KerasTuner로 하이퍼파라미터 튜닝을 할 수 있습니다.
  • TFServing이나 TFLite로 모델을 배포할 수 있습니다.

1. MLOps의 정의

  • 개념 : 머신러닝(ML)과 Operations(Ops)가 합쳐진 체계

1) MLOps vs DevOps의 주요 차이점 : “Hidden Technical Debt in Machine Learning Systems”

  • 개발/배포 : 속도▲ 비용▼ / 유지 : 난이도▲, 비용▼ (상대적으로)
  • 기술 부채 감지 힘듬(시스템 차원에서 발생) → 숨겨진 기술 부채

2) MLOps vs DevOps의 차이의 주요 원인

  • 머신러닝과 소프트웨어 개발 방식의 차이(Complex Models Erode Boundaries)
    • 추가 학습을 진행 시 모든 설정 값 변경 → 업무 캡슐화, 모듈화하기 힘듬

  • 데이터 디펜더시(Data Dependencies Cost More than Code Dependencies)
    • 컴파일러로 해결 불가 → 오류 원인 인지 힘듬
    • 하나의 데이터 수정 → 전체 시스템의 변경(시스템 문제 유발 가능)

  • 피드백 순환루프(Feedback Loops)
    • 피드백을 받아 수정할때 다른 곳에도 영향을 미치는 것

  • 머신러닝의 안티 패턴들(ML-System Anti-Patterns)
    • 다양한 영역 → 접착 코드 남발 → 호환성 이슈

  • 설정 부채(Configuration Debt)
    • 하이퍼 파라미터 설정 값에 대한 검증이나 테스트를 진행하지 않는 경향

  • 현실에서 발생하는 변화들(Dealing with Changes in the External World)
    • 외부 환경 변화로 인해 모니터링과 테스팅을 지속적으로 진행해야 함

2. MLOps의 구성요소

1) MLOps 구성요소(출처 : Hidden Technical Debt in Machine Learning Systems)

content img

2) MLOps 과정

  • 설정(Configuration)
    • 하이퍼파라미터 설정 값, 프레임워크, 서빙방식 등 설정 필요

  • 데이터 수집 (Data Collection)
    • 좋은 모델을 위한 좋은 데이터 수집

  • 특성 추출(Feature Extraction) (📌데이터 전처리)
    • 수집된 데이터에 대한 이해도를 높임 → 올바른 모델 선택

  • 데이터 검증 (Data Verification) (📌모델 학습 전 데이터 검증)
    • 데이터의 정확성, 사용성 재검증 필요

  • 분석 도구 (Analysis Tools) 활용 (📌개발 : 모델 평가용)
    • 대표적인 툴 : TensorBoard, W&B, mlflow 등


  • 리소스 관리 (Machine Resource Management)
    • 비용 문제로 리소스(GPU 등) 관리 필요
    • 대표적인 툴 : 쿠버네티스(오케스트레이션 툴), TerraForm(코드로 인프라 관리)

  • 인프라 배포 (Serving Infrastructure) (📌배포 : 서비스화 후 배포)
    • 모델 예측 결과를 Database에 저장 vs API
    • 대표적인 툴 : BentoML, Gradio 등

  • 모니터링(Monitoring) (📌유지 : 추가 학습 필요 판단)
    • 대표적인 툴 : VertexAI 등

3. MLOps툴 : TFX (TensorFlow Extended)

  • TFX의 장점 : 단일 오픈소스 플랫폼로 End-to-End로 구현가능
  • 대표적인 TFX (mlflow, airflow, Kubeflow) content img
구분 장점 단점
MLflow - 간단하게 사용가능
- Jupyter Notebook 지원
- 하이퍼파라미터 튜닝 미지원
Apach
Airflow
- 범용적인 task orchestration 지원 - task orchestration만을 지원
Kubeflow - workflow orchestration 지원
- Model management 지원
- notebook workspace 지원
- Kubernetes 구동 필요 → 사용 리소스 ▲


4. TFX의 표준 컴포넌트 종류

1) 데이터 입력 컴포넌트

  • ExampleGen : 데이터를 TFX Pipeline으로 넣는 컴포넌트
    • Validation, Transform에 사용될 라이브러리에 데이터 제공 (📌Data Split)
    • 입력 : CSV, TFRecord, BigQuery
    • 출력 : tf.Example Record, tf.SequenceExample records, .proto파일 content img


  • StatisticsGen : 입력 데이터 통계를 생성(시각화) content img


  • SchemaGen : 스키마가 없을 경우 스키마를 생성하는 컴포넌트
    • 스키마 : 데이터베이스의 개체/속성/관계 등을 고려힌 논리적인 저장 구조


  • ExampleValidator : 훈련 및 제공 데이터에 있는 문제점을 식별

2) Transform 컴포넌트(전처리)

  • TensorFlow Transform : 전처리 결과를 시각화 / 머신러닝 모델에 데이터 이관
    • 자연어 처리 : ngram,bag of words, TFIDF 등에 적용 가능
    • 컴퓨터 비전 : 이미지 디코딩, 픽셀 조정 가능
    • Apache Beam에 이식해서 사용 가능
      • Apache Beam : 배치 및 스트리밍 데이터 처리 파이프 라인을 정의/실행하는 오픈 소스 통합 프로그래밍 모델

3) Trainer 컴포넌트(모델 학습)

  • 파이프라인의 학습 단계를 처리하는 컴포넌트
    • 모델 작성 → 학습 코드 생성 → 해당 코드를 TFX에 통합
    • Keras 모델 필요
    • 텐서보드 연결, 성능 병목 현상이 파악 가능
    • savedModel을 사용해, 모델 저장 가능
      • saved_model.pb : 그래프 구조 포함(pb는 프로토콜 버퍼를 의미)
      • variables : 변수값이 있는 이진 파일, 그래프에 해당하는 체크포인트 포함
      • assets : 모델을 불러올 때 추가적인 파일이 필요한 경우(이 폴더에 파일이 생성)

4) Tuner 컴포넌트(모델 튜닝)

  • KerasTuner / Google Cloud Platform제공 Tuner
구분 특징
KerasTuner - 코드로 제어 가능(쉬운 하이퍼파라미터 튜닝)
- 병렬 튜닝 지원(효율성)
- Grid Search/Random Search 지원
- Bayesian Optimization 지원
Google Cloud Platform제공 Tuner - ✨ KerasTuner 사용 알고리즘 전부 사용 가능
- ✨ 클라우드 비용 발생함

5) Evaluator, Pusher 컴포넌트

  • Evaluator 컴포넌트 :검증 데이터셋에 대한 모델 예측 평가(TensorFlow Model Analysis 활용)
    • 텐서보드는 미니배치상 추론된 대략적인 지표만 제공
    • TensorFlow Model Analysis은 전체 평가 데이터셋을 통해 지표 계산
  • Pusher 컴포넌트 : 모델을 서빙 파일 경로로 제공

6) TensorFlow Serving 컴포넌트

  • 그래프에서 예측 / 모델 및 버전 관리
  • 다양한 소스에서 모델 로드 가능
  • 저장된 모델에 대한 REST API추론 서버를 만들어 결과 값 반환

5. Data Centric AI

  • 정의 : 데이터의 질과 구조에 중점을 두는 인공지능 개발 방법론
  • 방법 : 모델은 고정해 둔채로 데이터 자체 결함을 최소화시켜 성능 향상
    • Label 검수하기 : 데이터셋의 정확도와 신뢰도를 보장
    • Confident Learning :노이즈가 있는 데이터를 없애고 노이즈를 추정하기 위해 계산하고 예제에 대한 랭킹을 매기는 학습방식(cleanlab 라이브러리 활용) content img
    • 데이터 전처리 : 분포 확인 / 이상치 처리 / 서비스에서 쓰인 데이터가 다시 훈련 데이터로 들어가는 과정 설계
    • 기준에 맞게 데이터셋 구축하기(라벨링 기준점 만들기, 자동화하기 등)
      • Multi Annotator 기법 content img
    • Data Centric에 맞는 평가 지표 만들기 : 확률로 평가(맞다/아니다 보다 구체적인 평가)

6. Keras Tunner 코드 구현

  • Tunner 설치
      !pip install keras-tuner
    
  • 데이터 셋 불러오기
      import tensorflow as tf
      import keras
      import keras_tuner as kt
      from sklearn.model_selection import train_test_split
      import os
    
      (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
    
      # CNN 사용에 따른 차원 추가
      X_train = x_train.reshape(-1,28, 28, 1)
      X_test = x_test.reshape(-1,28,28,1)
    
      # label을 숫자로 변경
      y_train = tf.keras.utils.to_categorical(y_train)
      y_test = tf.keras.utils.to_categorical(y_test)
    
      # 데이터셋 분할
      X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size = 0.2)
    
  • 모델 학습 메서드
      class DeepTuner(kt.Tuner):
          def run_trial(self, trial, X, y, validation_data, **fit_kwargs):
              model = self.hypermodel.build(trial.hyperparameters)
              model.fit(X, y, batch_size=trial.hyperparameters.Choice('batch_size', [16, 32]), **fit_kwargs)
    
              X_val, y_val = validation_data
              eval_scores = model.evaluate(X_val, y_val)
              return {name: value for name, value in zip(model.metrics_names, eval_scores)}
    
      my_keras_tuner = DeepTuner(oracle=kt.oracles.BayesianOptimizationOracle(objective=kt.Objective('accuracy', 'max'), max_trials=10, seed=42), hypermodel=build_model, overwrite=True, project_name='my_keras_tuner')
    	
      # 해당 모델 학습시간은 약 10분정도 걸립니다!
      my_keras_tuner.search(X_train, y_train, validation_data=(X_val, y_val), epochs=3)
    
  • 모델 확인
      best_hps = my_keras_tuner.get_best_hyperparameters(num_trials=10)[0]
      model = build_model(best_hps)
      model.summary()
    
  • 모델 학습
      model.fit(X_train, y_train, batch_size=32, epochs = 5)
    
  • 모델 평가
      model.evaluate(X_test, y_test)
    
  • 모델 저장
      save_path = #[원하는 경로]
      fname = os.path.join(save_path, 'model')
      model.save(fname)
    

7. TFServing & TFLite : 모델 배포

1)우분투 터미널

  • tensorflow-model-server설치해 배포용 텐서플로우 서버 구축
      $ echo "deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal" | sudo tee /etc/apt/sources.list.d/tensorflow-serving.list && \
      curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | sudo apt-key add -
      $ sudo apt update
      $ sudo apt install tensorflow-model-server
    
  • 모델 배포
      $ tensorflow_model_server --port=8500 \
                              --rest_api_port=8501 \
                              --model_name=my_model \
                              --model_base_path= [실제 모델 경로]
    

2) Docker

  • WSL2쉘에 실행(맥북은 터미널에서도 가능)
      docker pull tensorflow/serving
    
      docker run -p 8500:8500 \
                  -p 8501:8501 \
                  --mount type=bind, source=[실제 폴더], target=[실제 모델 경로]
                  -e MODEL_NAME=my_model \
                  -e MODEL_BASE_PATH=[실제 모델 경로] \
                  -t tensorflow/serving
    

첫 번째 줄 : 기본 포트 지정
두 번째 줄 : API 포트 지정
세 번째 줄 : 모델 디렉토리 마운트
네 번째 줄 : 모델 이름 지정
다섯 번째 줄 : 모델 기본 경로 지정
마지막 줄 : tensorflow/serving을 사용한다는 뜻

content img

결과화면

✨ TFLite로 경량화 모델 만들기

  • 양자화라는 기법을 활용해 모델의 크기를 줄이지만 성능이 크게 저하되지 않음

  • 모델 불러오기
      load_path = # [실제 모델 경로]
      best_model = tf.keras.models.load_model(load_path)
    
  • tfile파일로 변환
      converter = tf.lite.TFLiteConverter.from_keras_model(model)
      tflite_model = converter.convert()
    
  • 보관
      with open('model.tflite', 'wb') as f:
        f.write(tflite_model)
    
  • 서명 확인
      interpreter = tf.lite.Interpreter(model_content=tflite_model)
    
      signatures = interpreter.get_signature_list()
      print(signatures)
    

    content img

    결과화면

      classify_lite = interpreter.get_signature_runner('serving_default')
      classify_lite
    

    content img

    결과화면

✨ 관련 프로젝트 링크

댓글남기기