[!NOTE]
이 문서는 KServe v0.7을 기준으로 작성되었습니다.
이번글에서는 SKLearn 모델을 학습하고 KServe의 InferenceService로 배포해보겠습니다.
모델 학습, 로컬 테스트, Inferece Serivce 배포 순서로 진행합니다.
모델 학습과 로컬 배포테스트는 건너 뛰셔도 무방합니다.
모델 학습하기
학습할 모델은 머신러닝에서 매우 유명한 Iris 데이터셋, 붓꽃 종 분류 문제를 해결하는 모델입니다.
다음 코드를 수행해서 모델을 학습하고 'model.joblib'으로 학습한 모델을 저장합니다.
from sklearn import svm
from sklearn import datasets
from joblib import dump
iris = datasets.load_iris()
X, y = iris.data, iris.target
clf = svm.SVC(gamma='scale')
clf.fit(X, y)
dump(clf, 'model.joblib')
로컬 테스트
학습후 모델을 Serialize하여 model.joblib
으로 저장하셨다면, MLServer를 이용해서 로컬 서버를 실행시킵니다.
MLServer에 대해 더 알고싶다면, SKLearn example doc을 참고하세요.
사전 작업
MLServer를 로컬에서 사용하기위해서 mlserver
파이썬 패키지와 SKLearn runtime이 설치되어있어야 합니다.
pip install mlserver mlserver-sklearn
모델 설정
다음으로 MLServer가 사용할 모델에 관한 몇가지 설정을 지정합니다.
- 모델을 서빙할 inference runtime (예:
mlserver_sklearn.SKLearnModel
) - 모델의 이름과 버전
위 설정은 환경변수나 다음과 같은 형태의 model-settings.json
을 통해 지정합니다.
{
"name": "sklearn-iris",
"version": "v1.0.0",
"implementation": "mlserver_sklearn.SKLearnModel"
}
모델을 배포할 때 Kserve는 추가 구성 없이 즉시 실행되도록 하기위해 일부 적절한 기본값을 사용합니다. 이러한 기본값은 model-settings.json
에 지정하여서 override 할 수 있습니다. 여러가지 모델을 한번에 배포할 수도있는데 여러개의 model-settings.json
을 지정할 수도 있습니다.
로컬에서 모델 서빙하기
mlserver
패키지가 설치되었고, model-settings.json
파일을 작성했다면 모델을 서빙할 준비가 되었습니다!
다음 명령으로 서빙을 실행합니다.
mlserver start .
InferenceService 배포하기
로컬에서 배포 테스트를 해보았으니, 본격적으로 InferenceService로 배포를 시작하겠습니다.
이번 글에서는 신규 스펙인 V2 Data Plane을 사용하겠습니다. 이를 위해서 v1beta1
버전의 InferenceService
CRD 가 필요합니다.
다음과 같이 InferenceService 배포용 yaml 파일을 작성합니다.
# filename: sklearn.yaml
apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
name: "sklearn-irisv2"
spec:
predictor:
sklearn:
protocolVersion: "v2"
storageUri: "gs://seldon-models/sklearn/iris"
이 배포 yaml 에는 다음 사항들이 미리 되어 있다고 가정합니다.
- 모델 가중치 파일이 이미 모델 레포지터리(이 예제에서는 GSC)에 업로드 되어 있고
gs://seldon-models/sklearn/iris
처럼 외부에서 접근이 가능합니다. - Kubernetes 클러스터가 구성되어 있으며,
kubectl
로 접근이 가능합니다. - KServe가 클러스터에 설치 되어 있습니다.
다음 명령어로 배포합니다.
kubectl apply -f ./sklearn.yaml
배포 모델 테스트하기
배포가 성공적으로 완료되면 샘플 요청을 보내 테스트를 수행합니다.
V2 Data Plane을 따라서 샘플 요청을 생성해야 합니다. 다음과 같이 구성할 수 있습니다.
{
"inputs": [
{
"name": "input-0",
"shape": [2, 4],
"datatype": "FP32",
"data": [
[6.8, 2.8, 4.8, 1.4],
[6.0, 3.4, 4.5, 1.6]
]
}
]
}
위 파일을 iris-input.json
으로 저장합니다.
이제 ${INGRESS_HOST}:${INGRESS_PORT}
로 ingress에 접근이 가능하다고 가정합니다. 이 명령어를 통해 Ingress의 IP와 Port를 확인할 수 있습니다.
curl
명령어를 이용해서 요청을 보냅니다.
SERVICE_HOSTNAME=$(kubectl get inferenceservice sklearn-irisv2 -o jsonpath='{.status.url}' | cut -d "/" -f 3)
curl -v \
-H "Host: ${SERVICE_HOSTNAME}" \
-d @./iris-input.json \
http://${INGRESS_HOST}:${INGRESS_PORT}/v2/models/sklearn-irisv2/infer
응답예시:
{
"id": "823248cc-d770-4a51-9606-16803395569c",
"model_name": "iris-classifier",
"model_version": "v1.0.0",
"outputs": [
{
"data": [1, 2],
"datatype": "FP32",
"name": "predict",
"parameters": null,
"shape": [2]
}
]
}
Reference
[0] : KServe SKLearn 모델 배포하기, https://kserve.github.io/website/0.7/modelserving/v1beta1/sklearn/v2/
'개발 > MLOps' 카테고리의 다른 글
020. [Kubeflow][KServe] 인증문제 해결하기 (Istio-Dex) (1) | 2022.09.21 |
---|---|
019. [Kubeflow][KServe] InferenceService 처음 배포하기! (1) | 2022.09.19 |
017. [Kubeflow][KServe] Model Serving Control Plane (2) | 2022.09.15 |
016. [Kubeflow][KServe] Model Serving Data Plane (0) | 2022.09.14 |
015. [Kubeflow][KServe] Could not find CSRF cookie XSRF-TOKEN in the request 문제 해결 (0) | 2022.07.14 |