[C#] Tensorflow Serving C# gRPC Model Status 체크

참고


개요

  • Tensorflow Serving 에서 현재 Model이 Loading 되어 있는지에 대한 여부를 알기 위해 C# 으로 gRPC 클라이언트 프로그램을 만든 후, Tensorflow Serving 에서 Model Status 요청 후 상태 체크 되는지 PoC 진행 합니다.

Tensorflow Serving 프로토콜 버퍼 확인

  • 실제 Tensorflow Serving 에서 Model 상태 체크를 할 수 있는지, 우선 Proto 버퍼를 확인해 보았습니다.
  • 확인 결과, get_model_status.proto 에서 현재 model 상태를 체크하는 내용이 있는 것을 확인하였습니다.
syntax = "proto3";

package tensorflow.serving;

import "tensorflow_serving/apis/model.proto";
import "tensorflow_serving/apis/status.proto";

option cc_enable_arenas = true;

// GetModelStatusRequest contains a ModelSpec indicating the model for which
// to get status.
message GetModelStatusRequest {
  // Model Specification. If version is not specified, information about all
  // versions of the model will be returned. If a version is specified, the
  // status of only that version will be returned.
  ModelSpec model_spec = 1;
}

// Version number, state, and status for a single version of a model.
message ModelVersionStatus {
  // Model version.
  int64 version = 1;

  // States that map to ManagerState enum in
  // tensorflow_serving/core/servable_state.h
  enum State {
    // Default value.
    UNKNOWN = 0;

    // The manager is tracking this servable, but has not initiated any action
    // pertaining to it.
    START = 10;

    // The manager has decided to load this servable. In particular, checks
    // around resource availability and other aspects have passed, and the
    // manager is about to invoke the loader's Load() method.
    LOADING = 20;

    // The manager has successfully loaded this servable and made it available
    // for serving (i.e. GetServableHandle(id) will succeed). To avoid races,
    // this state is not reported until *after* the servable is made
    // available.
    AVAILABLE = 30;

    // The manager has decided to make this servable unavailable, and unload
    // it. To avoid races, this state is reported *before* the servable is
    // made unavailable.
    UNLOADING = 40;

    // This servable has reached the end of its journey in the manager. Either
    // it loaded and ultimately unloaded successfully, or it hit an error at
    // some point in its lifecycle.
    END = 50;
  }

  // Model state.
  State state = 2;

  // Model status.
  StatusProto status = 3;
}

// Response for ModelStatusRequest on successful run.
message GetModelStatusResponse {
  // Version number and status information for applicable model version(s).
  repeated ModelVersionStatus model_version_status = 1
      [json_name = "model_version_status"];
}
  • 위 내용을 토대로 C# gRPC Client 프로그램을 생성 후, 실제로 TF Serving 에게 위 내용을 요청하여 응답이 정상적으로 오는지 테스트 진행 합니다.

Tensorflow Serving 컨테이너 실행

  • 우선 Tensorflow Serving 서버 컨테이너가 실행되어 있어야 합니다.
  • Tensorflow Serving 컨테이너 실행하는 Docker 명령어는 다음과 같습니다.
> docker run -t --rm --name=tf-serving -p 8500:8500 -p 8501:8501 -v "C:/ADC45_PythonAPI/adc45_edge/src/test_data/save_model/tensorflow/:/models/model" tensorflow/serving --model_name=model --model_config_file=/models/model/Config/models.config --model_config_file_poll_wait_seconds=60

Tensorflow Serving 컨테이너 실행 확인

  • 다음과 같이 현재 Tensorflow Serving 컨테이너가 정상적으로 실행되어 있는 것을 볼 수 있습니다.


Tensorflow Serving 컨테이너 Model 정보

  • 현재 Tensorflow Serving 컨테이너 실행 시, models.config 에 Loading 대상인 모델 정보들을 설정해 두었습니다.
model_config_list {
  config {
    name: "inception_v1"
    base_path: "/models/model/inception_v1/"
    model_platform: "tensorflow"
  }
  config {
    name: "xception"
    base_path: "/models/model/xception/"
    model_platform: "tensorflow"
  }
  config {
    name: "vgg_19"
    base_path: "/models/model/vgg_19/"
    model_platform: "tensorflow"
  }
  config {
    name: "efficientnet_v2_m"
    base_path: "/models/model/efficientnet_v2_m/"
    model_platform: "tensorflow"
  }
  config {
    name: "inception_v3"
    base_path: "/models/model/inception_v3/"
    model_platform: "tensorflow"
  }
}
  • 위 처럼 설정을 해 두면, Tensorflow Serving 에서는 설정 주기대로 inception_v1, xception, vgg_19, efficientnet_v2_m, inception_v3 5개의 모델이 주기적으로 Loading 됩니다.

C# gRPC Clinet 코드 작성

  • 이제 Tensorflow Serving 서버가 실행되어 있으니, 서버에게 모델 상태를 요청할 gRPC 클라이언트 프로그램을 만들어야 합니다.

  • 프로그램은 C# 콘솔 프로젝트를 통해 생성합니다.

  • 기본 콜솔 프로그램을 생성 후, 다음 3가지 NuGet Package 를 설치 진행해야 합니다.

    • Google.Protobuf
    • Grpc.Net.Client
    • Grpc.Tools
  • 그리고, 아래와 같이 C# gRPC 클라이언트 코드를 작성합니다.

using Grpc.Core;
using Tensorflow.Serving;

var localServer = "127.0.0.1:8500";
var channel = new Channel(localServer, ChannelCredentials.Insecure,
                new List<ChannelOption> {
                    new ChannelOption(ChannelOptions.MaxReceiveMessageLength, int.MaxValue),
                    new ChannelOption(ChannelOptions.MaxSendMessageLength, int.MaxValue)
                });

var client = new ModelService.ModelServiceClient(channel);

var response = client.GetModelStatus(new GetModelStatusRequest()
{
    ModelSpec = new ModelSpec() { Name = "inception_v1" }
});
Console.WriteLine($"Model Available: {response.ModelVersionStatus}");

실행 결과

  • 실행 결과, Model 이 정상적으로 Loading 이 되어 있으면 AVAILABLE 상태이고, Model 이 Unload 상태이면 END, 그리고 다시 Loading 중 이면 LOADING 이라고 해서 state 값이 표시되는 것을 확인할 수 있습니다.

참고로, Tensorflow Serving 으로부터 Response 받은 결과 값은 JSON 형태입니다.

Model Available: [ { "version": "1", "state": "AVAILABLE", "status": { } } ]
Model Available: [ { "version": "1", "state": "AVAILABLE", "status": { } } ]
Model Available: [ { "version": "1", "state": "AVAILABLE", "status": { } } ]
Model Available: [ { "version": "1", "state": "AVAILABLE", "status": { } } ]
Model Available: [ { "version": "1", "state": "END", "status": { } } ]
Model Available: [ { "version": "1", "state": "END", "status": { } } ]
Model Available: [ { "version": "1", "state": "END", "status": { } } ]
Model Available: [ { "version": "1", "state": "END", "status": { } } ]
Model Available: [ { "version": "1", "state": "END", "status": { } } ]
Model Available: [ { "version": "1", "state": "END", "status": { } } ]
Model Available: [ { "version": "1", "state": "LOADING", "status": { } } ]
Model Available: [ { "version": "1", "state": "AVAILABLE", "status": { } } ]
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY