본문 바로가기

카테고리 없음

[TFX 스터디 2주차] TFX 프레임워크를 활용한 머신러닝 파이프라인

[TFX 스터디 2주차] TFX 프레임워크를 활용한 머신러닝 파이프라인

 

TFX를 이용해 머신러닝 워크플로우를 한번에 연결하고 관리할 수 있다.

머신러닝 파이프라인은 지난 글에서 정리했었다.

 

2023.09.03 - [데이터 사이언스/TFX] - [TFX 스터디 1주차] TFX 프레임워크를 활용한 머신러닝 워크플로우 개요

 

[TFX 스터디 1주차] TFX 프레임워크를 활용한 머신러닝 워크플로우 개요

[TFX 스터디 1주차] 살아 움직이는 머신러닝 파이프라인 설계 CH1~4 스터디 참여 계기 그동안 머신러닝을 책으로 배웠는데 실전 서비스 등에서 사용되는 머신러닝의 경우 책에서 배운 것과 차이가

itmaster98.tistory.com

파이프라인의 각 단계에서 사용하는 TFX 컴포넌트가 있다.

 

데이터 수집

기본 TFX 설정과 ML 메타데이터스토어를 사용해 데이터셋을 수집하고 파이프라인의 다양한 컴포넌트에서 활용할 수 있다.데이터 수집의 방법에는 로컬 데이터 수집, 원격 데이터 수집, 데이터베이스 데이터 수집이 있다.

 

데이터 종류는 정형 데이터, 텍스트 데이터, 이미지 데이터가 있다.

수집한 데이터는 tf.Example 형태로 변환되어 다른 컴포넌트에서 사용된다.


데이터 검증(TFDV)

수집한 데이터들을 TFVD를 이용해 검증한다. 데이터의 통계, 스키마를 생성할 수 있으며 이를 기반으로 서로 다른 두 데이터셋을 비교할 수 있다. 스키마란 데이터셋에 필요한 피처와 피처별 데이터타입을 정의하는 요소이다. 스키마를 이용해 이후에 수집된 데이터셋이 이전 학습 데이터셋과 일치하는지 확인할 수 있다.

 

데이터 검증은 TFDV를 통해 이루어지며 이후 머신러닝 파이프라인에 통합한다.

 


데이터 전처리(TFT)

TFT를 이용해 데이터셋들에게 일관된 전처리를 수행할 수 있다. 이때 전처리 함수들은 모두 preprocessing_fn() 함수 내에 정의되어야 한다. Transformer 컴포넌트를 실행시키면 preprocessing_fn()함수가 원시데이터를 변환하며 Tensor 또는 sparseTensor 형태로 return된다.


모델학습(Traniner)

TFX의 Trainer 컴포넌트를 사용해 모델을 학습시킬 수 있다. Trainer 컴포넌트는 run_fn()함수를 찾아 이를 학습 프로세스 진행의 진입점으로 사용한다. 모델 학습을 진행한 뒤 모델은 SavedModel 형식으로 저장된다.

 

새 데이터에 대해 모델을 학습시킬 때 데이터가 파이프라인에 도착하면 이전 모델의 정확도가 사전 정의된 수준 이하로 떨어질 때처럼 원하는 시점에 자동화된 프로세스를 실행할 수 있다.


모델 분석 및 검증(TFMA)

학습한 모델을 모델 목적에 따라 적합한 지표를 선택해 분석한다.

 

TFMA는 모델 학습중에 사용되는 지표보다 더 자세한 지표를 쉽게 얻는 방법을 제공하며 모델의 버전에 따른 지표의 시계열화, 데이터셋 일부에 대한 지표를 확인할 수 있게 해준다.

 

Resolover, Evaluater, Pusher 컴포넌트를 이용해 평가 데이터셋에서의 모델 성능을 확인하고 이전 모델이 개선되면 서빙 위치로 보낼 수 있다.

 

