KServe는 LLM 모델부터 예측형 ML 모델까지 Kubernetes 환경에 쉽게 배포시켜주는 리소스입니다. MLOps에 빠지지 않는 툴이기 때문에 지난 2회에 걸쳐 아티클로 다뤘는데요.

이제 KServe의 핵심인 InferenceService 리소스를 직접 배포하고 ML 모델 추론 테스트까지 해보겠습니다.

이번 실습은 지난 아티클에서 다뤘던 KServe 배포가 완료된 상태에서 이어집니다.

아직 KServe를 Kubernetes 환경에서 배포해본 경험이 없으시다면 지난 실습 가이드를 꼭 확인해주세요! 막히거나 어렵지 않게 KServe를 무사히 배포할 수 있도록 몇 번이고 테스트한 가이드랍니다..!


KServe로 공개된 모델 바로 배포해보기

그럼 KServe 공식 문서의 예측형 ML 모델 InferenceService 예제를 빠르게 같이 살펴보고 배포해보겠습니다.

apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
  name: "sklearn-iris"
  namespace: kserve-test # InferenceService 리소스가 배포될 네임스페이스
spec:
  predictor: # 모델 서빙을 위한 필드
    model:
      modelFormat:
        name: sklearn # KServe Runtime 조회 시 출력되는 MODELTYPE
      storageUri: "gs://kfserving-examples/models/sklearn/1.0/model" # 서빙할 모델의 URI
      resources: # InferenceService 리소스가 사용할 CPU 및 메모리 
        requests:
          cpu: "100m"
          memory: "512Mi"
        limits:
          cpu: "1"
          memory: "1Gi"

Google 클라우드 스토리지(gs)에 저장된 KServe의 Scikit-Learn 예제 모델(붓꽃 예측)을 서빙하는 간단한 구성입니다.

spec 필드 바로 아래에 있는 predictor 필드는 모델 서빙에 필요한 정보를 넣는 곳인데요.

predictor 필드와 동일한 레벨에는 transformer 또는 explainer 필드를 선택적으로 추가할 수 있습니다.

  • transformer:
    • 들어오는 입력 데이터를 특정하게 가공 후 ML 모델에게 전달
    • ML 모델의 예측 결과값을 특정하게 가공 후 사용자에게 반환
  • explainer:
    • 모델이 왜 이런 예측을 했는지 참조할 수 있는 데이터 제공.
    • Alibi 및 TrustyAI 라이브러리 지원

InferenceService를 배포하기 전에 kserve-test 네임스페이스를 먼저 생성합니다.

kubectl create ns kserve-test

그리고 위 매니페스트로 InferenceService를 배포하는데요. 테스트용으로 배포할 것이기 때문에 저는 kubectl apply 명령어에 인풋으로 넣어 실행하겠습니다.

kubectl apply -n kserve-test -f - <<EOF
apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
  name: "sklearn-iris"
  namespace: kserve-test
spec:
  predictor:
    model:
      modelFormat:
        name: sklearn
      storageUri: "gs://kfserving-examples/models/sklearn/1.0/model"
      resources:
        requests:
          cpu: "100m"
          memory: "512Mi"
        limits:
          cpu: "1"
          memory: "1Gi"
EOF

InferenceService 리소스가 배포되면 아래 명령어로 상태를 확인합니다.

kubectl -n kserve-test get inferenceservice

READY 값이 True라면 우리의 InferenceService가 정상 배포된 것입니다. NAMEURL 값은 추론 서버로 요청을 보낼 때 필요하니 기억하세요.

이제 추론 요청을 보내보겠습니다. curl 명령어로 요청을 보낼 건데요. 명령어 구성은 아래와 같습니다.

curl -v "http://{KServe의 로드밸런서 IP}/v1/models/{InferenceService 이름}:predict" \
  -H "Host: {'http://'를 제외한 InferenceService의 URL}" \
  -H "Content-Type: application/json" \
  -d '{ "instances": [[6.8, 2.8, 4.8, 1.4]] }'

실습 환경 OS에 따라 curl 명령어 입력은 두 가지 방식으로 갈립니다.

Linux 환경

