Рубрики
Без рубрики

Задача принято: построить тензорное пособие C привязку для Raspberry Pi в 2019 году

Поверьте мне. Настройка окружающей среды и здания Tensorflow C Binding для Raspberry Pi более COM … Теги с Tensorflow, MachineLearning, учебником, Python.

Поверьте мне. Настройка окружающей среды и создания Tensorflow C Связывание C Binding для Raspberry Pi более сложнее, чем обучение нейронной сети, которая делает меня богатым активами Robo-Tradings.

Мотивация

Поскольку SBCS (одноместный компьютер) становится все более мощным и дешевым, тем более вероятно, что мы захотят запускать на них более тяжелые вычисления. Людям нравится использовать такие термины, как «краевые вычисления», «встроенные HPC или ML» или аналогичные термины.

Нечто совершенно распространенное между всеми этими различными альтернативами SBCS – это использование процессоров ARM PLUS, а также какой-то тип графического процессора.

Классическим примером этого тяжелого вычисления является AI (искусственный интеллект) и ML (обучение машины). В этой области одна из самых используемых и принятых библиотеки – Google Tensorflow Отказ Такая библиотека написана в Python. Тем не менее, Есть также предварительные официальные двоичные файлы для C, Java и Go Отказ

API C обычно используется для привязки к другим языкам через FFI (Интерфейс иностранных функций). С моей точки зрения, это критический двоичный.

В настоящее время я разрабатываю/тестирую Связывание VasmallTalk, которая использует библиотеку C через FFI Отказ Я проверил на Linux X64, я проверил на Windows, а затем я хотел попробовать в Raspberry Pi 3B +, Pine64, Nvidia Jetson Nano и т. Д. Почему? Потому что я искренне верю, что это «встроен ML» (или что вы его называете), имеет значение. Бегущие алгоритмы обучения машины в машине 35USD кажутся мне интересными.

Жидкая ошибка: внутренний

Так что случилось? Я просто пошел на официальный сайт Tensorflow И ищите общую библиотеку. Угадай, что? Не было ни одного. Нуль. Нулевой. Ниль. Нет бинали для любой доски ARM. Я был так удивлен что Я спросил в Stackoverflow Отказ

Я понимаю, что там есть много досок для каждого с разными твердыми продуктами, программными водителями, драйверами, операционными системами и т. Д. Но я ожидал, по крайней мере, иметь его для некоторых очень распространенных, таких как Raspberry Pi и Nvidia Jetson Nano.

Во всяком случае … Вот как началось мое путешествие. Я не уверен, что мои труды будут полезны для других, но, по крайней мере, для моего будущего я, я уверен, что они будут.

Следующие разделы сортируются в порядке, которые я ищу решению.

Отказ от ответственности: Я не эксперт Tensorflow. Так что, если у вас есть какие-либо отзывы, пожалуйста, поделитесь!

Неудачная попытка 1.: Установите версию Python и извлечь общую библиотеку оттуда

С какой-то недавней версией Tensorflow Raspberry Pi/Raspbian официально поддерживается (я думаю .9). Тем не менее, единственные доступные «двоичные файлы» – это дисковые колеса Python. Я подозревал, что Python будет использовать C внизу Поэтому я устанавливаю версию Python непосредственно на моем PI следуя Официальные инструкции, использующие Пип :

pip3 install --user --upgrade tensorflow # install in $HOME

Затем я посмотрю в установленный каталог и нашел некоторые общие библиотеки!

cd /usr/local/lib/python3.5/dist-packages/tensorflow/python
ls -lah _pywrap_tensorflow_internal.so
-rwxr-xr-x 1 root staff 154M Jul  1 09:32 _pywrap_tensorflow_internal.so

Но угадайте, что? _pywrap_tensorflow_internal.so Не совпадает с общей библиотекой, нам нужна для подключения C ( libtensorflow.so.1.14.0 )

Я продолжал смотреть, а потом Я нашел установку с Docker Отказ Но опять же, можно только строить двоичные файлы для Python, а не для C.

После всех моих неудачных попыток, Я открыл дело на Github как «запрос на функцию».

Неудачная попытка 2: Ищете не являющиеся официальными биналью перед сборкой

Очевидный следующий шаг был … «Хорошо, если Google не делает этого, то кто-то другой должен». Я имею в виду…. SmallTalk – это не единственный, кто хочет связать против библиотеки C, верно?

Долго короткой истории, я нашел ничего. Я нашел этот , но это был только сборки Python (но он сказал, что может попытаться предоставить общие библиотеки … Так что оставайтесь в тюрьме!). Я тогда нашел этот Это будет работать по крайней мере для NVIDIA JETSON NANO (но у меня еще нет нано со мной). Я нашел еще один , но опять только Python.

Итак, вывод, я не нашел общую библиотеку для малины Pi где угодно. Если вы знаете о чем-то, пожалуйста, дайте мне знать. Что было хуже, было то, что большинство ответов были «вы лучше компилировать его». Это не звучит слишком плохо … Я имею в виду … Конечно, почему нет? Пока я не проверил официальный размер общей библиотеки Linux X64 и libtensorflow.so было 216 МБ. Whatttttttttt? В этот момент я думал: «Хорошо, это не будет легко».

Заброшенная попытка: построить с нуля на пи

Мой следующий очевидный шаг должен был попытаться построить с нуля на PI. Для этого я основал свою работу на Это очень полезное пошаговое руководство Отказ Тем не менее, прошел время с момента этого руководства, Tensorflow становится «немного проще» для создания на PI и поэтому некоторые инструкции от него больше не нужны. Кроме того, я нашел свои собственные проблемы, которые там не были адресованы.

Я рекомендую сначала прочитать это руководство, а затем продолжить здесь. Ниже приведен то, что я оказался, что похоже на этот гид.

Прежде чем начать, некоторые важные советы я рекомендую:

  • Иметь много бесплатных GBS на вашем диске PI.
  • Не забудьте не запускать ничего тяжелого на PI (DOUNDDOWN X, VNC, Docker, что можно использовать CPU или память).
  • Запустите сборку с SSH Отказ
  • Использовать TMUX Или аналогичный инструмент, потому что процесс занимает несколько часов (много часов), и поэтому вы, вероятно, захотите выключить вашу машину разработки и проверять статус PI на следующее утро.
  • Используйте тепловые раковины в вашем PI, если вы не хотите его сжигать.

Создание строителя: Bazel

Первое, что для создания TenSorflow вам нужен инструмент Bazel. Конечно: sudo apt-get install bazel , Правильно? хахахахахахах. РЖУ НЕ МОГУ. Я бы хотел, чтобы это было так просто. Еще раз, похоже, что нет базеля, готов к установке на PI. Так что вы должны сначала компилировать это. Хорошо … эта вещь становится мета. Мне нужно построить строитель … Что дальше? Чтобы скомпилировать ядро Linux, в котором я построю строитель? …

Теперь … для компиляции либо Bazel или Tensorflow, в обоих случаях, ОЗУ 1 ГБ вашего PI PI не будет достаточно. Таким образом, вы должны увеличить пространство подкачки. В упомянутом руководстве он устанавливает внешнюю USB-накопитель/жесткий диск/и т. Д. В моем случае я только что увеличил раздел подкачки с SD-карты до 2 ГБ. Но люди рекомендуют еще … как 8 ГБ (но у меня не было так много бесплатно):

sudo vim /etc/dphys-swapfile # change CONF_SWAPFILE to 2000
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start
free -m # confirm we have now 2000mb

ВАЖНО: Успех ли вы или нет с компиляцией Bazel и Tensorflow, очень важно, чтобы вы положили обратно оригинальный размер помещения ( conf_swapfile ), когда вы закончите. Иначе вы испортите Срок службы SD.

Компиляция базеля может занять несколько часов. Как только я закончу и начал компилировать Tensorflow, я получил замечательное сообщение:

Пожалуйста, понижайте понижение вашей установки Bazel до версии 0.21.0 или ниже, чтобы построить Tensorflow!

Ты шутишь, что ли?????? Я потратил часы, составив неправильную версию базеля? Fuc … Есть ли способ заранее знать, какой Bazel версия каждой версии Tensorflow? Я понятия не имею. Если вы знаете, пожалуйста, скажите мне. В любом случае, я начал справиться с версией, необходимой для версии Tensorflow, который я хотел (1.13.1):

mkdir bazel
cd bazel 
wget https://github.com/bazelbuild/bazel/releases/download/0.21.0/bazel-0.21.0-dist.zip
unzip bazel-0.21.0-dist.zip
env BAZEL_JAVAC_OPTS="-J-Xms384m -J-Xmx1024m" \
JAVA_TOOL_OPTS="-Xmx1024m" \
EXTRA_BAZEL_ARGS="--host_javabase=@local_jdk//:jdk" \
bash ./compile.sh
sudo cp output/bazel /usr/local/bin/bazel
cd ..
rm -rf bazel*

Варианты Java для памяти ( 1024 – это потому, что PI 3B + имеет 1 ГБ ОЗУ) необходимы, потому что другие компиляции просто не удаются (спасибо Fredletan за помощь). И нет, это не сходит с приятным «из памяти», но какая-то случайная ошибка. Я сообщил, что в проблеме GitHub.

Другая необходимая часть --host_javabase = @ local_jdk//: JDK . Я даже не помню, почему … это просто не будет работать без этого.

Если вам удастся сделать это, сохраните это Базель бинарный везде! Не теряйте его хахахаха. Опять же, если вы знаете где-нибудь, где я могу найти Bazel Pre-Bate Binaries для PI, пожалуйста, дайте мне знать.

Строительство Tensorflow

Первые шаги тривиальны:

git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git
cd tensorflow
git checkout v1.13.1
./configure

./configure Задам вам несколько вопросов о том, какую поддержку вы хотите добавить в компиляцию Tensorflow, вы собираетесь сделать. Ответы будут зависеть от оборудования, которое вы ориентируетесь. Для Raspberry Pi я думаю, что это нормально для простого ответа ЛОЖЬ всем из них:

Наблюдая за вопросами, вы можете получить представление о том, что вы в конечном итоге ответите за NVIDIA Jetson, Parallella Board и т. Д. И да, я хотел бы посмотреть, работает ли он на плате Parallella:

Жидкая ошибка: внутренний

Наконец, время запустить компиляцию. Нет, не хватай пива, вы закончите пьяным. Нет, не принимайте кофе … Вы будете пить столько кофеина, который вы не сможете спать на целую неделю.

bazel --host_jvm_args=-Xmx1024m --host_jvm_args=-Xms384m build \
--config opt --verbose_failures --jobs=3 --local_resources 1024,1.0,1.0 \
--copt=-mfpu=neon-vfpv4 \
--copt=-ftree-vectorize \
--copt=-funsafe-math-optimizations \
--copt=-ftree-loop-vectorize \
--copt=-fomit-frame-pointer \
--copt=-DRASPBERRY_PI \
--host_copt=-mfpu=neon-vfpv4 \
--host_copt=-ftree-vectorize \
--host_copt=-funsafe-math-optimizations \
--host_copt=-ftree-loop-vectorize \
--host_copt=-fomit-frame-pointer \
--host_copt=-DRASPBERRY_PI \
//tensorflow/tools/lib_package:libtensorflow

Некоторые интересные моменты об этом:

  • Большая часть --copt и --host_copt не были определены мной . Опять же, спасибо Свобода: Отказ Я уже объясняю, почему аргументы памяти Java.
  • –verbose_failures
  • Полезно, если наша сборка не может получить некоторое описание того, что пошло не так. –Local_Resources
  • Помогает указать «Сколько аппаратных ресурсов» для использования. Для меня он все еще не мог построить из-за низких ресурсов. Так что я закончил добавить
  • –jobs = 3 которые минимизируют использование ресурсов (но займет больше времени, очевидно). Я получил это из стопорного потока Отказ Интересно отметить, что наращивание колеса Python или общая библиотека – это почти тот же процесс. Единственное изменение в том, что вместо
  • //Tensorflow/Tools/lib_package: libtensorflow (для .so) Вы используете //Tensorflow/Tools/pip_package: build_pip_package чтобы получить колесо. Вот почему я любезнул просить тех, кто уже предоставлял колеса, чтобы также предоставить общие библиотеки. Этот процесс займет много много часов (в моем случае потребовалось более 20). Итак, иди спать и проверим следующее утро.

