ONNX (Open Neural Network Exchange) представляет собой открытый
формат для описания моделей машинного обучения, который обеспечивает
переносимость между различными фреймворками. Основой формата является
файл с расширением .onnx, который структурирован на базе
протокола Protocol Buffers (protobuf) и содержит
описание вычислительного графа, его узлов, входных и выходных тензоров,
а также метаданных модели.
Файлы ONNX сериализованы с использованием protobuf — эффективного бинарного формата для хранения структурированных данных. Преимущества protobuf:
В контексте ONNX protobuf хранит следующие ключевые структуры:
В ONNX каждая модель представлена ориентированным ациклическим графом (DAG), где:
Conv, Relu,
MatMul.Структура GraphProto включает:
node: массив NodeProto, описывающий последовательность
операций.initializer: массив TensorProto для хранения весов и
констант.input и output: массивы ValueInfoProto,
определяющие интерфейс модели.value_info: дополнительные промежуточные тензоры для
оптимизации и отладки.Каждый узел графа описывает единичную операцию, которая может иметь несколько входов и выходов. Основные компоненты NodeProto:
op_type: тип операции, например, Conv,
Add, Softmax.input и output: массивы строк с именами
входных и выходных тензоров.attribute: массив атрибутов, специфичных для конкретной
операции (например, ядро свертки или коэффициенты нормализации).name и doc_string: опциональные поля для
идентификации и документации узла.Особенность ONNX заключается в том, что узлы не содержат
данные напрямую, кроме константных тензоров, которые помещаются
в initializer. Это позволяет отделять структуру вычислений
от параметров модели.
Тензоры в ONNX — это фундаментальные объекты, через которые передаются данные между узлами. TensorProto описывает:
data_type): например,
FLOAT, INT32, UINT8.dims): массив целых
чисел, определяющий форму тензора.raw_data или массивы
конкретного типа, таких как float_data).name), связывающее тензор с
узлами графа.Тензоры, находящиеся в initializer, содержат
постоянные параметры модели, такие как веса сверточных
слоев, а остальные тензоры создаются динамически во время выполнения
графа.
Эта иерархия обеспечивает гибкость и совместимость ONNX с различными средами выполнения, включая ONNX Runtime Web, где вычисления выполняются прямо в браузере через JavaScript.
ONNX Runtime Web позволяет запускать модели ONNX в браузере:
.onnx файл, который
затем десериализуется в объекты NodeProto и TensorProto.Этот подход делает ONNX Runtime Web мощным инструментом для запуска
глубоких нейронных сетей и моделей машинного обучения непосредственно на
клиенте, сохраняя точность вычислений, заданную структурой
.onnx файла.