Обслуживание TensorFlow: обновление model_config (добавление дополнительных моделей) во время выполнения

Я занят настройкой клиента обслуживания TensorFlow, который запрашивает сервер обслуживания TensorFlow для создания прогнозов для данного входного изображения для данной модели.

Если запрошенная модель еще не обслуживалась, она загружается с удаленного URL-адреса в папку, где расположены модели сервера. (Клиент делает это). На этом этапе мне нужно обновить model_config и запустить сервер для его перезагрузки.

Кажется, что эта функция существует (на основе https://github.com/tensorflow/serving/pull/885 и https://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/model_service.proto#L22), но я не могу найти никакой документации о том, как на самом деле его использовать.

По сути, я ищу сценарий python, с помощью которого я могу запускать перезагрузку со стороны клиента (или иным образом настраивать сервер для прослушивания изменений и запуска самой перезагрузки).


person Karl    schedule 30.01.2019    source источник
comment
Лучшим выбором было вообще не использовать файл конфигурации, а использовать другой шаблон, в котором мы указываем путь к модели и имя модели в командной строке.   -  person H S Rathore    schedule 31.12.2020


Ответы (3)


Так что мне потребовались целые века рытья запросов на включение, чтобы наконец найти для этого пример кода. Для следующего человека, у которого будет такой же вопрос, как у меня, вот пример того, как это сделать. (Для этого вам понадобится tensorflow_serving package; pip install tensorflow-serving-api).

На основе этого запроса на перенос (который на момент написания не был принят и был закрыт, так как требовал проверки): https://github.com/tensorflow/serving/pull/1065

from tensorflow_serving.apis import model_service_pb2_grpc
from tensorflow_serving.apis import model_management_pb2
from tensorflow_serving.config import model_server_config_pb2

import grpc

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)


add_model_config(host="localhost:8500", 
                    name="my_model", 
                    base_path="/models/my_model", 
                    model_platform="tensorflow")
person Karl    schedule 31.01.2019
comment
Отличный ответ, спасибо! Мне было интересно, можно ли сделать такое же обновление для model_config с помощью REST API вместо вызова gRPC. Причина в том, что я не могу определить канал с моим хостом, который находится за Nginx и API Gateway (Kong). - person Patrick; 28.11.2020

Добавьте модель на сервер обслуживания TF и ​​в существующий файл конфигурации conf_filepath: используйте аргументы name, base_path, model_platform для новой модели. Сохраняет оригинальные модели в целости и сохранности.

Обратите внимание на небольшое отличие от ответа @Karl - использование MergeFrom вместо CopyFrom

pip установить tenorflow-serving-api

import grpc
from google.protobuf import text_format
from tensorflow_serving.apis import model_service_pb2_grpc, model_management_pb2
from tensorflow_serving.config import model_server_config_pb2


def add_model_config(conf_filepath, host, name, base_path, model_platform):
    with open(conf_filepath, 'r+') as f:
        config_ini = f.read()
    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()
    config_list = model_server_config_pb2.ModelConfigList()
    model_server_config = text_format.Parse(text=config_ini, message=model_server_config)

    # Create a config to add to the list of served models
    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.MergeFrom(config_list)
    request.config.CopyFrom(model_server_config)

    response = stub.HandleReloadConfigRequest(request, 10)
    if response.status.error_code == 0:
        with open(conf_filepath, 'w+') as f:
            f.write(request.config.__str__())
        print("Updated TF Serving conf file")
    else:
        print("Failed to update model_config_list!")
        print(response.status.error_code)
        print(response.status.error_message)
person maish.r    schedule 28.05.2019
comment
Небольшая, но очень полезная разница! - person Karl; 29.05.2019
comment
Я выполнил оба ответа, докер обслуживания открыл порты 8501 и 8500. все же я обнаружил ошибку. raise _Rendezvous(state, None, None, deadline) grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with: `status = StatusCode.DEADLINE_EXCEEDED` details = Превышен крайний срок` debug_error_string = {"created":"@1568010109.337260837","description":"Error received from peer ipv6:[::1]:8500","file":"src/core/lib/surface/call.cc","file_line":1052,"grpc_message":"Deadline Exceeded","grpc_status":4}" - person Shekhar Koirala; 09.09.2019
comment
Не могли бы вы подробнее рассказать, в чем разница между использованием MergeFrom и CopyFrom? - person Mewtwo; 21.10.2019
comment
CopyFrom заменяет текущие списки доступных моделей вашими новыми моделями. MergeFrom добавляет модели к текущим доступным моделям. - person maish.r; 22.10.2019
comment
Привет, спасибо за ответ, как добавить поле 'model_version_policy' во вновь добавленную конфигурацию? - person coin cheung; 07.11.2019

Я не использовал файл конфигурации для обслуживания большего количества моделей во время выполнения, а использовал rest api сервировок. Вот как я это сделал.

Всякий раз, когда мне требовалось обслуживать новую модель, я программно вызывал эту команду, проблема заключалась только в том, что если порт уже используется, нам нужно получить неиспользуемый новый номер порта, поэтому я создал программу для получения неиспользуемого номера порта во время выполнения.

tensorflow_model_server --rest_api_port=dynamic_port --model_base_path=<path to model> --model_name=<model_name>

Я использую кафку, сельдерей с сервировкой tenorflow. Я знаю, что этот вопрос касается обновления файла конфигурации, но я пришел сюда в поисках ответов до того, как принял решение, описанное выше. Поэтому, если кто-то еще приходит сюда, чтобы обслуживать несколько моделей и добавлять новые во время выполнения, используйте приведенный выше шаблон.

person H S Rathore    schedule 31.12.2020
comment
Просто прокомментируйте здесь, если кому-то нужны подробности. - person H S Rathore; 31.12.2020