Это Должен Работа. Однако, как это было слишком много времени, я продолжал искать другие альтернативы, и я никогда не позволял процессу закончить. Поэтому я не могу подтвердить, что это работает. И теперь мой SD не имеет свободного места, и у меня уже есть работа .Со (Следующий раздел). Если вы попробуете, и это работает, дайте мне знать! В противном случае, я думаю, я попробую снова в ближайшее время.

Окончательная попытка: кросс-компиляция

Хотя я ждал компиляции на PI, чтобы закончить и страдать, наблюдая, как его зеленый светодиод постоянно включается часами и часами, я продолжал искать больше альтернатив. Случайно я прибыл в Официальная ссылка, которая показала, как пересекать Tensorflow для PI. (Я должен был видеть это раньше! Хахахахаха)

Просто чтобы понять, насколько сложно иметь все готовые условия, представьте, что процедура с компиляцией является использование Docker и начните от существующего изображения, которое они предоставляют …

Процедура выглядела очень простой: установить Docker, а затем запустить одну линию оболочки:

tensorflow/tools/ci_build/ci_build.sh PI \
    tensorflow/tools/ci_build/pi/build_raspberry_pi.sh

Прохладный. Это звучало волшебным. Слишком хорошо, чтобы быть правдой. Затем я был готов воспользоваться всеми моими 8 процессорами и 16 ГБ ОЗУ моего MBP. К сожалению, процесс никогда не закончен для меня. Каждый пробег потерпит неудачу в другом месте, и объяснение никогда не было понятно. Опять же, Я открыл дело на Github Но никакой ответ до сих пор нет.

Я собирался отказаться от всех моих попыток Tensorflow на ARM/SBC. Но у меня была одна последняя идея: попробуйте еще раз этой перекрестной компиляции с Docker, но теперь на виртуальной машине Linux, которая у меня была с Linux Mint 18.3. Конечно, этот виртуал никогда не будет так быстро, как это делать прямо на моем хосте (OSX), но он все еще должен быть намного быстрее, чем делать это на PI.

Назовите это чудом или нет, но через несколько часов это работало. Я успешно получил .так переместил его в PI, а затем запустить свои тесты. Все работало:

Жидкая ошибка: внутренний

Заключение

Я надеюсь, что Google официально выступил бы официально поставляется C DiNara, по крайней мере, для самых распространенных SBC, таких как Raspberry Pi или Jetson Nano. Если не то, что, я надеюсь, что некоторые из этих людей, уже компилирующих колеса для малины, могут компилировать общие библиотеки.

Наконец, тем не менее, я думаю, что это стоило для меня, изучая детали низкого уровня сборки с нуля. Почему? Поскольку есть много досок, я хотел бы поэкспериментировать с: RPI3, но с ARM 64 ОС (Armbian, Ubuntu Server 18.04 и др.), RPI4, Pine64, Jetson Nano и т. Д. Мы можем даже тестировать на NVIDIA JETSON TX2 !!! И для всех этих случаев я не смогу использовать перекрестную альтернативную нерезную коробку, потому что это предназначено только для PI.

Жидкая ошибка: внутренний

Я надеюсь, что мог бы помочь кому-то еще кроме моего будущего меня. Если у вас есть какие-либо отзывы, пожалуйста, поделитесь!

Обновление: см. Следующее сообщение об этой теме!

Оригинал: “https://dev.to/martinezpeck/challenge-accepted-build-tensorflow-c-binding-for-raspberry-pi-in-2019-4f89”