Развитие моделей машинного обучения заставляет нас использовать мощные устройства с графическими процессорами для минимизации времени вычислений, но, тем не менее, сложные модели требуют много времени для обучения и вычислений. 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. Это решение зависит от множества факторов и является компромиссом между точностью и временем вычислений, особенно для сложных моделей.