[TensorFlow] gRPC 클라이언트에서 models.config 구성 된 Model Reloading

참조


소개

  • TensorFlow Serving은 미리 models.config 설정 파일에 Loading할 모델들을 정의할 수 있습니다.
  • 해당 작업은 Tensorflow Serving 서버에서 직접 작업하는 내용입니다.
  • Client에서도 수동으로 models.config 파일에 정의된 모델을 Loading 하는 방법에 대해 자료조사 및 POC 진행합니다.

예제코드

  • Python 코드로 TensorFlow Serving gRPC 코드에 models.config 파일에 정의된 Model 을 수동으로 재로딩 하는 방법에 대하여 코드 작성 및 테스트 진행합니다.
  • 소스코드는 StackOverFlow 참고 하였습니다.
  • gRPCHelper.pyadd_model_config 메서드를 추가하였습니다.
  • 해당 메서드는 ModelServiceStub 클래스의 sutb 객체를 생성하여 최종적으로 models.config 에 정의된 특정 모델 정보를 ReLoading 역할을 하는 메서드 입니다.
def add_model_config(host, name, base_path, model_platform):
        channel = grpc.insecure_channel(host) 
        stub = model_service_pb2_grpc.ModelServiceStub(channel)
        request = model_management_pb2.ReloadConfigRequest() 
        model_server_config = model_server_config_pb2.ModelServerConfig()

        #Create a config to add to the list of served models
        config_list = model_server_config_pb2.ModelConfigList()       
        one_config = config_list.config.add()
        one_config.name= name
        one_config.base_path=base_path
        one_config.model_platform=model_platform

        model_server_config.model_config_list.CopyFrom(config_list)

        request.config.CopyFrom(model_server_config)

        print(request.IsInitialized())
        print(request.ListFields())

        response = stub.HandleReloadConfigRequest(request,10)

        if response.status.error_code == 0:
          print("Reload sucessfully")
        else:
          print("Reload failed!")
          print(response.status.error_code)
          print(response.status.error_message)
  • tensorflow_serving_gRPC.py 클래스에 해당 메서드를 호출하여 Inference 테스트 진행해 보았습니다.
import numpy as np

from unit_test.tf_serving.gRPC.gRPCHelper import gRPCHelper

# mnist 데이터 셋 가져오기
(x_test, y_test) = gRPCHelper.get_mnist_dataset()
test_images = np.empty((0, 15))
test_images = x_test[0:15]

# gRPC 최대 전송 테스트
# 최대 전송 용량 확인 할 때 주석 풀어서 사용
#test_images, y_test = test_images_append(test_images=test_images, y_test=y_test)

host = 'localhost'
port = 8500
model = 'Xception'

gRPCHelper.add_model_config(host=f"{host}:{port}", 
                    name=model, 
                    base_path="/models/model/Xception", 
                    model_platform="tensorflow")

# gRPC channel, stup 생성
stub = gRPCHelper.get_stub(host=host, port=port)

# 메타데이터 정보 가져오기
(serving_inputs, serving_outputs) = gRPCHelper.get_model_metadata(stub=stub, model=model)

input = gRPCHelper.get_input_output(serving_inputs)
output = gRPCHelper.get_input_output(serving_outputs)

# predict 값 가져오기
result = gRPCHelper.get_predict(stub=stub, model=model, test_images=test_images, input=input)
response = np.array(result.outputs[output].float_val)

response = gRPCHelper.list_chunk(response.tolist(), 10)

# 결과값 출력
gRPCHelper.predict_print(response=response, y_test=y_test)

Docker Container 로그 결과

  • 위와 같이 add_model_config 메서드를 실행하게 되면, TensorFlow Serving Containger 로그에서 지정된 모델이 다시 재로딩 되었다는 로그가 출력된 것을 확인할 수 있습니다.
Config entry
        index : 0
        path : /models/model/Xception
        name : Xception
        platform : tensorflow
2022-03-22 05:53:21.737261: I tensorflow_serving/model_servers/server_core.cc:465] Adding/updating models.
2022-03-22 05:53:21.737290: I tensorflow_serving/model_servers/server_core.cc:591]  (Re-)adding model: Xception
2022-03-22 05:53:21.737339: I tensorflow_serving/model_servers/server_core.cc:486] Finished adding/updating models

실행 결과

  • 재로딩 된 상태에서 해당 모델의 Inference 한 결과 정상적으로 Inference 되어 결과값, 예측값이 출력된 것을 확인할 수 있습니다.
True
[(<google.protobuf.pyext._message.FieldDescriptor object at 0x000002CCD60392A0>, model_config_list {
  config {
    name: "Xception"
    base_path: "/models/model/Xception"
    model_platform: "tensorflow"
  }
}
)]
Reload sucessfully
Real Value : 7 / Pred Value : 7
Real Value : 2 / Pred Value : 2
Real Value : 1 / Pred Value : 1
Real Value : 0 / Pred Value : 0
Real Value : 4 / Pred Value : 4
Real Value : 1 / Pred Value : 1
Real Value : 4 / Pred Value : 4
Real Value : 9 / Pred Value : 9
Real Value : 5 / Pred Value : 5
Real Value : 9 / Pred Value : 9
Real Value : 0 / Pred Value : 0
Real Value : 6 / Pred Value : 6
Real Value : 9 / Pred Value : 9
Real Value : 0 / Pred Value : 0
Real Value : 1 / Pred Value : 1
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY