Порядок сборки:
- Загрузить образ с Ubuntu 19.10, для поддержки GPU так же нужно установить актуальный драйвер для видеокарты nvidia и желаемую версию
CUDA
иcuDNN
- Установить зависимости для Ubuntu (для сборки с поддержкой GPU так же нужны
gcc-7 g++-7
):
sudo apt-get update
sudo apt-get install -y python3.7 python3.7-dev python3-pip tzdata locales expect git wget unzip
- Установка зависимостей для Python 3:
sudo pip3 install six==1.12.0 numpy==1.18.1 wheel==0.32.3 setuptools==41.1.0 mock==4.0.1 future==0.18.2
sudo pip3 install keras_applications==1.0.8 keras_preprocessing==1.1.0 --no-deps
- Добавления вызова python 3.7 по команде python, без этого сборка может упасть с ошибкой
"/usr/bin/env: 'python': No such file or directory"
:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.7 2
- Для поддержки GPU: добавление ссылок на
gcc
иg++
7 версии (по умолчанию в Ubuntu 19.10 установленgcc-9
):
sudo ln -s /usr/bin/gcc-7 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-7 /usr/local/cuda/bin/g++
- Установка Bazel v0.24.1:
wget https://github.com/bazelbuild/bazel/releases/download/0.24.1/bazel-0.24.1-installer-linux-x86_64.sh
chmod +x bazel-0.24.1-installer-linux-x86_64.sh
sudo ./bazel-0.24.1-installer-linux-x86_64.sh
bazel version
- Загрузка репозитория TensorFlow:
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
git checkout r1.15
- Исправление ошибки
"fatbinary fatal : Unknown option '-bin2c-path'"
путём применения коммита"Make nccl bindings compilable with cuda 10.2"
изmaster
. Ошибка возникает из-за использованияCUDA 10.2
, которая по умолчанию не поддерживается TensorFlow (источник):
git config user.email "example@mail.com"
git config user.name "Name"
git cherry-pick 67edc16326d6328e7ef096e1b06f81dae1bfb816
- Исправление ошибки с
gRPC
"error: ambiguating new declaration of 'long int gettid()'"
путём применения патча из ишью на гитхабе. Ошибка возникает из-за того, что недавно библиотекаgRPC
была обновлена, изменились имена функций сgettid()
наsys_gettid()
в файлахsrc/core/lib/gpr/log_linux.cc
,src/core/lib/gpr/log_posix.cc
иsrc/core/lib/iomgr/ev_epollex_linux.cc
, но из-за старой версии, bazel это не учитывает (источник). Исправление так же должно работать с версиями2.0.1
и2.1.0
. Перед применением необходимо загрузить из данного репозитория файлыRename-gettid-functions.patch
иAdd-grpc-fix-for-gettid.patch
в папкуtensorflow
:
git apply Add-grpc-fix-for-gettid.patch
cp Rename-gettid-functions.patch tensorflow/third_party/Rename-gettid-functions.patch
- Конфигурация сборки:
./configure
- Сборка TensorFlow (самый долгий этап, в зависимости от железа длится от 1 до 8-10 часов), для поддержки GPU нужно добавить
"--config=cuda"
(некоторые возможные аргументы сборки можно посмотреть в README.md в подразделе "Дополнительные сведения"):
bazel build --config=opt --copt=-march=native --noincompatible_strict_action_env //tensorflow/tools/pip_package:build_pip_package
- Сборка пакета для Python, полученный
*.whl
файл будет помещён в папкуbuilt_packages
:
./bazel-bin/tensorflow/tools/pip_package/build_pip_package built_packages --project_name "tensorflow-cpu-custom-build1"
Готово. С вероятностью 99% полученный пакет будет успешно работать как минимум на той же машине, на которой выполнялась сборка :)