Как публиковать пользовательские (не тензорные) модели с использованием тензорного потока?

Я прочитал основной и расширенные учебники по tensorflow-serving, но мне все еще неясно, как создать поддержку в tensorflow-serving для следующего:

  1. модели, созданные на Python (например, xgboost или scikit-learn)
  2. модели, встроенные в R (например, xgboost или lightgbm)

Рассматривается использование TFBT, доступного в tf.contrib, но в соответствии с этим, TensorFlow Boosted Trees (TFBT) требует гораздо больше времени для обучения по сравнению с xgboost и заметил, что у него хуже точность.

Любая помощь или предложения будут оценены ...


person babalu    schedule 30.03.2018    source источник
comment
Можете ли вы добавить поддержку моделей xgboost в обслуживании tensorflow? Если да, пожалуйста, помогите мне.   -  person prashantas    schedule 06.08.2019
comment
Я реализовал XGBoost Serving, который является ответвлением TensorFlow Serving. Он поддерживает обслуживание моделей XGBoost и моделей XGBoost && FM. Вы можете прочитать README для более подробной информации и попробовать через несколько минут. Если у вас возникнут какие-либо проблемы, отправьте сообщение о проблеме или напишите мне напрямую.   -  person hzy    schedule 28.06.2021


Ответы (2)


Tensorflow документация упоминает, что:

Любой класс С++ может быть обслуживаемым, например. int, std::map<string, int> или любой другой класс, определенный в вашем двоичном файле — назовем его YourServable.

Tensorflow, обслуживающий бумагу, также упоминает, что

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

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

Есть много модельных платформ, которые можно использовать. XGBoost, LightGBM, SkLearn, pytorch….. В этом документе я бы посетил только XGBoost. Ряд подобных вопросов необходимо обсудить и для других модельных платформ.

Загрузка

Модель должна жить в каком-то файле по какому-то пути, и ее нужно загрузить в среду выполнения тензорного потока/обслуживания.

В документах упоминается, как создать собственный сервер. Пример загрузчика хэш-таблицы из код. Я думаю, вам нужно написать что-то подобное для XGBoost. XGBoost имеет c++ api и несколько примеров в модель загрузки xgboost в С++ (несоответствие оценок прогнозирования python → С++). Так что, по крайней мере, это возможно в теории. Однако для этого вам нужно написать новый код. Для этого вам нужно загрузить библиотеку XGBoost. Вам нужно либо использовать XGBoost во время компиляции, либо dlopen его библиотеку во время выполнения. Вам как минимум нужно разветвить код tensorflow/serving и поддерживать его самостоятельно. Это само по себе может означать поддержку вашей вилки практически на неопределенный срок.

Я думаю, что SimpleLoaderSourceAdapter может быть достаточно, поскольку однако стартер servables/tensorflow должен был создать свой собственный здесь . Поэтому вам может понадобиться написать свои собственные загрузчики и исходные адаптеры для вашей новой модели.

Заставить ServerCore загрузить вашу модель

Недостаточно иметь загружаемую модель. Ваша модель также должна быть динамически или статически загружена во время выполнения tensorflow/serving. Существуют различные способы передать байты вашей модели в tensorflow/serving. Простой подход состоит в том, чтобы иметь модель в файловой системе уже в обычном файле и загрузить вашу модель статически через model_server_config.proto#L19" rel="nofollow noreferrer">ModelConfig. Во время инициализации ServerCode перебирает эти записи ModelConfigList и считывает загрузки. эти модели.

Объект ModelConfig имеет поле model_platform и на момент написания этой статьи поддерживается только tensorflow в версии с открытым исходным кодом. Поэтому вам нужно добавить новую платформу model_platform, скажем XGBoost, и соответствующим образом изменить прото-файлы для ModelConfig.

