Анализ ONNX: как ускорить разработку алгоритмов глубокого обучения?

искусственный интеллект глубокое обучение
Анализ ONNX: как ускорить разработку алгоритмов глубокого обучения?

С тех пор, как AlphaGo победила чемпиона мира Ли Седоля, исследования в области искусственного интеллекта и глубокого обучения резко возросли.

1631865859589.jpg

Появляется головокружительное множество новых алгоритмов и сетевых моделей. Наряду с этим постоянно внедряются фреймворки для обучения и вывода глубокого обучения, наиболее известные из которых: CNTK от Microsoft, TensorFlow от Google, PyTorch от Facebook, CoreML от Apple, OpenVINO от Intel, cuDNN и TensorRT от NVIDIA, TNN и NCNN от Tencent, MNN от Ali. , и т.д.

Эти фреймворки имеют сходство, их входом является одна или группа многомерных данных, а данные выводятся после многослойного операционного блока. Платформа обучения поддерживает такие методы обучения, как BackPropogation, которые могут автоматически настраивать параметры модели для разработки алгоритма. Структура рассуждений может использоваться только для операций вывода модели и не может настраивать саму модель для развертывания алгоритма.

Из этих фреймворков название Google TensorFlow особенно эстетично. Многомерные данные — это тензор (Tensor), а работа и передача данных в многоуровневом операционном блоке — это поток (FLow).Увидеть это слово — все равно, что увидеть граф данных и операций (Computation Graph), который действительно замечательная рука.Отличная работа случайно. Все эти фреймворки должны создавать операторов и соединять этих операторов в определенном порядке, который можно назвать сетевой моделью.

Почему ОННКС?

Каждая инфраструктура глубокого обучения имеет свой собственный уникальный формат для интерпретации и хранения сетевых моделей, и эти фреймворки имеют разную направленность: некоторые для обучения обучению, а некоторые для развертывания логических выводов. При разработке алгоритмов глубокого обучения на разных этапах выбираются разные фреймворки, поэтому разные форматы описания моделей объективно вызывают трудности при разработке и реализации алгоритмов глубокого обучения.

Автор ранее разрабатывал алгоритмы глубоких нейронных сетей, а выбранной в то время обучающей средой является Caffe, которую необходимо развернуть на нескольких платформах, таких как Linux, iOS и Android. Linux выбирает cuDNN от Nvidia, iOS выбирает CoreML, Android выбирает NNAPI, а формат описания модели Caffe — caffemodel.

Он использует пользовательский Protobuf (GitHub.com/B VLC/Zhu Compound Curcuma/…), но очевидно, что ни cuDNN, ни CoreML, ни NNAPI не могут напрямую использовать caffemodel, а описание модели CoreML использует другое определение (инструменты каталога apple.GitHub.IO/core…), и cuDNN, и NNAPI являются механизмами логического вывода низкого уровня, которые требуют от пользователей сборки модели.

Для CoreML нам нужно преобразовать caffemodel в формат coremlmodel, для cuDNN и NNAPI нам нужно разобрать caffemodel, а затем собрать полную сетевую модель самостоятельно. Этот процесс громоздкий и подвержен ошибкам.В то время было сильное желание определить единый формат описания модели.В этом формате описываются все сетевые модели,обученные фреймворком обучения.При развертывании рассуждений на устройстве соответствующие рассуждения Движок поддерживает синтаксический анализ этого унифицированного формата описания и непосредственно завершает развертывание и посадку.Разве это не прекрасно.

Конечно, это непросто.Чтобы определить единый формат описания модели, нужно не только иметь глубокое понимание технологии машинного обучения, но и продвигать его как отраслевой стандарт де-факто, он должен иметь большое влияние в отрасли, и Не кто-то, как автор, может это сделать. К счастью, этим уже занимается сообщество Open Neural Network Exchange (ONNX).

По словам самого ONNX, ONNX — это промежуточное представление вычислительного графа. Предполагается, что он будет разработан как открытый формат описания сети, что уменьшит затраты на переключение между различными средами обучения и вывода, что позволит разработчикам сосредоточиться на алгоритмах и оптимизации. Хотя ONNX все еще находится на относительно ранней стадии, все больше и больше людей обращают на него внимание, и в будущем появятся возможности для его более широкого использования.

Описание вычислительной модели

ONNX имеет две категории: базовый ONNX в основном используется для описания нейронных сетей, а ONNX-ML является расширением базового ONNX, добавляя поддержку других алгоритмов машинного обучения, отличных от нейронных сетей. В этой статье не будет использоваться ONNX-ML.В следующем тексте используется простая модель ONNX в качестве примера, чтобы представить, как ONNX описывает вычислительную сеть. Модель можно скачать на Github ONNX (GitHub.com/о, тогда вы хотите/модели…).

