BentoML 살펴보기

Sung Dong Kim·2022년 1월 11일
0

Serving 라이브러리, BentoML이란?


BentoML같은 serving 라이브러리가 없을 땐 AI 모델을 이용한 서비스를 배포하기 위해 FastAPI와 같은 것을 이용해 직접 API를 만들곤 했다.
FastAPI로 백엔드를 구현하려면 따로 알아야 할 것들도 있고(그래도 언젠간 알아야 되는 것들이다.) 배포해야 하는 모델이 많아진다면 신경써야 하는 것도, 반복되는 코드 양도 늘어난다.

BentoML나 Seldoncore같은 serving 라이브러리들은 백엔드 프로그래밍 과정을 최대한 줄이고 모델 배포 과정을 추상화하여 이전보다 빠르게 배포할 수 있게 해준다.

BentoML의 특징은 다음과 같다.

  • 유연하고 쉬운 사용성
  • 다양한 ML 프레임워크를 지원(Tensorflow, Pytorch, Keras, XGBoost 등등...)
  • AWS, GCP같은 클라우드 컴퓨팅을 위한 가이드, 배포 환경 제공
  • 온라인 서빙과 오프라인 서빙에 높은 성능
  • 모델 저장소와 배포 관리를 위한 웹 대시보드, swagger 제공

BentoML 사용

이전에 FastAPI로 배포했던 킥보드 탐지 API를 BentoML로 거 간단히 배포해보자.

설치

BentoML은 python 3.6 이상 버전부터 지원한다.
환경이나 가상환경의 을 python 3.6 이상으로 맞추고 pip로 설치하자

$ pip install bentoml

모델 코드 생성

기존에 serving할 때 했던 모델을 가져오는 과정과 비슷하게 한다.

이제부터 쓰는 코드는 bento_service.py 하나에 다 씀

from models.experimental import attempt_load
from utils.torch_utils import select_device

if __name__ == "__main__":
    device = select_device('')
    model = attempt_load('park_best_ap50.pt', map_location=device)

Prediction Service Class 생성

Bento가 API를 packing할 때 필요한 Prediction Service Class를 만들어 준다.
이 클래스는 기본으로 BentoService를 상속하여 만들고 predict 메서드를 만들어주어야 한다.
만약 들어온 데이터에 대해 전처리, 후처리가 필요하다면 메서드를 추가해도 됨

from bentoml import env, artifacts, api, BentoService
from bentoml.adapters import ImageOutput, ImageInput
from bentoml.frameworks.pytorch import PytorchModelArtifact

@env(
    infer_pip_packages=True,
    setup_sh="""\
        #!/bin/bash
        set -e
        RUN apt-get install ffmpeg libsm6 libxext6  -y
    """
    )
@artifacts([PytorchModelArtifact('model')])
class PMDetector(BentoService):

    @api(input=ImageInput(), output=ImageOutput())
    def predict(self, image):
        image_bytes = image.read()
        pil_image = Image.open(io.BytesIO(image_bytes))
        image = ImageOps.exif_transpose(pil_image)
        result = ProcessImage(image, model, confidence_threshold=0.9, width=1280, height=960)
        converted_img = Image.fromarray(result)
        
        return converted_img

bento는 컨테이너 방식을 사용하는데 @env 데코레이터에다 의존성에 대한 것들을 지정해줄 수 있다.
infer_pip_packages=True 는 pip로 설치할 라이브러리들을 알아서 추론해서 만들라는 뜻이며
setup_sh 로 Dockerfile을 만들 때처럼 빌드 과정을 커스텀할 수 있다.
여기선 cv2가 ffmpeg를 설치하지 않으면 에러가 일어나기 때문에 ffmpeg를 설치하는 커맨드를 추가해주었다.

@artifacts 데코레이터는 서비스에서 사용할 artifact를 정의해 준다.
사용할 모델이 어떤 프레임워크에서 왔는지 지정해주는건가보다.

Prediction Service Packing

서비스 클래스를 만들었다면 packing하는 코드를 추가해주어야 한다.

bento_service = PMDetector()
bento_service.pack("model", model)
saved_path = bento_service.save()
print(saved_path)

여기까지 했으면 파일을 실행시켜 bento service를 만들면 된다.

$ python3 bento_service.py

모델에 필요한 라이브러리들이 설치되지 않은 환경이면 에러가 난다.

정상적으로 만들어졌으면 도커처럼 bentoml list로 만들어진 것들을 확인할 수 있다.

$ bentoml list

bento를 로컬에 serving

만들어진 bento는 아래 명령어로 바로 로컬에 serving할 수가 있다.

$ bentoml serve PMDetector:latest

하지만 아래와 같은 에러가 일어난다..

  File "/mnt/d/projectdocker/bentoml/venv/lib/python3.8/site-packages/bentoml/frameworks/pytorch.py", line 123, in load
    model = cloudpickle.load(open(self._file_path(path), 'rb'))
ModuleNotFoundError: No module named 'models.yolo'

bento의 PytorchModelArtifact가 yolor같은 복잡한 모델까지는 지원을 안 해서 일어나는 에러인가? 싶은데 좀 더 찾아봐야겠다.

profile
notion으로 이사갔어요

0개의 댓글