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

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

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

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

Проблема в том, что я ожидал, что пакетные запросы будут почти постоянными во времени. При отправке 1 изображения загрузка ЦП составляла около 10%, а ГП - 12%. Поэтому я ожидал, что пакет из 9 изображений будет использовать ~ 100% оборудования и отвечать за одно и то же время ~ 1 секунду, но это не так. Обработка пакета из 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: как предлагается в комментарии ниже, я также пробовал запустить модель на ЦП, но она действительно медленная и страдает теми же проблемами, что и с графическим процессором. . Кажется, что изображения из одного запроса не обрабатываются параллельно.

Кроме того, я думаю, что у меня проблемы с обслуживанием 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
  }
}

person Nahuel Dallacamina    schedule 11.07.2020    source источник
comment
Обязательны ли графические процессоры? А как насчет выступления, если у вас его нет?   -  person guillaume blaquiere    schedule 11.07.2020
comment
Я просто подумал, что на GPU будет быстрее. Раньше я пробовал эту модель на CPU, и она была немного медленнее. Однако я не тестировал его на ЦП с группой экземпляров для измерения параллелизма. Я попробую и посмотрю, поможет ли. Спасибо за предложение, результаты выложу здесь.   -  person Nahuel Dallacamina    schedule 12.07.2020
comment
На всякий случай, когда вы отправляете запрос в службу онлайн-прогнозирования AI Platform, вы сравниваете, когда вы отправляете одно изображение в запросе и несколько изображений в запросе, верно? Вы пробовали отправить несколько запросов с 1 изображением?   -  person guillaume blaquiere    schedule 12.07.2020
comment
Да, пробовал и то, и другое. Отправка 1 изображения на запрос, несколько запросов. Отправка нескольких изображений на запрос (и, как следствие, меньше параллельных запросов). Отправка нескольких запросов с одним изображением приводит к блокировке модели из-за большого количества запросов, и она перестает отвечать. Также он тратит впустую аппаратные ресурсы (использование графического процессора всего 12%).   -  person Nahuel Dallacamina    schedule 12.07.2020
comment
Я написал статью об использовании Cloud Run с Tensorflow. Конечно, вы ограничены возможностями Cloud Run (noGPU и 2vCPU / 2Gb (скоро вдвое больше)), но масштабируемость невероятно лучше, чем у AI Platform (я провел несколько бесед на эту тему). Если ваша модель соответствует этим ограничениям, попробуйте ее и дайте мне знать! Конечно, если вам понадобится помощь с упаковкой, дайте мне знать. И я рекомендую установить параметр параллелизма на 1   -  person guillaume blaquiere    schedule 12.07.2020
comment
@guillaumeblaquiere Я провел еще несколько тестов, как вы предложили, и обновил вопрос. Я был бы очень признателен, если бы вы могли дать мне еще несколько советов, чтобы попробовать. Спасибо!   -  person Nahuel Dallacamina    schedule 13.07.2020
comment
Используете ли вы тип машины BETA с платформой AI?   -  person guillaume blaquiere    schedule 13.07.2020
comment
Да, я использую n1-standard-2 с NVIDIA Tesla T4. У меня также есть модель, развернутая с машиной mls1-c1-m2 (по умолчанию, не бета-версия), и требуется ~ 5 секунд, чтобы сделать один прогноз для одного изображения ...   -  person Nahuel Dallacamina    schedule 13.07.2020
comment
Тип машины GA масштабируется лучше или нет? Во время моих тестов масштабируемость платформы GA была намного лучше, чем у бета-версии. Но у тебя нет графического процессора ...   -  person guillaume blaquiere    schedule 13.07.2020
comment
@NahuelDallacamina Приносим свои извинения (Google Cloud AI) за задержку с ответом. Чтобы прояснить режим пакетной обработки для онлайн-прогнозирования, в настоящее время пакетная обработка нескольких запросов в одном запросе не улучшает использование ресурсов. Это всего лишь удобный способ получить несколько прогнозов в одном запросе. Команда прогнозирования платформы AI планирует предоставить параметры пакетной обработки для обслуживания tf, чтобы улучшить использование ресурсов, но на данный момент нет сроков.   -  person Andrew - OpenGeoCode    schedule 06.08.2020
comment
Вопрос об отправке одного изображения на 8core / T4, первый запрос занимает больше времени в основном из-за холодного кеша + ленивая инициализация tf. Для последующих запросов, отправляемых в развертывание, если запросы были отправлены последовательно (отправить B, когда ответ A вернется), производительность должна быть намного лучше, если модель может выиграть от более мощного оборудования. Если несколько запросов были отправлены одновременно, если развернут только один сервер, то сервер, скорее всего, будет перегружен, если не включено автомасштабирование (в этом случае у нас должен быть хороший профиль производительности при стабильном трафике).   -  person Andrew - OpenGeoCode    schedule 06.08.2020


Ответы (3)


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

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

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

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

person Nahuel Dallacamina    schedule 07.08.2020

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

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

Как сказано в цитате, это связано с разницей в распределении узлов, особенно с:

Распределение узлов для онлайн-прогноза:

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

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

person Hugo    schedule 11.07.2020
comment
Привет! Спасибо за ответ, но я не использую пакетное прогнозирование. Я использую онлайн-прогнозирование и отправляю несколько экземпляров в одном запросе (это то, что я называю пакетом). - person Nahuel Dallacamina; 11.07.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 - я обнаружил некоторые странные узкие места из-за ЦП ‹-› в некоторых случаях узкие места при передаче данных через графический процессор. Был бы счастлив когда-нибудь позвонить и посмотреть с вами, если вы застрелите меня DM.

person Yoav Zimmerman    schedule 14.07.2020