GitHub
MLOps 관련 코드 내용은 GitHub에서 관리하고 있습니다.
https://github.com/Seokii/Study-MLOps
PVC 정의와 PV 생성
# kserve-models-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: kserve-models-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
모델을 저장할 PV를 생성하는 PVC에 대한 CRD를 yaml 파일로 생성했습니다.
저장소의 이름은 metadata에서 kserve-models-pvc로 설정했고,
저장 용량은 1Gi로 설정했습니다.
kubectl apply -f kserve-models-pvc.yaml
yaml 파일을 적용하고, 쿠브플로우 대시보드의 Volumes에서 잘 적용된 것을 확인할 수 있습니다.
모델 학습 파일 작성하기
# sklearn_rf_iris.py
import argparse
import os
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from joblib import dump
def train():
parser = argparse.ArgumentParser()
parser.add_argument('--model_path', default='/mnt/pv/models/sklearn/iris', type=str)
args = parser.parse_args()erve-models-pvc
if not (os.path.isdir(args.model_path)):
os.makedirs(args.model_path)
model_file = os.path.join(args.model_path, 'model.joblib')
iris = datasets.load_iris()
X, y = iris.data, iris.target
rf_clf = RandomForestClassifier()
rf_clf.fit(X, y)
dump(rf_clf, model_file)
if __name__ == '__main__':
train()
사이킷런에서 iris 데이터셋을 받아와 랜덤포레스트로 학습 후 모델을 저장하는 코드를 작성했습니다.
Dockerfile
FROM python:3.8.5
RUN pip install scikit-learn==1.2.0 joblib
ADD sklearn_rf_iris.py /
도커파일을 작성했습니다.
kubeflow-fairing
import uuid
from kubeflow import fairing
from kubeflow.fairing.kubernetes import utils as k8s_utils
# docker hub username
CONTAINER_REGISTRY = 'seokii'
# namespace
namespace = 'kubeflow-user-example-com'
# job name 지정
job_name = f'sklearn-rf-iris-{uuid.uuid4().hex[:4]}'
# command 정의
command=["python", "sklearn_rf_iris.py", "--model_path", "/mnt/pv/models/sklearn/iris"]
# output_map 정의
output_map = {
"Dockerfile": "Dockerfile",
"sklearn_rf_iris.py": "sklearn_rf_iris.py"
}
# fairing 전처리기
fairing.config.set_preprocessor('python', command=command, path_prefix="/", output_map=output_map)
# cluster builder ContextSource를 minio로 정의
s3_endpoint = 'minio-service.kubeflow.svc.cluster.local:9000'
minio_endpoint = "http://"+s3_endpoint
minio_username = "minio"
minio_key = "minio123"
minio_region = "us-east-1"
# minio_context사용
from kubeflow.fairing.builders.cluster.minio_context import MinioContextSource
minio_context_source = MinioContextSource(endpoint_url=minio_endpoint, minio_secret=minio_username, minio_secret_key=minio_key, region_name=minio_region)
# fairing 빌더
fairing.config.set_builder('cluster', registry=CONTAINER_REGISTRY, image_name="sklearn_rf_iris", dockerfile_path="Dockerfile",
context_source=minio_context_source)
# fairing 배포
fairing.config.set_deployer('job', namespace=namespace, job_name=job_name,
pod_spec_mutators=[k8s_utils.mounting_pvc(pvc_name='kserve-models-pvc', pvc_mount_path='/mnt/pv')],
cleanup=False, stream_log=True)
fairing.config.run()
이전에 다루었던 개념인 페어링으로 코드를 작성했습니다.
쿠브플로우 주피터 노트북 서버에서 노트북으로 작성했습니다.
빌더는 cluster를 사용하고 context source로 minio를 정의했습니다.
코드를 실행 후, 모델은 생성했던 pvc에 저장하고 도커 이미지는 도커 허브에 업로드했습니다.
KServe CRD
apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
name: "sklearn-iris"
annotations:
sidecar.istio.io/inject: "false"
spec:
predictor:
sklearn:
storageUri: "pvc://kserve-models-pvc/models/sklearn/iris"
KServe로 등록하기 위한 CRD를 yaml 파일로 작성했습니다.
KServe의 InferenceService를 정의하는 코드입니다.
그 후, 명령어를 통해 배포 서비스를 등록합니다.
# 서비스 실행
kubectl -n kubeflow-user-example-com apply -f sklearn.yaml
# 확인
kubectl -n kubeflow-user-example-com get inferenceservice
sklearn-iris라는 이름으로 잘 등록되있는 것을 확인할 수 있습니다.
결과 값 예측하기(실패)
https://www.kubeflow.org/docs/external-add-ons/kserve/first_isvc_kserve/
https://kserve.github.io/website/0.9/get_started/first_isvc/#2-create-an-inferenceservice
쿠브플로우와 kserve 공식 문서에서의 방법도 시도해보고,
구글링을 검색되는 몇 블로그의 방법도 시도해봤는데,
예측을 받을 때, 404 error가 발생하거나 잘 진행이 되지 않았습니다.
구축 환경과 설정 문제가 존재하는 것 같아 Seldon Core로 시도해보려고 준비 중입니다.
배포는 되는데 값을 던져주고 받아오는게 되질 않아서 아쉽습니다.. ㅠㅠ
'MLOps' 카테고리의 다른 글
[MLOps] 쿠버네티스 프로메테우스&그라파나 설치하기 (0) | 2023.01.12 |
---|---|
[MLOps] Seldon Core 개념 이해 및 설치하기 (0) | 2023.01.12 |
[MLOps] 쿠브플로우 KServe 설치 및 알아보기 (0) | 2023.01.10 |
[MLOps] 쿠브플로우 카티브(Katib) 하이퍼파라미터 튜닝(2) (0) | 2023.01.10 |
[MLOps] 쿠브플로우 카티브(Katib) 하이퍼파라미터 튜닝(1) (0) | 2023.01.09 |
댓글