쉬엄쉬엄블로그

(AI 서비스 개발 기초) Model Serving 본문

부스트캠프 AI Tech 4기

(AI 서비스 개발 기초) Model Serving

쉬엄쉬엄블로그 2023. 8. 2. 22:42
728x90

이 색깔은 주석이라 무시하셔도 됩니다.

Product Serving

Model Serving

Serving Basic

  • Serving
    • Production(Real World) 환경에 모델을 사용할 수 있도록 배포
    • 머신러닝 모델을 개발하고, 현실 세계(앱, 웹)에서 사용할 수 있게 만드는 행위
    • 서비스화라고 표현할 수도 있음
    • 머신러닝 모델을 회사 서비스의 기능 중 하나로 활용
      • 예 : 추천 시스템의 추천 알고리즘
    • Input이 제공되면 모델이 예측 값(Output)을 반환
  • 크게 2가지 방식 존재
    • Online Serving
    • Batch Serving
  • 그 외에 클라이언트(모바일 기기, IoT Device 등)에서 Edge Serving 도 존재

용어 정리

  • Serving : 모델을 웹/앱 서비스에 배포하는 과정, 모델을 활용하는 방식, 모델을 서비스화하는 관점
  • Inference : 모델에 데이터가 제공되어 예측하는 경우, 사용하는 관점
  • Serving - Inference 용어가 혼재되어 사용되는 경우도 존재
  • Online Serving / Online Inference
  • Batch Serving(+ Inference)

Online Serving

Web Server Basic

  • 웹 서버 (Wikipedia)

    • HTTP를 통해 웹 브라우저에서 요청하는 HTML 문서나 오브젝트를 전송해주는 서비스 프로그램
    • 요청(Request)을 받으면 요청한 내용을 보내주는(Response) 프로그램
    • Client의 다양한 요청을 처리해주는 역할
      • Machine Learning Server는 데이터 전처리, 모델을 기반으로 예측 등 다양한 요청을 처리해주는 역할을 함
  • 크롬에서 https://www.youtube.com/에 접근하는 경우, 해당 페이지를 보여달라고 요청(Request)
    유튜브 서버는 유튜브 메인 페이지를 반환(Response)

  • 머신러닝 모델 서버

    • 어떤 데이터(Input)를 제공하며 예측해달라고 요청(Request)하면, 모델을 사용해 예측 값을 반환(Response)하는 서버

  • 우리가 만들 마스크 예측 모델 프로토타입

    • 이미지 업로드하고 분류하는 과정 : 머신러닝 모델 예측

API

  • API(Application Programming Interface)
    • 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스
    • 사용자들이 프로그램이나 어플리케이션을 사용할 수 있도록 여러 기능이 존재
      • TV의 리모컨 : TV를 켜거나, 채널을 이동하거나, 음량을 조정
    • 인터페이스 : 기계와 인간의 소통 창구!
    • 특정 서비스에서 해당 기능을 사용할 수 있도록 외부에 노출 : 기상청 API, 지도 API
    • 라이브러리의 함수 : Pandas, Tensorflow, PyTorch

Online Serving Basic

  • 요청(Request)이 올 때마다 실시간으로 예측

  • 클라이언트(애플리케이션)에서 ML 모델 서버에 HTTP 요청(Request)하고, 머신러닝 모델 서버에서 예측한 후, 예측 값(응답)을 반환(Response)

  • Online Serving / Online Inference

  • ML 모델 서버에 요청할 때, 필요시 ML 모델 서버에서 데이터 전처리를 해야할 수 있음
    (혹은 분리를 위해 전처리 서버 / ML 모델 서버로 나눌 수도 있음)

  • 서비스의 서버에 ML 서버를 포함하는 경우도 있고, ML 서버를 별도로 운영하는 경우도 존재

  • 회사에서 개발 조직과 데이터 조직의 협업하는 방식에 따라 다르게 개발할 수 있음

  • Online Serving을 구현하는 방식

    1. 직접 API 웹 서버 개발

      • Flask, FastAPI 등을 사용해 서버 구축

      • localhost(예를 들면 www.naver.com/) 웹 서버 예시

    2. 클라우드 서비스 활용

      • AWS의 SageMaker, GCP의 Vertex AI 등

      • 클라우드 서비스의 장점

        • 직접 구축해야 하는 MLOps의 다양한 부분(API 서버 만들기)이 만들어짐

        • 사용자 관점에선 PyTorch 사용하듯 학습 코드만 제공하면 API 서버가 만들어짐

      • 클라우드 서비스의 아쉬운 점

        • 클라우드 서비스가 익숙해야 잘 활용할 수 있음
        • 비용 문제 : 직접 만드는 것 보단 더 많은 비용이 나갈 수 있음
      • 회사의 상황에 따라 클라우드 서비스를 활용하는 것이 좋은 시기도 존재

        • 소수의 인원만 존재하며, 소수의 인원이 많은 업무를 해야하는 경우
        • 클라우드의 내부 실행 구조를 잘 알아야 문제 상황이 발견되었을 때 잘 해결할 수 있음
        • 클라우드 서비스에선 어떤 방식으로 AI 제품을 만들었는지 확인할 수도 있어서 사용해보는 것도 좋음
    3. Serving 라이브러리 활용

      • Tesnorflow Serving, Torch Serve, MLFlow, BentoML 등

      • Fast API 등을 활용할 수 있지만, 처음에 서버에 대한 이해가 충분하지 않으면 어려울 수 있음

      • 다양한 방식으로 개발할 수 있지만, 매번 추상화된 패턴을 가질 수 있음

      • 추상화된 패턴을 잘 제공하는 오픈소스를 활용하는 방식