Описание модели ONNX использует язык буфера протоколов Google. Самой внешней структурой является ModelProto, которая определяется следующим образом:

message ModelProto {
  int64 ir_version = 1;
  repeated OperatorSetIdProto opset_import = 8;
  string producer_name = 2;
  string producer_version = 3;
  string domain = 4;
  int64 model_version = 5;
  string doc_string = 6;
  GraphProto graph = 7;
  repeated StringStringEntryProto metadata_props = 14;
  repeated TrainingInfoProto training_info = 20;
  repeated FunctionProto functions = 25;
}

Наиболее важные поля: lr_version: версия текущего файла модели ONNX.Последняя выпущенная версия: IR_VERSION_2019_3_18 = 6. Выпущенная в 2019 году версия 7 все еще находится в разработке.opset_import: домен оператора, от которого зависит текущий файл модели, и version.graph: График операций, выполняемых этой моделью, это самое важное поле.

GraphProto определяется следующим образом:

message GraphProto {
  repeated NodeProto node = 1;
  string name = 2;   // namespace Graph
  repeated TensorProto initializer = 5;
  repeated SparseTensorProto sparse_initializer = 15;
  string doc_string = 10;
  repeated ValueInfoProto input = 11;
  repeated ValueInfoProto output = 12;
  repeated ValueInfoProto value_info = 13;
  repeated TensorAnnotation quantization_annotation = 14;
}

Более важными полями являются: initializer: параметры каждого сетевого слоя модели, и параметры фиксируются после завершения обучения модели input: формат ввода модели output: формат вывода модели nodes: определяет все операционные модули модели, расположенные в порядке рассуждений.

NodeProto определяется следующим образом:

message NodeProto {
  repeated string input = 1;    // namespace Value
  repeated string output = 2;   // namespace Value
  string name = 3;     // namespace Node
  string op_type = 4;  // namespace Operator
  string domain = 7;   // namespace Domain
  repeated AttributeProto attribute = 5;
  string doc_string = 6;
}

Более важными полями являются: input : имя входного параметра output : имя выходного параметра Здесь следует отметить, что связь между каждым сетевым уровнем устанавливается с использованием имени входа и выхода op_type : тип оператора .attributes : атрибуты оператора, разрешение которых зависит от типа оператора.

Самая сложная часть ONNX это описание различных операторов, что тоже понятно.Основной корпус нейронной сети это эти операторы.Атрибуты это набор атрибутов с именами операторов.В этой статье мы вводим mobilenetv2-7 .onnx использует больше всего операторов: conv.

Сверточная нейронная сеть добилась больших успехов в обработке речи, изображений, видео и т. д. Основными определениями атрибутов ONNX на слое сверточной сети являются: dilations: расширенная свертка, значение по умолчанию равно 1, то есть обычная свертка. математическое определение выглядит следующим образом

Обыкновенная свертка расширенная свертка
group: сгруппированная свертка, ее определение см. в ссылке 14. По умолчанию 1, то есть без группировки.kernel_shape: определяет размер ядра свертки.pads: определяет количество пикселей для заполнения вверх, вниз, влево и вправо. strides: определяет шаги операции свертки long.

Поддержка ONNX

Фреймворки обучения и логического вывода каждой компании все еще развиваются.Очевидно, что ONNX еще рано становиться отраслевым стандартом.Однако мы не видели других лучших форматов описания общей модели.Подведем краткий итог текущей поддержки ONNX (не всей) :

\

Reference

[1] ONNX: github.com/onnx/onnx

[2] TENSORFLOW: www.tensorflow.org/

[3] CNTK: GitHub.com/Microsoft/C…

[4] PYTORCH: pytorch.org/

[5] TNN: github.com/Tencent/TNN

[6] MNN: github.com/alibaba/MNN

[7] CUDNN: developer.nvidia.com/zh-cn/cudnn

[8] TENSORRT: developer.NVIDIA.com/This-talent/Это так неудобно…

[9] COREML: developer.apple.com/document ATI…

[10] NCNN: GitHub.com/Tencent/Вы можете…

[11] NNAPI: developer.Android.com/urethra/guides/…

[12] Protocol Buffers: Developers.Google.com/protocol - нет...

[13] Dilated Convolutions АР Вест V.org/ABS/1511.07…

[14] Dynamic Group Convolutions АР Вест V.org/ABS/2007.04…