00. 이 글을 시작한 이유
최근 모델 배포와 관련해 BentoML을 적용 테스트하며 느낀 장단점 및 이를 보완하기 위한 코드를 정리해놓는다. 일단 BentoML의 경우, 커뮤니티가 구글이나 일반적인 블로그가 아닌 Slack을 통해 형성되어 있다.
이로 인해 접근성이 떨어지고, 자연히 유저들의 문제와 그걸 풀어주는 다른 유저들의 데이터가 엄청나게 적다.
게다가 버전이 업데이트되면서 내부 라이브러리 구조가 바뀌고(app, artifact 등), 이를 이후의 버전에 적용하기 어려워지면서 문제가 심화된다.
결국 최신 버전의 BentoML을 쓰려면 운영자에게 직접 물어봐야하는 상태(근데 그걸 또 잘 답해준다?!).
01. BentoML Start
BentoML에 대한 소개나 용어 정리는 따로 하지 않는다. 만약 필요하게 되면 각 단계마다 이뤄질 것이고, 애초에 그런 원론적인 것들을 정리하기 위한 글이 아니다.
빠르게 기본적인 예제 코드 먼저 진행해보자.
참고로 해당 코드들은 빠른 복습/실습을 위해 모두 sklearn / xgboost로만 진행한다.
02. BentoML Install
우선 첫 단계는 설치부터 진행한다.
최신 버전(현재 1.0)의 경우, 뒤에 '--pre'를 붙여 라이브러리를 설치해야 하며, 이는 정식 버전이 아닌 베타 버전임을 의미한다(때문에 공식 문서나 튜토리얼도 아직 부정확하다). 부디 하루빨리 1점대 버전이 정식 버전이 되길 기원한다.
또한 1.x 대 버전과 그 이전의 하위 모듈이 굉장히 달라, 만약 이후 진행되는 코드가 정상적으로 실행되지 않는다면 BentoML의 버전 차이로 인한 문제일 확률이 높다.
아래와 같이 bentoml의 1점대 버전을 설치해준다.
pip install bentoml --pre
03. git clone
BentoML 서버는 Window 환경에서는 정상적으로 작동하지 않는다. 때문에 Window 환경일 경우엔, WSL 등을 통한 Linux 환경에서 작업해야 한다.
예제 코드 등을 업로드해놓은 github를 clone한다.
git clone git@github.com:leadbreak/bentoml.git
내부 폴더명을 통해 짐작할 수 있듯, 이번 포스팅은 단계별로 이뤄질 것이다.
우선 이번 단계에서는 기초적인 BentoML 사용을 위해 STEP 01 폴더로 들어가 진행한다.
04. TUTORIAL
STEP01 폴더 안에 들어가보면 tutorial.ipynb라는 이름의 파일이 존재한다.
이를 통해 모델 학습 후 로컬로 불러오는 법과 서버를 통해 서빙하는 법을 간단히 배울 것이고,
이후의 포스팅을 통해 predict 외의 function(예컨데 predict_proba)을 가지도록 저장하는 법, pandas 데이터 형태로 input을 주는 법, async 라이브러리를 활용한 비동기 방식의 처리 방식에 대해 다룰 것이다.
우선 tutorial.ipynb 파일을 통해 순차적으로 진행해보자.
우선 첫 번째는 경로 설정이다. 이를 설정해주지 않으면 '~'로 설정된 기본경로에 bentoml 폴더가 생성되며 그 아래에 model, repository, log 등이 저장된다.
제일 먼저 진행할 것은 당연히 모델 학습이다. 위와 같은 코드를 통해 모델을 학습시킨다.
그리고 위와 같이 저장한다.
보통 sklearn 라이브러리를 이용해 학습시킨 모델의 경우, pickle을 이용한 방식이 일반적인데 위의 짧은 코드만으로 쉽고 빠르게 모델을 저장할 수 있다.
저장의 결과로 출력되는 것은 모델명과 자동으로 생성된 태그값, 그리고 해당 모델이 저장되어있는 경로이다.
해당 경로에는 다음과 같이 container화를 위한 yaml파일과 학습된 모델이 pickle로 저장되어 있음을 확인할 수 있다.
이렇게 학습한 모델들은 다음과 같이 간단한 CLI 명령어로도 확인/출력/삭제가 가능하다.
학습된 모델 확인 | bentoml models list |
학습된 모델 출력 | bentoml models get iris_clf:latest |
학습된 모델 삭제 | (특정 태그 모델의 경우) : bentoml models delete iris_clf:latest (특정 모델명을 전부 삭제할 경우) : bentoml models delete iris_clf -y |
이렇게 학습시킨 모델을 불러와 사용하는 경우, 크게 두 가지 방법이 있는데 하나는 로컬에서 실행시켜 마치 pickle을 읽어오듯 사용하는 방식이고, 다른 하나는 server를 통해 serving함으로써 api화하는 것이다.
두 방법의 성능차이는 없고 일반적으로 전자는 모델 개발 및 테스트 과정에서 , 후자는 정식 서빙에 사용된다고 한다.
우선 로컬에서 실행시키는 방식이다.
위의 코드를 보면 bentoml의 get 메서드를 사용해 특정 모델을 불러온 다음, 이를 Runner라는 bentoml만의 객체로 변환한다.
Runner 객체로 변환된 모델은 서비스화가 가능해진 상태이며, 아래와 같이 기본적으로 지정된 predict 메서드를 run 명령어를 통해 수행할 수 있다.
참고로 이런 식으로 저장해 사용할 수 있는 것은 단순히 ML 모델뿐 아니라 스케일러 등도 가능하나, transform을 사용하기 위해 저장하는 방식이 조금 달라져야 한다. 그에 대해선 다음 포스팅에서 다루겠다.
두 번째로는 Service화하는 방식으로 모델 개발이 완료되면 정식으로 api화하는 단계이다.
이때에는 입력값과 출력값의 타입을 bentoml.io 내부의 데이터 타입으로 지정해줘야 하며, 개발자가 자체적으로 만든 전처리 클래스를 지정해줄 수도 있다.
위 코드를 통해 해당 셀 안의 코드가 담긴 service.py 파일이 생성될텐데, 이를 별도의 CLI 등을 통해 다음과 같이 실행하면 된다.
이렇게 실행하고 나면 localhost:3000 안에서 해당 모델이 배포된 상태를 확인할 수 있으며, CLI의 curl 명령어나 python의 requests로 데이터와 추론값을 주고받을 수 있게 된다.
참고로 저 위의 명령어 마지막에 붙은 --reload는 만일 service.py 파일 내부에 수정 사항 등이 생기면 자동으로 업데이트해서 서비스를 재시작하게 한다.
서비스를 시작해놓으면 위와 같이 requests를 통해 추론값을 주고 받을 수 있으며 아래와 같이 curl 명령어를 통해서도 가능하다.
다만 데이터가 위와 같이 단건이 아니고, 데이터 프레임처럼 여러 rows의 데이터를 가지고 있거나 혹은 칼럼 명 등이 있을 때에는 조금 다른 방식을 사용해야 한다.
'DATA SCIENCE > Study' 카테고리의 다른 글
Inductive Bias에 관하여... (0) | 2022.11.29 |
---|---|
[Computer Vision] CNN vs ViT (0) | 2022.11.18 |
Docker : npm install error (0) | 2022.05.02 |
WSL에서 Docker 사용 (0) | 2022.05.01 |
PYTHON Interface Option : argv와 flags, 그리고 argparse (0) | 2022.03.08 |