Serving Input - Single Data Point

  • 단일 데이터를 받아 실시간으로 예측을 하는 예제
  • 기계 고장 예측 모델
    • 센서의 실시간 데이터가 제공되면 특정 기계 부품이 앞으로 N분 안에 고장날지 아닐지를 예측
  • 음식 배달 소요 시간 예측
    • 해당 지역의 과거 평균 배달 시간, 실시간 교통 정보, 음식 데이터 등을 기반으로 음식 배달 소요 시간 예측

다양한 Serving 방법을 선택하는 가이드

  • 어떤 방법을 쓰느냐는 주어진 환경(회사에서 주어진 일정, 인력, 예산, 요구 성능 등)에 따라 다름
  • 추천 방식
    • (만약 회사에서 클라우드 비용에 대해 괜찮을 경우)
    1. 프로토타입 모델을 클라우드 서비스를 활용해 배포
    2. 직접 FastAPI 등을 활용해 서버 개발
    3. Serving 라이브러리를 활용해 개발
  • 이런 Flow로 체험하는 것을 추천
    1. 프로토타입 개발
    2. Fast API로 서버 개발
    3. Serving 라이브러리로 개발
  • 바로 Serving 라이브러리를 학습하지 않는 이유
    • 사용하기엔 편하지만, 이 강의는 툴을 학습하는 강의가 아니라 점진적으로 문제를 해결하는 강의
    • 여러가지 방법 중 이 방법을 왜 선택하는지에 대한 인식을 키워주고 싶음
    • 오픈소스는 계속 개발되고 있기 때문에 언제든 새로운 오픈소스가 나올 수 있음
      (=라이브러리에 종속되지 말기)
    • High Level 오픈소스를 먼저 사용할 경우 Low Level의 이해도가 부족할 수 있음
    • 서버 프로그래밍은 필수적으로 경험해야 하기 때문에 먼저 서버 프로그래밍을 해보고 Serving 라이브러리를 학습!

Online Serving에서 고려할 부분

  • Serving할 때 Python 버전, 패키지 버전 등 Dependency가 굉장히 중요
  • “재현 가능”하지 않은 코드는 Risk를 가지고 있는 코드
  • 관련해서 Virtualenv, Poetry, Docker도 학습할 예정
  • 실시간 예측을 하기 때문에 예측할 때 지연 시간(Latency)를 최소화해야 함
    • Latency : 하나의 예측을 요청하고 반환 값을 받는 데까지 걸리는 시간
    • 이 값은 짧을 수록 좋으며, Latency가 길다는 것은 Loading이 긴 것과 유사한 상황
  1. Input 데이터를 기반으로 Database에 있는 데이터를 추출해서 모델 예측해야 하는 경우
    • 데이터는 다양한 공간(Database, AWS S3)에 저장되어 있을 수 있음
    • 데이터를 추출하기 위해 쿼리를 실행하고, 결과를 받는 시간이 소요
  2. 모델이 수행하는 연산
    1. RNN, LSTM 등은 회귀 분석보다 많은 연산을 요구하고, 더 오래 걸림
    2. 이를 위해 모델을 경량화하는 작업이 필요할 수 있으며, 복잡한 모델보다 간단한 모델을 사용하는 경우도 존재
  3. 결과 값에 대한 보정이 필요한 경우
    • 머신러닝 알고리즘에서 유효하지 않은 예측값이 반환될 수 있음
    • 예를 들어 집 값을 예측하는 데, 0 이하의 마이너스 값이 나올 수 있음
    • 이런 경우 결과를 보정하는 코드가 필요할 수 있음
      • 예 : 집 값이 마이너스가 나오면 0으로 표시한다 등
  • 앞의 문제를 해결하기 위해 여러가지 방법이 존재하며, Part 4에서 다양한 가이드를 제공
  • 다양한 방법
    • 데이터 전처리 서버 분리(혹은 Feature를 미리 가공 - Feature Store)
    • 모델 경량화
    • 병렬처리(Ray)
    • 예측 결과 캐싱
    • 등 문제 상황에 맞는 해결 방법이 존재

