Aiffel) Exploration - MLOps 정리
내용 출처 : 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)
2) MLOps 과정
- 설정(Configuration)
- 하이퍼파라미터 설정 값, 프레임워크, 서빙방식 등 설정 필요
- 데이터 수집 (Data Collection)
- 좋은 모델을 위한 좋은 데이터 수집
- 특성 추출(Feature Extraction) (📌데이터 전처리)
- 수집된 데이터에 대한 이해도를 높임 → 올바른 모델 선택
- 데이터 검증 (Data Verification) (📌모델 학습 전 데이터 검증)
- 데이터의 정확성, 사용성 재검증 필요
- 분석 도구 (Analysis Tools) 활용 (📌개발 : 모델 평가용)
- 대표적인 툴 : TensorBoard, W&B, mlflow 등
- 프로세스 관리 툴(Process Management Tools) (📌개발/유지 : 호환성 관리)
- 대표적인 툴 : airflow, TFX, Kubeflow 등
- 리소스 관리 (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)
구분 | 장점 | 단점 |
---|---|---|
MLflow | - 간단하게 사용가능 - Jupyter Notebook 지원 |
- 하이퍼파라미터 튜닝 미지원 |
Apach Airflow |
- 범용적인 task orchestration 지원 | - task orchestration만을 지원 |
Kubeflow | - workflow orchestration 지원 - Model management 지원 - notebook workspace 지원 |
- Kubernetes 구동 필요 → 사용 리소스 ▲ |
-
TFX 예시
컴포넌트
로 관리 → 다양한 환경에서 사용 가능- CSV / BigQuery / Kubeflow pipeline 활용 가능
- Vertex AI를 활용 가능
- CPU/GPU같은 환경에 상관없이 사용 가능
- 스캐터랩 - TFX 머신러닝 파이프라인 사용하기
- 당근마켓 - TFX와 함께 머신러닝 파이프라인 개발하기
4. TFX의 표준 컴포넌트 종류
1) 데이터 입력 컴포넌트
- ExampleGen : 데이터를 TFX Pipeline으로 넣는 컴포넌트
- Validation, Transform에 사용될 라이브러리에 데이터 제공 (📌Data Split)
- 입력 : CSV, TFRecord, BigQuery
- 출력 : tf.Example Record, tf.SequenceExample records, .proto파일
- StatisticsGen : 입력 데이터 통계를 생성(시각화)
- 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 라이브러리 활용)
- 데이터 전처리 : 분포 확인 / 이상치 처리 / 서비스에서 쓰인 데이터가 다시 훈련 데이터로 들어가는 과정 설계
- 기준에 맞게 데이터셋 구축하기(라벨링 기준점 만들기, 자동화하기 등)
- Multi Annotator 기법
- 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을 사용한다는 뜻
결과화면
✨ 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)
결과화면
classify_lite = interpreter.get_signature_runner('serving_default') classify_lite
결과화면
댓글남기기