Как оптимизировать время вывода вашей модели машинного обучения

Плюсы и минусы разных техник

Все больше компаний активно используют искусственный интеллект (ИИ) в своем бизнесе, и медленно, но верно все больше моделей запускается в производство. При переходе к производству время вывода начинает играть важную роль. Когда модель обращена к внешнему пользователю, обычно требуется, чтобы время вывода составляло миллисекунды и не превышало нескольких секунд. Google рекомендует не превышать 1,3 секунды для ощущения реакции. На практике многие модели машинного обучения (ML) обычно занимают гораздо больше времени. Для пакетных процессов нормально, если на создание модели уходят часы, но все, что должно обслуживаться в реальном времени, должно быть достаточно быстрым, чтобы его можно было развернуть. Не говоря уже о том, что более длительное время вывода означает больше затрат, если вы используете облачное оборудование для запуска своих моделей!

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

Преобразование в ONNX

Вы можете использовать ONNX, чтобы ускорить работу ваших моделей, но что такое ONNX? ONNX означает Открытый обмен нейронными сетями и, по сути, представляет собой открытый формат представления алгоритмов машинного обучения. Это обеспечивает переносимость — другими словами, модель ONNX может работать где угодно. Вы можете просто импортировать и экспортировать модели ONNX, например, в таких популярных инструментах, как PyTorch и TensorFlow. Это отличная функция сама по себе, но дополнительным преимуществом является то, что вы можете выбрать время выполнения. Это означает, что вы можете лучше оптимизировать модель для своих целей, исходя из ее потребностей и способа ее запуска.

В UbiOps мы провели тест с моделью TensorFlow, которая после преобразования в ONNX стала на 200% быстрее! Такое увеличение скорости даже позволило запустить модель на простом процессоре вместо дорогого графического процессора. Вы можете прочитать полную статью для получения всех подробностей и примера кода.

Преимущества

  • Легко работать с
  • Тот же код независимо от того, с каким оборудованием вы хотите работать.
  • Большой прирост производительности

Недостатки

  • Не работает с малоизвестными или специально созданными библиотеками ML.

Использование ТензорРТ

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

NVIDIA TensorRT — это SDK для высокопроизводительного вывода глубокого обучения, построенный на базе CUDA. Он способен оптимизировать модели машинного обучения на самых разных уровнях: от квантования типов данных модели до оптимизации памяти графического процессора.

Однако эти методы оптимизации имеют свою цену: снижение точности. С учетом вышесказанного, для многих различных приложений снижение точности значительно перевешивается увеличением производительности, но это зависит от вашего варианта использования.

Благодаря TensorRT NVIDIA выиграла во всех тестах производительности в стандартном отраслевом тесте MLPerf Inference. Он хорошо работает для компьютерного зрения, автоматического распознавания речи, понимания естественного языка (BERT), преобразования текста в речь и рекомендательных систем.

В UbiOps мы провели тест, в котором сравнивали работу Модели ResNet152-v2 ONNX на двух типах графических процессоров NVIDIA с TensorRT и без него. Мы провели 1000 классификаций модели и построили график среднего времени запуска и фактического времени вывода (см. ниже).

Несмотря на то, что TensorRT значительно увеличил время холодного запуска модели, фактическое время вывода было в 2–3 раза быстрее. Полную информацию об этом тесте можно найти в посте в блоге.

Преимущества

  • Хороший прирост производительности
  • Работает со всеми основными платформами машинного обучения.

Недостатки

  • Работает только с графическими процессорами NVIDIA
  • Значительно увеличивает время запуска
  • Снижает точность модели.

Выбор подходящего оборудования (CPU, GPU, IPU)

Аппаратное обеспечение является важным фактором при развертывании моделей машинного обучения. Небольшие модели обычно хорошо справляются с процессорами, но с учетом последних достижений в этой области стали необходимы графические процессоры. Такая модель, как ChatGPT, просто не может работать на процессоре, поскольку время вывода будет неприемлемо большим. Недавно мы развернули Stable Diffusion, и при его запуске на экземпляре ЦП с 32 ГБ обработка одного запроса занимала около получаса! Но даже если вы знаете, что стандартный процессор не подойдет для вашего случая использования, как выбрать правильную альтернативу?

В большинстве облаков доступно множество различных графических процессоров: от экземпляров T4 до NVIDIA A100. А недавно на рынок вышли интеллектуальные процессоры (IPU) от Graphcore. Итак, какой из них поможет вам сократить время вывода больше всего? Давайте быстро сравним графические процессоры и IPU.

Преимущества и недостатки графического процессора

Графические процессоры — это графические процессоры, и, как следует из названия, они оптимизированы для графических вычислений. Поскольку графические вычисления математически очень похожи на вычисления глубокого обучения, они также хорошо подходят для этого. В двух словах:

Преимущества

  • Они оптимизированы для параллельной обработки.
  • Они хорошо работают с большими партиями.
  • Некоторые графические процессоры специализированы для вывода, например NVIDIA T4.

Недостатки

  • Каждый тип графического процессора имеет свои особенности. Потребуется некоторое ручное тестирование, чтобы найти тот, который лучше всего подходит для вас.
  • Они тратят много энергии! Больше энергии означает более высокие затраты и больший углеродный след
  • Создан для общего назначения, не оптимизирован специально для машинного обучения.

Преимущества и недостатки IPU

IPU — это блоки обработки данных. Они разработаны компанией Graphcore и созданы специально для приложений ML. В двух словах:

Преимущества

  • Эффективный массовый параллелизм вычислений
  • Очень большая пропускная способность памяти
  • Специализируется на обработке графов (идеально подходит для глубокого обучения)

Недостатки

  • В настоящее время доступно только на G-core и недоступно у других облачных провайдеров.
  • Меньше доступности
  • Подходит только для моделей TensorFlow и PyTorch.

Уменьшение количества операций

Вы также можете сократить время вывода вашей модели, оптимизировав саму модель. При оптимизации модели машинного обучения вы обычно хотите попытаться сократить количество операций, которые необходимо выполнить с любыми входными данными. Для достижения этой цели можно использовать множество различных методов, таких как объединение в пул, сокращение модели или отделяемые свертки. Но если углубляться в детали этих методов, эта статья будет очень длинной. Эти темы я оставлю для второй части статьи!

Заключение

Существуют различные методы и стратегии, которые можно использовать для улучшения времени вывода ваших моделей. Я бы рекомендовал всегда конвертировать вашу модель в ONNX, когда это возможно, поскольку это почти гарантированно ускоряет работу и не требует больших усилий. Преимущества других методов менее очевидны и в большей степени зависят от вашего конкретного варианта использования. К счастью, такие инструменты, как TensorRT, легко настроить, поэтому их легко тестировать. А с помощью платформ MLOps, таких как UbiOps, переключение между экземплярами CPU, GPU или IPU можно осуществлять одним нажатием кнопки.