Компания Amazon представила (http://www.tvmlang.org/2017/10/06/nnvm-compiler-announcement...) компилятор NNVM (https://github.com/dmlc/nnvm), предназначенный для компиляции предоставляемых системами машинного обучения высокоуровневых графов вычислений в оптимизированный набор машинных кодов. Код проекта распространяется (https://github.com/dmlc/nnvm) под лицензией Apache 2.0.
Система поддерживает компиляцию моделей в форматах OpenML (https://www.openml.org/) (поддерживаются фреймворки Keras (https://keras.io/) и Caffe (http://caffe.berkeleyvision.org/)), Apache MXNet (http://mxnet.io/) и недавно представленного (https://www.opennet.dev/opennews/art.shtml?num=47166) FaceBook и Microsoft открытого формата ONNX (Open Neural Network Exchange), при помощи которого могут передавать модели обучения из фреймворков Caffe2 (https://www.opennet.dev/opennews/art.shtml?num=46406), PyTorch (http://pytorch.org/) и CNTK (https://www.opennet.dev/opennews/art.shtml?num=43756) (Cognitive Toolkit). На выходе может генерироваться код для различных бэкендов, включая ядра для вычислений на стороне GPU при помощи CUDA, OpenCL и Metal, а также промежуточный код LLVM, на основе которого могут формироваться машинные инструкции для архитектур x86 и ARM или представление WebAssembly.
Компиляция включает в себя несколько стадий:
- Формирование промежуточного представления графа вычислений на основе данных, полученных от различных фреймворков машинного обучения.
- Оптимизация полученного графа вычислений и выделение операторов с подпрограммами обработки данных в графе.
- Компиляция операторов в исполняемые модули и развёртывание для различных аппаратных бэкендов с минимальными зависимостями. Для построения кода на основе промежуточного представления используется стек TVM (https://github.com/dmlc/tvm/), предоставляющий предметно ориентированный язык для обеспечения работы используемых в модели операторов при помощи набора базовых реализаций, оптимизированных для различных целевых аппаратных платформ, а также вычислительных примитивов, таких как многопоточность, кэширование и разбиение циклов на блоки (tiling).
Архитектура NNVM позволяет легко добавлять новые фронтэнды, операторы и оптимизации графа, без необходимости изменения базовых интерфейсов. Полученные после компиляции модули могут быть сгенерированы в виде кода на c++, python, javascript, java, objective-c для запуска на серверах, мобильных устройствах, встраиваемых системах и в web-браузере.
Проведение тестирования генерации кода для CPU ARM и GPU NVIDIA показало, что формируемый компилятором итоговый код превосходит по производительности фреймворк MXNet. Размер формируемого модуля зависит в основном от размера runtime TVM, который при сборки для Raspberry Pi и мобильных устройств занимает около 300 Кб.
URL: https://aws.amazon.com/blogs/ai/introducing-nnvm-compiler-a-.../
Новость: http://www.opennet.dev/opennews/art.shtml?num=47351