KFServing InferenceService 배포와 예측 – NVIDIA Triton Inference Server

Triton은 이전에 TensorRT Inference Server로 알려져 있습니다.

이번에는 모델을 직접 생성하지 않고, 기존에 만들어진 모델을 사용하겠습니다.

TensorRT을 사용하는 InferenceService 로 예측 하기

InferenceService 생성

InferenceService 매니페스트를 작성합니다. predictor로 tensorrt 를 사용합니다. storageUri 필드로 모델 저장 위치를 지정해 줍니다.

tensorrt.yaml

apiVersion: "serving.kubeflow.org/v1alpha2"
kind: "InferenceService"
metadata:
  name: "tensorrt-simple-string"
spec:
  default:
    predictor:
      tensorrt:
        storageUri: "gs://kfserving-samples/models/tensorrt"

InferenceService 를 생성합니다.

다음은 admin 네임스페이스 InferenceService 를 생성하는 예제입니다.

kubectl -n admin apply -f tensorrt.yaml

생성한 InferenceService를 조회해 보겠습니다.

kubectl -n admin get inferenceservice

InferenceService 가 정상적으로 생성되면 다음과 같은 응답 결과를 확인할 수 있습니다.

NAME                     URL                                                                                READY   DEFAULT TRAFFIC   CANARY TRAFFIC   AGE
tensorrt-simple-string   <http://tensorrt-simple-string.admin.example.com/v1/models/tensorrt-simple-string>   True    100                                33s

예측 실행하기

예측을 요청하기 위해서는 모델 서버에 접근해야 합니다. 모델 서버는 ingressgateway 를 통해서 접근할 수 있습니다. ingressgateway 는 모델 서버들을 구분하기 위해서 호스트 이름을 사용합니다. ingressgateway에 접근하 기 위한 주소는 앞서 정의한 CLUSTER_IP 를 사용하겠습니다.

https://docs.nvidia.com/deeplearning/sdk/tensorrt-inference-server-guide/docs/client.html#section-client-api 에 나와 있는 클라이언트를 사용해서 요청을 하겠습니다. tensorrtserver_client 컨테이너를 실행시킨 후, 컨테이너 안에서 클라이언트는 사용합니다. 그래서 컨테이너 안에서 CLUSTER_IP 로 접근이 가능해야 합니다.

/etc/hosts 파일을 편집해서 CLUSTER_IP 를 tensorrt-simple-string.admin.example.com 과 맵핑시킵니다.

클라이언트를 사용하기 위해서, 컨테이너를 실행시킵니다.

docker run -it --rm --net=host kcorer/tensorrtserver_client:19.05

컨테이너 안에서 다음 명령어를 실행시킵니다.

root@trantor:/workspace# ./build/simple_string_client -u tensorrt-simple-string.admin.example.com

정상적으로 실행되면 다음과 같은 응답 결과를 확인 할 수 있습니다.

0 + 1 = 1
0 - 1 = -1
1 + 1 = 2
1 - 1 = 0
2 + 1 = 3
2 - 1 = 1
3 + 1 = 4
3 - 1 = 2
4 + 1 = 5
4 - 1 = 3
5 + 1 = 6
5 - 1 = 4
6 + 1 = 7
6 - 1 = 5
7 + 1 = 8
7 - 1 = 6
8 + 1 = 9
8 - 1 = 7
9 + 1 = 10
9 - 1 = 8

“KFServing InferenceService 배포와 예측 – NVIDIA Triton Inference Server”에 대한 6개의 댓글

  1. 안녕하세요. 올려주신 좋은글 잘보고 있습니다.
    다름이아니라
    /etc/hosts 파일을 편집해서 CLUSTER_IP 를 tensorrt-simple-string.default.example.com 과 맵핑시킵니다.
    –> 여기서 노드포트를 사용한다면 어떻게 매핑시켜줘야할까요?

    1. 노드포트를 사용하신다면, 쿠버네티스 노드들 중에서, 마음에 드는 노드의 IP를 hosts 파일에 추가하시면 됩니다.
      그러면 등록하신 도메인명:노드포트번호 로 접근하실 수 있어요.

  2. 안녕하세요 KFServing을 테스트하는데 블로그가 많은 도움이 되고 있습니다.
    위 예제로 triton server를 돌려보고자 하는데 추론단계에서 에러가 발생하여 혹시 해결방법을 아시나 해서 댓글 남깁니다.

    저는 KFServing 0.2.2 버전을 사용하고 있으며 client container에서 ./build/simple_string_client를 실행했을 때 아래와 같은 에러가 발생합니다.
    error: unable to create inference context: [ 0] INTERNAL – status request did not return status

    client 프로그램 내부의 status request에 대한 응답이 오지 않아 에러를 발생시키는 것 같아서 virtual service를 확인해보니 /v1/models/tensorrt-simple-string:predict 이렇게 된 request만 routing이 되고 있는 것 같았습니다.

    그래서 위 predict request를 curl로 날려보았는데 400 bad request가 응답으로 옵니다. 입력한 curl 명령어는 아래와 같습니다.
    curl -v -H “Host: tensorrt-simple-string.default.example.com” http://<>/v1/models/tensorrt-simple-string:predict -d ‘{ “instances”: [ { “INPUT0”: [], “INPUT1”: [] } ] }’

    혹시 어떻게 해결하는지 아신다면 답글 부탁드립니다.

    1. 일단 오타가 있었네요. 죄송합니다.
      예제에서는 admin 네임스페이스에 설치하였기 때문에, 주소가 tensorrt-simple-string.admin.example.com 이 맞습니다.
      주소를 한번 확인해 주시기 바랍니다.
      그리고 ingress-gateway 서비스가 노드포트로 열려있다면, client에서 주소입력할때, 해당 노드포트도 같이 입력해보세요.

      1. 답변 감사합니다.
        하지만 default는 제가 그냥 적은 것이고 실제로는 inference service가 뜬 namespace를 명시했으며
        ingress-gateway도 load balancer입니다.

  3. kfserving triton documentation을 보고 진행하다가 에러에 막혀서 .. 방법을 찾아 헤매다가 이 블로그 까지 왔습니다..

    호출시 이런 에러를 만나는데 원인을 모르겠네요..
    rapidjson.JSONDecodeError: Parse error at offset 0: The document is empty.

    혹시 답을 알고 계시다면 알려주신다면 정말 감사하겠습니다.

댓글 남기기

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