В этом руководстве мы рассмотрим, как использовать 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.