Сервис Tensorflow Create a new Servable документация содержит пример кода, который напрямую вызывает функцию ConnectSourceToTarget . Однако я не уверен, где лучше всего написать этот код в вашем приложении или насколько предпочтительнее было бы попытаться использовать существующие функции загрузки статической конфигурации в tensorflow, как описано ранее.

Предсказание

Мы говорили о некоторых настройках для загрузки вашей модели в среду выполнения tensorflow/serving. Я уверен, что есть куча других вещей, которые я пропустил, но я не думаю, что история на этом закончена.

Как бы вы использовали свою модель для предсказания?

Я полностью игнорирую сервер gRPC. Я уверен, что вам нужно сделать еще много настроек. Надеясь, что путь HTTP будет проще, обслуживание tensorflow имеет это HttpRestApiHandler, использующий TensorflowPredictor объект для вызова прогноза.

Вполне разумно ожидать написания класса XGBoostPredictor при первом добавлении платформы модели XBoost. Это будет содержать специальную функцию прогнозирования XGBoost. Это не слишком отличается от необходимости писать собственный загрузчик для чтения модели XGBoost из файла.

Я предполагаю, что вам также нужно каким-то образом расширить HttpRestApiHandler для вызова вашего XGBoostPredictor, когда модель является моделью XBoost. А также как-то добавить возможность различать TensorFlowPredictor или XBoostPreditor. Очевидный способ сделать это мне не ясен. Мне было бы очень интересно узнать лучшие подходы. Обслуживание Tensorflow также имеет Жизнь запроса на вывод TensorFlow Serving документация, которая может оказаться полезной.

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

Вывод

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

В качестве отправной точки необходимо тщательно изучить пример serveables/tensorflow и ожидать такой же сложности для размещения другой модели платформы.

Помимо сложности реализации, я был бы чрезвычайно осторожен в поддержке нового программного обеспечения, которое вы собираетесь написать. Разумно рассчитывать на то, что вы будете владеть своим форком со всеми библиотеками в вашей организации на неопределенный срок или взаимодействовать с вышестоящим сообществом для расширения обслуживания tensorflow. В апстриме уже есть несколько предыдущих ошибок: 1694, 768, 637.

Платформа Google ML имеет возможность обслуживания моделей SKLearn и XGBoost в дополнение к моделям TensorFlow. В их бумаге также говорится:

Если серьезно, Google использует TensorFlow-Serving для некоторых проприетарных сред машинного обучения, отличных от TensorFlow, а также для TensorFlow.

Таким образом, подобные расширения, возможно, уже были реализованы поверх обслуживания тензорного потока. С другой стороны, статья была написана в 2017 году, и кто знает, что еще изменилось с тех пор.

person Hakan Baba    schedule 21.07.2020

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

Simple TensorFlow Serving — это универсальный и простой в использовании сервис для моделей машинного обучения.

  • [x] Поддержка распределенных моделей TensorFlow
  • [x] Поддержка общих API RESTful/HTTP.
  • [x] Поддержка логического вывода с ускоренным графическим процессором
  • [x] Поддержка curl и других инструментов командной строки
  • [x] Поддержка клиентов на любом языке программирования
  • [x] Поддержка клиента генерации кода по моделям без написания кода
  • [x] Поддержка вывода с необработанным файлом для моделей изображений
  • [x] Поддержка статистических показателей для подробных запросов
  • [x] Поддержка одновременного обслуживания нескольких моделей
  • [x] Поддержка динамического онлайн и офлайн для версий модели
  • [x] Поддержка загрузки новой пользовательской операции для моделей TensorFlow.
  • [x] Поддержка безопасной аутентификации с настраиваемой базовой аутентификацией.
  • [x] Поддержка нескольких моделей TensorFlow/MXNet/PyTorch/Caffe2/CNTK/ONNX/H2o/Scikit-learn/XGBoost/PMML

У меня еще не было возможности протестировать его (сейчас я использую Tensorflow Serving), но, вероятно, скоро попробую, потому что хочу обслуживать модель XGBoost.

person Patrick    schedule 14.01.2021