Минимальный клиент Python для общения с TensorFlow Serving

min-tfs-client - это минимальный клиент gRPC для обслуживания TensorFlow, который не зависит от TensorFlow.

TL; DR: min-tfs-client - это минимальный клиент Python для обслуживания TensorFlow, который позволяет использовать бессерверные службы (например, AWS Lambda) с ограничениями на размер развертывания (250 МБ без сжатия на момент написания). Он работает, удаляя TensorFlow как зависимость для создания тензорных протобуфов для запроса прогнозирования. Не стесняйтесь проверить репозиторий здесь, если вы хотите внести свой вклад

TensorFlow Serving (TFS) - это обслуживающая система для моделей машинного обучения (ML), в основном используемая для моделей, построенных в TensorFlow. В этом сообщении блога мы представляем облегченный клиент Python для TFS, который позволяет приложениям Python делать запросы gRPC к экземпляру TFS без необходимости установки TensorFlow.

Обслуживание моделей машинного обучения в производстве часто является последней и самой сложной частью завершения разработки продукта машинного обучения. На этом этапе разработки специалисты по данным, инженеры машинного обучения и инженеры-программисты должны сотрудничать, чтобы интегрировать стек машинного обучения с более широким стеком продуктов. TFS - это сервер gRPC / HTTP, написанный на C ++ и распространяемый Google для ускорения развертывания моделей TensorFlow в производственных средах. По нашему опыту, он обеспечивает надежную, хорошо масштабируемую и легко настраиваемую платформу для обслуживания моделей. Мы успешно использовали его в продукте Answer Bot, запустив наши семантические модели в инфраструктуре на базе процессоров и графических процессоров.

Хотя TFS теперь поддерживает REST, мы решили использовать gRPC внутри, потому что 1) REST был недоступен, когда мы создавали модели TensorFlow, и 2) использование protobufs в запросах gRPC делает управление контрактами API немного более надежным. Есть и другие преимущества, связанные с использованием gRPC, но мы не будем повторно обсуждать эти причины в этом сообщении в блоге. При этом использование gRPC также создает сложности, которые напрямую связаны с его преимуществами; в частности, требование о том, что протоколы API, определяющие контракты, должны быть скомпилированы и распространены среди всех клиентов для связи с сервером.

Протобуфы, необходимые для взаимодействия с TFS с использованием python, содержатся в пакете tensorflow-serving-api, распространяемом командой TensorFlow в Google. Эти protobuf-файлы были скомпилированы в классы Python, которые можно создавать и загружать с атрибутами, соответствующими полям protobuf. В совокупности эти протобуфы содержат определение объектов, включая полезную нагрузку запроса TFS (prediction_service_pb2_grpc.py), тензор в TensorFlow (tensor.proto) и даже форму тензора в TensorFlow (tensor_shape.proto). Важным свойством protobufs является их способность поддерживать взаимозависимость - например, загрузка protobuf запроса TFS зависит от protobuf тензора TensorFlow, который, в свою очередь, зависит от protobuf формы тензора, чтобы обрабатывать форму загружаемого тензора.

Эти зависимости создают ситуацию, когда пакет tensorflowpython является зависимостью для tensorflow-serving-api, поскольку он обязательно предоставляет определения protobuf для тензора, чтобы сделать запрос и десериализовать ответ от TFS. TensorFlow предоставляет эту функциональность с помощью функций tf.make_tensor_proto и tf.make_nd_array. Однако установка пакета tensorflow python только для того, чтобы получить доступ к определениям protobuf для тензоров, далека от идеала; на момент написания TensorFlow 2.1.0 требует 544 Мб для tensorflow_core и еще 10 Мб для Tensorboard. Пакет tensorflow содержит весь код, необходимый для обучения, мониторинга, оценки и экспорта моделей - код, который не требуется для взаимодействия с TFS в производственной среде.

Размер пакета TensorFlow создает сложности при попытке создать приложения, которым необходимо взаимодействовать с TFS. В частности, это значительно увеличивает размер контейнера Docker, а в случае бессерверных функциональных сервисов, таких как AWS Lambda, это приводит к тому, что виртуальная среда превышает максимальный размер развертывания. Это делает невозможным развертывание лямбда-выражения, взаимодействующего с TFS, путем установки tensorflow-serving-api.

Чтобы решить эту проблему, мы создали минимальный клиент Python для TFS под названием min-tfs-client. Мы создали пакет, содержащий только protobufs, необходимые для создания тензора, клиента gRPC, специфичного для TFS, и несколько вспомогательных функций для сопоставления между типами NumPy и TensorFlow. Это устраняет зависимость как от tensorflow-serving-api, так и от tensorflow при выполнении запросов gRPC к TFS. Вы можете установить его, запустив pip install min-tfs-client. Ниже приведен пример кода клиента в действии!

Этот легкий пакет уменьшает зависимости взаимодействия TFS с NumPy, gRPC и Protobuf, в результате чего общий размер виртуальной среды уменьшается примерно до 100 МБ, большая часть из которых приходится на NumPy (~ 90 МБ). Используя min-tfs-client, теперь можно развертывать AWS Lambdas, которые взаимодействуют с TFS, не превышая лимитов развертывания.

Заключение

Мы разработали и открыли исходный код облегченного клиента Python для взаимодействия с TFS, который существенно уменьшает размер виртуального окружения приложений, которым просто необходимо взаимодействовать с TFS. Клиент обрабатывает сериализацию и десериализацию тензорных протоколов в / из массивов NumPy, а также управление запросами gRPC. Не стесняйтесь заглядывать в репозиторий здесь, если вы хотите внести свой вклад или вам просто интересно.

Благодарности

Дана Ма и Эрик Пак внесли свой вклад в разработку этого пакета. Адель Сми, Керри Чу и Дана Ма внесли свой вклад в подготовку этого сообщения.