Docker 엔진을 직접 사용하는 Linux는 로드밸런서의 IP를 바로 사용해서 접근 가능합니다.

아래 curl 명령어로 우리가 배포한 예제 ML 모델에 추론 요청을 해보겠습니다. 마지막의 요청 데이터(-d)는 ML 모델에 추론을 부탁할 입력 데이터 예시입니다.

curl -v "http://{KServe의 로드밸런서 IP}/v1/models/sklearn-iris:predict" \
  -H "Host: sklearn-iris-kserve-test.example.com" \
  -H "Content-Type: application/json" \
  -d '{ "instances": [[6.8, 2.8, 4.8, 1.4]] }'

그럼 이렇게 터미널에 InferenceService가 요청받은 데이터로 ML 모델이 예측을 하고, 그 결과값("predictions": [1])이 출력됩니다!

Windows/macOS 환경

Windows나 macOS는 Docker Desktop을 통해 가상환경 안에서 Docker 컨테이너를 돌리기 때문에 Kind 클러스터 Config에서 지정한 extraPortMappings 설정에 따라 클러스터 노드에 localhost:8080로 접근 가능합니다.

다만, 우리가 배포한 KServe의 Gateway는 로드밸런서만 바라보고 있기 때문에 kubectl -n envoy-gateway-system port-forward svc/{KServe의 Gateway Service 이름} 8080:80 명령어로 포트포워딩을 해줘야 로컬 환경에서 InferenceService에 접근할 수 있습니다. 해당 명령어는 별도의 터미널 창에서 실행해주세요.

이제 아래 curl 명령어로 우리가 배포한 예제 ML 모델에 추론 요청을 해보겠습니다. 마지막의 요청 데이터(-d)는 ML 모델에 추론을 부탁할 입력 데이터입니다.

curl.exe -v "http://localhost:8080/v1/models/sklearn-iris:predict" -H "Host: sklearn-iris-kserve-test.example.com" -H "Content-Type: application/json" -d '{\"instances\":[[6.8, 2.8, 4.8, 1.4]]}'

저는 Windows PowerShell로 위 명령어를 실행했는데, ML 모델로부터 예측값("predictions": [1])이 잘 반환되네요!

이렇게 HTTP POST 요청으로 InferenceService의 ML 모델에 추론 데이터를 보내고 예측값을 받을 수 있음을 확인했습니다.

지금은 KServe의 Gateway가 HTTP만 지원하도록 설정되었기 때문에 조직 내에서, 또는 로컬 환경에서만 사용하는 것을 권장드립니다.

만약 아래 요소가 곁들여진다면 HTTPS를 통해 안전한 외부 통신도 가능한데요.

  • 소유 중인 도메인 주소
  • Let’s Encrypt 등의 공인 인증기관과 연동되는 ClusterIssuer 리소스 생성
  • KServe의 Gateway 리소스에 443 포트 및 인증서 설정 추가

외부에서도 안전하게 ML 모델에 접근할 수 있다는 것은, 다른 웹/모바일 애플리케이션과 연동되어 AI 예측 시스템을 구축할 수 있다는 뜻입니다.


마무리

이번 실습 아티클에서 여러분은…

  • KServe InferenceService의 기본 구성을 이해하고
  • 로컬 Kubernetes 환경에 InferenceService를 직접 배포했으며
  • curl 명령어로 HTTP POST 요청을 보내 InferenceService의 ML 모델에 추론을 요청하고 결과값을 받았습니다.

지금까지 KServe를 통해 모델 추론 서버(InferenceService)를 배포한 전 과정이 MLOps에서 ML 모델 배포 및 서빙의 기본이라고 할 수 있겠습니다.

앞으로 KServe의 고급 기능을 학습하고 활용하실 때 지금까지 함께 공부한 내용들이 든든한 뒷받침이 되어줄 것이라 믿습니다.

총 3편에 걸쳐 KServe 기본편 시리즈를 함께해주셔서 감사합니다.

저는 다음 아티클에서 더 유익하고 흥미로운 주제 가지고 돌아오겠습니다.

오늘도 행복한 하루 되세요😸


함께 읽어보면 좋은 아티클