Resolover 컴포넌트를 이용해 새 모델을 이전 모델과 비교한다. 가장 최근의 승인 모델을 확인하고 이를 기준으로 새 후보 모델을 사용하여 Evaluater 컴포넌트로 전달한다. Evaluater 컴포넌트는 TFMA 라이브러리를 사용해 검증 데이터셋에 대한 모델의 예측을 평가한다. 이때 초기 실행시 이전에 승인된 모델이 없으면 자동으로 전달된 모델을 승인한다. Pusher 컴포넌트는 저장된 모델, 컴포넌트의 출력, 서비스를 위해 모델이 저장될 파일 경로를 입력하고 Evaluator가 모델을 승인했는지 확인한 뒤 승인을 받았다면 모델을 서빙 파일 경로로 밀어 넣는다. 이렇게 서빙 디렉터리에 들어간 모델들은 텐서플로우 서빙에서 선택될 수 있다.


모델 배포

모델 서버, 사용자 브라우저, edge device를 이용해 머신러닝 모델을 배포할 수 있다. 보통 모델 서버를 이용해 배포하는 방식을 가장 많이 사용한다. 일반적으로 다음과 같은 워크플로우를 따른다.

 

  1. 플라스크, 장고 등의 웹 프레임워크를 사용한 웹 앱 생성
  2. 웹 앱 내에 API 엔드포인트 생성
  3. 모델 구조, 가중치 불러오기
  4. 불러온 모델에서 예측 함수 호출하기
  5. 예측한 결과를 HTTP 요청으로 반환하기

그러나 이러한 간단한 형태는 코드 분리 부족, 모델 버전 제어 부족, 비효율적 모델 추론 방식이라는 단점이 있다. 이러한 단점을 해결하기 위해 다른 방식을 사용할 수도 있다.

 

또한 모델 배포시 좀더 고급화된(?) 방식으로 양자화(quantization), 가지치기(prunning), 증류(distillation) 방식을 추가할 수 있다. 양자화(quantization)는 기존 32비트 부동 소수점 데이터 형식의 모델 가중치를 16비트 소수점/정수 형태로 변환시켜 메모리 사용량을 감소시키는 것, 가지치기(prunning)는 불필요한 가중치를 0으로 설정해 제거함으로서 정밀도는 줄이지만 모델 연산 속도를 높이는 방법, 증류(distillation) 는 큰 모델(교사 모델)의 예측이 작은 모델(학생 모델)의 예측에 영향을 주도록 설정하여 같은 모델 목표를 더 적은 가중치로 표현할 수 있도록 하는 것이다.

 


피드백 루프

배포한 모델들은 피드백 루프에 따라 유지 보수되어 계속적으로 사용될 수 있다. 주로 유저 피드백을 받는 방식을 많이 사용한다. 그러나 이러한 방식들은 모델을 유해한 편향이나 불공정한 방식을 학습하도록 할 수 있으므로 주의가 필요하다.

 


후기

 

이렇게 데이터 전처리부터 개인정보 보호까지 전체적인 텐서플로우 머신러닝 파이프라인 프로세스를 공부했다. 그러나 아직 모르는 부분이 많아 실전에서 사용하기엔 어려움이 많다. 사실 아직 책 내용에 대해서도 완벽하게 숙지하지 못한 것 같다. 시간이 되면 1~2회독정도 더 해보는 것도 좋을 것 같다. (근데 진짜 너무바쁨) TFX를 잘 공부해서 꼭 실전에서 써보고 싶다. 특히 이번 학기 융합 캡스톤 디자인을 들으면서 AI 기반의 웹서비스를 만들기로 했는데 꼭 스터디에서 배운 내용들을 적용해보고 싶다.

 

다음주부터는 박찬성님의 sementic segmentation 예제를 공부하며 실제 코드가 어떻게 작성되는지 살펴보기로 했다.

다음주도 파이팅!!

 

https://github.com/deep-diver/semantic-segmentation-ml-pipeline

 

GitHub - deep-diver/semantic-segmentation-ml-pipeline

Contribute to deep-diver/semantic-segmentation-ml-pipeline development by creating an account on GitHub.

github.com