Оптимизация модели Transformer от начала до конца с помощью Hugging Face Optimum, ONNX Runtime и квантования

В этом руководстве мы рассмотрим, как использовать Hugging Face Optimum для оптимизации моделей Transformer, чтобы ускорить их работу, сохранив точность.

Подготовка среды

Сначала мы установим необходимые библиотеки и настроим среду для работы с Hugging Face Optimum и ONNX Runtime. Мы зададим пути, размер пакета и параметры итераций, а также проверим, работаем ли мы на CPU или GPU.

Загрузка данных

Мы загрузим срез валидации SST-2 и подготовим токенизацию, метрику точности и пакетную обработку.

Определение функций

Мы определим функции `run_eval` для вычисления точности любого предиктора и `bench` для прогрева и измерения времени вывода в реальном времени.

Запуск бенчмарков

Мы загрузим базовый классификатор PyTorch, определим помощник `pt_predict` и проведём бенчмарк/оценку на SST-2. Затем мы попробуем `torch.compile` для оптимизации графиков в реальном времени и, если удастся, запустим те же тесты, чтобы сравнить скорость и точность в идентичных условиях.

Экспорт модели в ONNX

Мы экспортируем модель в ONNX, запустим её с помощью ONNX Runtime, затем применим динамическое квантование с помощью Optimum’s ORTQuantizer и сравним, как улучшилась задержка, пока точность осталась сравнимой.

Проверка прогнозов

Мы проверим прогнозы с помощью быстрых конвейеров анализа настроений и напечатаем метки PyTorch и ONNX рядом.

Сводная таблица

Мы соберём сводную таблицу для сравнения задержки и точности по различным движкам, вставив результаты `torch.compile`, когда это возможно.

Примечания

  • `BetterTransformer` устарел в `transformers>=4.49`, поэтому мы его не используем.

  • Для больших выигрышей на GPU также попробуйте модели `FlashAttention2` или `FP8` с `TensorRT-LLM`.

  • Для CPU настройте потоки: установите `OMPNUMTHREADS/MKLNUMTHREADS`; попробуйте `NUMA pinning`.

  • Для статического (калиброванного) квантования используйте `QuantizationConfig(approach=’static’)` с набором калибровки.

Мы видим, как Optimum помогает нам преодолеть разрыв между стандартными моделями PyTorch и оптимизированными для производства развёртываниями. Мы достигаем ускорения с помощью ONNX Runtime и квантования, сохраняя точность, и также исследуем, как `torch.compile` обеспечивает выигрыш непосредственно в PyTorch.

Этот рабочий процесс демонстрирует практический подход к балансировке производительности и эффективности для моделей Transformer, обеспечивая основу, которую можно дополнительно расширить с помощью передовых бэкендов, таких как `OpenVINO` или `TensorRT`.

Полный код можно посмотреть здесь.

1. Какие инструменты и библиотеки используются для оптимизации моделей Transformer в данном руководстве?

Ответ: в данном руководстве для оптимизации моделей Transformer используются Hugging Face Optimum, ONNX Runtime и квантование.

2. Какие шаги включает в себя процесс подготовки среды для работы с Hugging Face Optimum и ONNX Runtime?

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

3. Какие функции определены для вычисления точности предиктора и измерения времени вывода в реальном времени?

Ответ: для вычисления точности предиктора определена функция `run_eval`, а для прогрева и измерения времени вывода в реальном времени — функция `bench`.

4. Какие шаги предпринимаются для экспорта модели в ONNX и сравнения задержки и точности при использовании ONNX Runtime?

Ответ: модель экспортируется в ONNX, затем запускается с помощью ONNX Runtime. После этого применяется динамическое квантование с помощью Optimum’s ORTQuantizer. Затем сравнивается, как улучшилась задержка, при этом точность остаётся сравнимой.

5. Какие дополнительные рекомендации даются для достижения ускорения на GPU и настройки производительности на CPU?

Ответ: для достижения ускорения на GPU рекомендуется попробовать модели FlashAttention2 или FP8 с TensorRT-LLM. Для настройки производительности на CPU предлагается установить OMPNUMTHREADS/MKLNUMTHREADS и попробовать NUMA pinning.

Источник