[C#] Tensorflow Serving C# gRPC Model Status 체크
- C#/C# 문법
- 2022. 7. 23. 20:56
참고
개요
- 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
'C# > C# 문법' 카테고리의 다른 글
[C# 문법] Linq Aggregate vs String.Join (0) | 2022.12.08 |
---|---|
서로 다른 Class 에서 Action 콜백 호출하기 (0) | 2022.12.08 |
[C# 문법] async 및 await 를 사용한 비동기 프로그래밍 (0) | 2022.07.22 |
[C# 문법] Linq 성능 개선 (0) | 2022.06.10 |
[C# 문법] MediatR 이란? (0) | 2022.06.03 |
이 글을 공유하기