Модель TensorFlow работает в онлайн-прогнозировании Google AI Platform слишком медленно с пакетами экземпляров - PullRequest
1 голос
/ 11 июля 2020

Я пытаюсь развернуть модель TensorFlow на платформе Google AI для онлайн-прогнозирования. У меня проблемы с задержкой и пропускной способностью .

Модель запускается на моем компьютере менее чем за 1 секунду (только с процессором Intel Core I7 4790K) для одного образа. Я развернул его на платформе AI на машине с 8 ядрами и графическим процессором NVIDIA T4.

При запуске модели на платформе AI в упомянутой конфигурации отправка только одного изображения занимает чуть меньше секунды. Если я начинаю отправлять много запросов, каждый с одним изображением, модель в конечном итоге блокируется и перестает отвечать. Поэтому я вместо этого отправляю пакеты изображений по каждому запросу (от 2 до 10, в зависимости от внешних факторов).

Проблема в том, что я ожидал, что пакетные запросы будут почти постоянными во времени. При отправке 1 изображения загрузка ЦП составляла около 10%, а ГП - 12%. Поэтому я ожидал, что пакет из 9 изображений будет использовать ~ 100% оборудования и отвечать одновременно ~ 1 se c, но это не так. Пакет из 7-10 изображений занимает от 15 до 50 секунд .

Я уже пытался оптимизировать свою модель. Я использовал map_fn, заменил это ручными циклами, переключился с Float 32 на Float 16, попытался векторизовать операции в максимально возможной степени, но он все еще в той же ситуации.

Что мне здесь не хватает ?

Я использую последнюю версию среды исполнения AI Platform для онлайн-прогнозирования (Python 3.7, TensorFlow 2.1, CUDA 10.1).

Модель представляет собой большую версию YOLOv4 (~ 250 МБ в Формат SavedModel). Я создал несколько алгоритмов постобработки в TensorFlow, которые работают с выходными данными модели.

И последнее, но не менее важное: я также попробовал отладить с помощью TensorBoard, и оказалось, что YOLOv4 часть TensorFlow Graph - это занимает ~ 90% времени обработки. Я ожидал, что эта конкретная часть модели будет очень параллельной.

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

ОБНОВЛЕНИЕ 2020-07-13: как предлагается в комментарии ниже, я также попытался запустить модель на ЦП , но он реально медленный и страдает теми же проблемами, что и с GPU. Кажется, что изображения из одного запроса не обрабатываются параллельно.

Кроме того, я думаю, что у меня проблемы с обслуживанием TensorFlow из-за скорости и количества запросов. Я использовал изображение tensorflow/serving:latest-gpu Docker локально, чтобы проверить это дальше. Модель отвечает в 3 раза быстрее на моей машине (GeForce GTX 1650), чем на платформе AI, но это действительно несовместимо с временем отклика. Я получаю следующее время ответа (<amount of images> <response time in milliseconds>):

3 9004
3 8051
11 4332
1 222
3 4386
3 3547
11 5101
9 3016
10 3122
11 3341
9 4039
11 3783
11 3294

Затем, поработав минуту, я начинаю получать задержки и ошибки:

3 27578
3 28563
3 31867
3 18855
{
  message: 'Request failed with status code 504',
  response: {
    data: { error: 'Timed out waiting for notification' },
    status: 504
  }
}

Ответы [ 3 ]

0 голосов
/ 14 июля 2020

Модель представляет собой большую версию YOLOv4 (~ 250МБ в формате SavedModel). Я построил несколько алгоритмов постобработки в TensorFlow, которые работают с выходными данными модели.

Какие модификации постобработки вы внесли в YOLOv4? Возможно ли, что причиной замедления являются эти операции? Один тест, который вы можете провести для проверки этой гипотезы локально, - это сравнить немодифицированную версию YOLOv4 с тестами, которые вы уже сделали для своей модифицированной версии. TensorBoard, и оказывается, что часть YOLOv4 TensorFlow Graph занимает ~ 90% времени обработки. Я ожидал, что эта конкретная часть модели будет очень параллельной.

Было бы интересно взглянуть на «выходные данные отладки», которые вы здесь упоминаете. Если вы используете https://www.tensorflow.org/guide/profiler#install_the_profiler_and_gpu_prerequisites, какова разбивка самых дорогих операций? У меня был некоторый опыт работы с операциями TF - я обнаружил некоторые странные узкие места из-за узких мест передачи данных CPU <-> GPU в некоторых случаях. Буду рад когда-нибудь позвонить и посмотреть с вами, если вы застрелите меня DM.

0 голосов
/ 07 августа 2020

Для других с той же проблемой, что и у меня, при использовании платформы AI:

Как указано в комментарии команды Google Cloud здесь , платформа AI не выполняет пакеты экземпляров сразу . Тем не менее, они планируют добавить эту функцию.

С тех пор мы перешли от платформы AI к настраиваемому развертыванию сервера NVIDIA Triton Inference Server, размещенного на Google Cloud Compute Engine. Мы получаем намного лучшую производительность, чем мы ожидали, и мы все еще можем применить гораздо больше оптимизаций к нашей модели, предоставленной Triton.

Спасибо всем, кто пытался помочь, отвечая на этот ответ.

0 голосов
/ 11 июля 2020

Из Google Cloud документация :

Если вы используете простую модель и небольшой набор входных экземпляров, вы обнаружите, что существует значительная разница между тем, как много времени требуется, чтобы выполнить sh идентичных запросов прогнозов с использованием онлайн-прогнозирования по сравнению с пакетным прогнозированием. Пакетное задание может занять несколько минут для выполнения прогнозов, которые почти мгновенно возвращаются по онлайн-запросу. Это побочный эффект различной инфраструктуры, используемой двумя методами прогнозирования. AI Platform Prediction выделяет и инициализирует ресурсы для задания пакетного прогнозирования при отправке запроса. Онлайн-прогноз, как правило, готов к обработке во время запроса. * Выделение узлов для онлайн-прогнозирования:

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

Подробнее об этом можно узнать здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...