Развитие моделей машинного обучения заставляет нас использовать мощные устройства с графическими процессорами для минимизации времени вычислений, но, тем не менее, сложные модели требуют много времени для обучения и вычислений. ONNXпредоставляет нам способ минимизировать время вычислений путем преобразования PyTorch, Tensor-Flow или подобных сложных моделей в формат .onnx. Если вы хотите пройти процесс конверсии, прочитайте мой предыдущий блог:
При преобразовании графа модели с использованием Onnx используются приближения. Эти приближения являются результатом нескольких вычислительных шагов на этапе преобразования. После преобразования выходные данные моделей onnx могут отличаться от исходных моделей (приблизительно). В случае сложных моделей, например. Преобразователи предложений, которые имеют слои пула в базовой архитектуре сверточной нейронной сети, эта разница в выходных данных может быть немного выше. Давайте углубимся в эксперименты и начнем с простой модели bert-base-case.
БЕРТ
Модель трансформаторов предварительно обучена на большом массиве данных на английском языке. Он обучается в режиме самоконтроля. После преобразования его в формат .onnx с помощью библиотеки HFOnnx с помощью txtai сравнение вывода оригинального PyTorch и Onnx выполняется с использованием следующей строки кода:
# Output in numpy format y1 = output_pytorch y2 = output_onnx # Absolute Difference y = abs(y1 - y2)
График абсолютной разницы показывает следующую меру ошибки:
Показатель ошибки или выходная разница малы, как видно по оси Y. Максимальная разница вложения составляет почти 4 µ (4 x 10 ^ -6). Таким образом, преобразование BERT работает хорошо и делает bert.onnx оптимизированным с точки зрения времени вычислений и точности.
Преобразователь предложений (все-MiniLM-L6-v2)
Пришло время рассмотреть сложную модель, то есть все-MiniLM-L6-v2 из семейства преобразователей предложений. Эта модель используется для сопоставления предложений и фраз с 384-мерным плотным векторным пространством. Модель довольно сложная из-за объединения слоев для объединенного вывода. Слои объединения включают функции активации, например. ReLU для преобразования вывода нейронной сети в объединенный вывод. Таким образом, onnx иногда портит преобразование при проверке этих слоев пула. Давайте сравним вывод моделей PyTorch и Onnx для преобразователя предложений (all-MiniLM-L6-v2), взяв абсолютную разницу обоих выходов:
# Absolute Difference y = abs(y1 - y2)
где y1 и y2 — выходные данные PyTorch и ONNX (массивы numpy). Разница в сюжете изображает:
Модель преобразования предложений ONNX имеет несколько большую меру погрешности, чем исходная модель PyTorch. Точно так же эта разница может варьироваться в зависимости от выбора преобразования (PyTorch в ONNX), выбора модели, типа проблемы (классификация, встраивание и т. д.) и характера вывода. Точность вывода преобразованной модели является компромиссом со временем вычислений. Если конечным требованием является минимизация времени вычисления сложной модели с небольшим компромиссом в отношении аппроксимации выходных данных, тогда ONNX — хороший выбор. С другой стороны, если не должно быть компромисса с точностью вывода, PyTorch следует использовать в случае сложной модели, ставящей под угрозу вычислительное время. Ситуацию можно описать так:
Если вы не можете бороться с разницей, примите ее и двигайтесь дальше…
Заключение
ONNX обеспечивает оптимальный способ преобразования модели и минимизирует время вычислений, но оценки во время преобразования влияют на выходные данные моделей. Разница между исходным выводом и выводом модели onnx является приблизительной, но в некоторых сценариях приблизительные значения неприемлемы. Таким образом, надлежащее исследование требований, разработанного решения, факторов оптимизации и разницы в выходе может помочь принять окончательное решение между исходной моделью или моделью ONNX. Это решение зависит от множества факторов и является компромиссом между точностью и временем вычислений, особенно для сложных моделей.