Batch Serving

Batch Serving Basic

  • Batch Serving은 주기적으로 학습을 하거나 예측을 하는 경우

    • 30분에 1번씩 최근 데이터를 가지고 예측
    • Batch 묶음(30분의 데이터)를 한 번에 예측
    • 모델의 활용 방식에 따라 30분일 수도 있고, 1주일, 하루 단위일 수 있음
    • 한 번에 많은 예측을 실행
    • 특정 시간에 반복해서 실행
    • Batch는 데이터 엔지니어링에서 자주 활용되는 용어
      • 한꺼번에 배치 단위로 묶음 (DataLoader의 Batch와 유사)
  • Batch Serving 관련한 라이브러리는 따로 존재하지 않음

  • 함수 단위를 “주기적”으로 실행함

    • 아침 10시에 python main.py 실행
    • 아침 11시에 python main.py 실행
  • Airflow, cron Job 등으로 스케줄링 작업(Workflow Scheduler)

    • 학습 / 예측을 별도의 작업으로 설정
      • 학습 : 1주일에 1번
      • 예측 : 10분, 30분, 1시간에 1번씩
  • 예시

    • 추천 시스템 : 1일 전에 생성된 컨텐츠에 대한 추천 리스트 예측
    • 1시간 뒤 수요 예측
    • 재고 및 입고 최적화를 위해 매일 매장별 제품 수요 예측
    • 실시간이 필요 없는 대부분의 방식에서 활용 가능
  • 장점

    • Jupyter Notebook에 작성한 코드를 함수화한 후, 주기적으로 실행하는 간단한 구조!
    • Online Serving보다 구현이 수월하며, 간단함
    • 한 번에 많은 데이터를 처리하므로 Latency가 문제되지 않음
  • 단점

    • 실시간으로 활용할 수 없음
    • Cold Start 문제 : 오늘 새로 생긴 컨텐츠는 추천할 수 없음
  • 스포티파이의 예측 알고리즘 - Discover Weekly

    g" alt="https://miro.medium.com/max/720/1*YsViTZr9QTftehZivEEKYA.png">

    • 1주일 단위로 학습과 예측을 하여 추천곡을 공유함

    • 실시간이 정답은 아니라는 것을 보여줌

  • Workflow Scheduler

Online Serving vs Batch Serving

  • Online vs Batch를 선택하는 기준
    • Input 관점
      • 데이터 하나씩 요청하는 경우 : Online
      • 여러가지 데이터가 한꺼번에 처리되는 경우 : Batch
    • Output 관점
      • 인퍼런스 Output을 어떻게 활용하는지에 따라 다름
      • API 형태로 바로 결과를 반환해야 하는 경우 : Online
      • 서버와 통신이 필요한 경우 : Online
      • 1시간에 1번씩 예측해도 괜찮은 경우 : Batch
  • 처음부터 Online Serving(API 형태)로 만들어야 하는 것은 아니고, 실시간 모델 결과가 어떻게 활용되는지에 대한 생각이 필요(예측해도 활용이 되지 않는다면 Batch로 진행해도 무방)
  • Batch Serving의 결과를 Database에 저장하고, 서버는 Database의 데이터를 쿼리해서 주기적으로 조회하는 방식으로 사용할 수 있음
  • 우선 Batch Serving으로 모델을 운영하면서 점점 API 형태로 변환

출처: 부스트캠프 AI Tech 4기(NAVER Connect Foundation)

Comments