Зависимости, зависимости и зависимости….

Зависимости пакетов в мире MXNet.

Это зависимость времени выполнения. Нет?
Это зависимость времени компиляции. Лол что?
Это статическая зависимость. Какого черта?
Если быть точным, это статическая зависимость времени сборки. Хорошо. Я сдаюсь!

Это был я с Сэмом Скалики примерно год назад, начиная с сегодняшнего дня; несколько часов в упражнении по выявлению зависимостей нашей среды глубокого обучения с открытым исходным кодом Apache MXNet.

Как мы здесь оказались?

Apache MXNet, это проект-инкубатор, рожденный на бумаге выпускников CMU. При оценке лицензий проекта как части внутреннего релиза в Amazon нам нужно было сначала определить все зависимости нашего проекта. Так мы начали очищать слои от пресловутой луковицы Apache MXNet.

Зависимости

  1. Исходные зависимости
  2. Статические зависимости во время компиляции
  3. Статические зависимости времени сборки
  4. Динамические зависимости во время выполнения

Исходные зависимости

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

Как определить?
Хотя стандартного способа узнать это не существует, в случае MXNet зависимости источника могут быть обнаружены с помощью

  1. Подмодули Github Repo [incubator-mxnet/3rdparty/*]
  2. Файлы лицензий / Лицензионные условия, включенные в исходный код

Примеры

  1. MS Coco API
  2. Кафе
  3. Rcnn
  4. Пакет MXNet Scala

Статические зависимости во время компиляции

Зависимости времени компиляции - это те зависимости, которые компилируются / связываются во время компиляции пакета mxnet.

Как определить?
Makefile или CMakeLists.txt: в зависимости от типа используемого инструмента построения.

Примеры

  1. Библиотека глубокой нейронной сети NVIDIA CUDA [cudNN]
  2. Библиотека коллективного общения NVIDIA [NCCL]

Статические зависимости времени сборки

Зависимости, которые загружаются / устанавливаются и статически связываются во время сборки двоичного файла MXNet, называются статическими зависимостями времени сборки.

Как определить?
Стандартной команды для обнаружения статической зависимости времени сборки не существует.

Для MXNet вы можете обнаружить зависимости времени сборки следующим образом

  1. После завершения сборки двоичного файла можно вручную проверить наличие строк, содержащих “Downloading …” в файле stdout.
  2. Последняя строка ссылки для общего объекта mxnet libmxnet.so

Пример фрагмента загрузки журналов во время сборки

Пример ссылки на libmxnet.so

Примеры

  1. OpenBLAS
  2. Злиб
  3. Libjpeg-turbo
  4. Glennrp / libpng
  5. Либтифф
  6. Openssl
  7. Завиток
  8. Собственный
  9. Opencv
  10. Google / protobuf
  11. Zeromq / libzmq
  12. lz4

Динамические зависимости во время выполнения

Зависимость времени выполнения - это пакет, который необходим MXNet при выполнении [или, как говорится в названии, «время выполнения»

ldd - это утилита * nix, которая печатает общие объекты [разделяемые библиотеки], необходимые для общего объекта [в нашем случае libmxnet.so]. Это отличная утилита командной строки для определения пакетов, необходимых для запуска / выполнения mxnet.

Вот образец библиотек зависимостей libmxnet.so, как сообщил ldd

Однако динамические зависимости времени выполнения, которые нас интересуют, - это те, которые включены в pip wheel [двоичное распределение mxnet]

Как обнаружить?

  1. Распаковать pip wheel
  2. Обнаружить .so в распакованном каталоге
unzip -l /path/to/wheel | grep *.so.*

Примеры

  1. libgfortran
  2. libquadmath
  3. OneDNN [ранее mkldnn / dnnl]