KFServing – SDK를 사용하여 InferenceService 배포하기

지금까지는 쿠버네티스 리소스 매니페스트인 YAML 파일을 이용하여 InferenceService 를 생성하였습니다. 이번에는 KFServing SDK의 client 라이브러리를 이용하여, 파이썬 코드에서 InferenceService 를 생성해 보겠습니다. 편의를 위해서 주피터 노트북에서 예제를 실행하겠습니다.

Kubeflow의 주피터 노트북 서버에 접속해서 노트북을 하나 생성합니다.

KFServing SDK 설치하기

만약 주피터 노트북 서버에 KFServing SDK가 설치되어 있지 않다면, pip를 이용하여 설치합니다. 주피터 노트북 서버에서 터미널을 하나 생성해서 다음 명령어를 실행합니다.

pip install kfserving --user

KFServing SDK 를 사용하여 InferenceService 생성하기

사용할 패키지를 추가 합니다.

In [ ] :

from kubernetes import client

from kfserving import KFServingClient
from kfserving import constants
from kfserving import utils
from kfserving import V1alpha2EndpointSpec
from kfserving import V1alpha2PredictorSpec
from kfserving import V1alpha2TensorflowSpec
from kfserving import V1alpha2InferenceServiceSpec
from kfserving import V1alpha2InferenceService
from kubernetes.client import V1ResourceRequirements

InferenceService를 배포 할 네임스페이스를 정의합니다. SDK 에 있는 utils 함수를 이용하면, 현재 실행중인 노트북의 네임 스페이스 이름을 가져올 수 있습니다. 다른 네임스페이스를 사용하고 싶으면 직접 명시하면 됩니다.

In [ ] :

namespace = utils.get_default_target_namespace()
print('namespace : {}'.format(namespace))

InferenceService 정의하기

V1alpha2EndpointSpec 를 이용하여 기본 엔드포인트 스펙을 정의합니다. 그리고 V1alpha2InferenceService를 이용하여 추론 서비스를 정의합니다. 추론 서비스를 정의할 때 앞서 정의한 기본 엔드포인트 스펙을 파라미터로 추가합니다.

In [ ] :

api_version = constants.KFSERVING_GROUP + '/' + constants.KFSERVING_VERSION
default_endpoint_spec = V1alpha2EndpointSpec(
                          predictor=V1alpha2PredictorSpec(
                            tensorflow=V1alpha2TensorflowSpec(
                              storage_uri='gs://kfserving-samples/models/tensorflow/flowers',
                              resources=V1ResourceRequirements(
                                  requests={'cpu':'100m','memory':'1Gi'},
                                  limits={'cpu':'100m', 'memory':'1Gi'}))))
    
isvc = V1alpha2InferenceService(api_version=api_version,
                          kind=constants.KFSERVING_KIND,
                          metadata=client.V1ObjectMeta(
                              name='flower-sample', namespace=namespace),
                          spec=V1alpha2InferenceServiceSpec(default=default_endpoint_spec))

InferenceService 생성하기

KFServingClient를 호출하여 InferenceService를 작성합니다.

In [ ] :

KFServing = KFServingClient()
KFServing.create(isvc)

InferenceService 조회하기

KFServingClient의 get() 메소드를 호출하여, 생성한 InferenceService를 조회합니다.

In [ ] :

KFServing.get('flower-sample', namespace=namespace, watch=True, timeout_seconds=120)

InferenceService에 카나리아 추가하기

카나리아 엔드포인트 스펙을 정의한 다음, 10% 의 트래픽을 카나리아 버전으로 롤아웃합니다.

In [ ] :

canary_endpoint_spec = V1alpha2EndpointSpec(
                         predictor=V1alpha2PredictorSpec(
                           tensorflow=V1alpha2TensorflowSpec(
                             storage_uri='gs://kfserving-samples/models/tensorflow/flowers-2',
                             resources=V1ResourceRequirements(
                                 requests={'cpu':'100m','memory':'1Gi'},
                                 limits={'cpu':'100m', 'memory':'1Gi'}))))

KFServing.rollout_canary('flower-sample', canary=canary_endpoint_spec, percent=10,
                         namespace=namespace, watch=True, timeout_seconds=120)

InferenceService의 카나리아로 더 많은 트래픽 롤아웃

카나리아 버전의 트래픽을 50 %까지 증가시킵니다.

In [ ] :

KFServing.rollout_canary('flower-sample', percent=50, namespace=namespace,
                         watch=True, timeout_seconds=120)

카나리아를 기본으로 승격하기

카나리아 버전을 기본 버전, 즉 기본 엔드포인트로 승격 시킵니다.

In [ ] :

KFServing.promote('flower-sample', namespace=namespace, watch=True, timeout_seconds=120)

InferenceService 를 삭제합니다.

사용한 InferenceService를 삭제합니다.

In [ ] :

KFServing.delete('flower-sample', namespace=namespace)

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다