PyTorch 2.0 был запущен в начале декабря 2022 года на NeurIPS 2022 и вызвал много шума из-за своего основного компонента torch.compile, который, как ожидается, обеспечит большую скорость вычислений по сравнению с предыдущими версиями PyTorch.

Это замечательная новость для мира искусственного интеллекта, и первые результаты по сокращению времени обучения впечатляют. Что команды PyTorch не упомянули в релизном пресс-релизе и на PyTorch GitHub, так это производительность логического вывода PyTorch 2.0.

Давайте подробнее рассмотрим эту тему и узнаем, как PyTorch 2.0 работает по сравнению с другими ускорителями логических выводов, такими как Nvidia TensorRT и ONNX Runtime.

Мы провели несколько тестов вывода с помощью Speedster, библиотеки с открытым исходным кодом Nebuly, чтобы применить методы оптимизации SOTA и добиться максимального ускорения вывода на вашем оборудовании. Для этого варианта использования Speedster позволил нам запустить TensorRT, ONNX Runtime и объединить их с 16- и 8-битным динамическим и статическим квантованием всего в 2 строках кода. Во время тестирования мы также использовали Speedster для сбора информации о производительности по основной стратегии сокращения задержки вывода.
Мы проводили тесты на графическом процессоре Nvidia 3090Ti с ResNet — той же модели, которая использовалась в примерах в пресс-релизе PyTorch 2.0.

Тестирование производительности вывода PyTorch 2.0 с помощью Speedster

Вот 4 основных вывода из тестов:

  1. PyTorch 2.0 становится все более и более эффективным по сравнению с предыдущими версиями с большим размером пакета. И точность fp16 становится намного более эффективной, чем скомпилированная версия fp32 при более высокой партии. Это легко объяснимо, учитывая, что компиляция Pytorch 2.0 в основном предназначена для обучения, где обычно размер пакета превышает вывод. Сосредоточение внимания на fp16 имеет смысл, поскольку процедура обучения недавно перешла от полной точности к половинной, особенно для больших моделей.
  2. Среда выполнения ONNX работает намного лучше, чем PyTorch 2.0, при меньших размерах пакетов, в то время как при больших размерах пакетов результат противоположный. Опять же, это связано с тем, что среда выполнения ONNX была разработана в основном для логических выводов (где обычно используются пакеты меньшего размера), в то время как, как было сказано ранее, основной целью PyTorch 2.0 является обучение.
  3. И режим ожидания PyTorch, и PyTorch 2.0 (скомпилированный) показывают одинаковое время работы для пакетов размером 1 и 8. Это показывает, что две среды выполнения не использовали полную вычислительную мощность при размере пакета, равном единице, в то время как другие оптимизаторы на основе логических выводов, такие как среда выполнения ONNX, могли лучше управлять вычислительной мощностью. Опять же, это, вероятно, связано с тем, что компилятор PyTorch был в основном разработан для обучения, игнорируя ситуации, когда размер пакета недостаточно велик для использования всех вычислительных мощностей с их ядрами.
  4. На протестированном графическом процессоре Nvidia TensorRT значительно превосходит конкурентов как для малых, так и для больших пакетов. На самом деле относительная скорость становится еще выше по мере увеличения размера партии. Это показывает, как инженеры Nvidia смогли лучше использовать аппаратные кэши во время вывода, поскольку память, занимаемая активациями, растет линейно с размером пакета, а правильное использование памяти может значительно повысить производительность.

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

Рекомендации

  • Speedster, инструмент с открытым исходным кодом для автоматического применения методов оптимизации SOTA для достижения максимального ускорения логического вывода на вашем оборудовании.
  • GitHub репозиторий с кодом для воспроизведения эксперимента по бенчмаркингу

___

Рекомендуемые чтения