Сбой сборки тензорного потока с отсутствующей ошибкой зависимости

Я совершенно новичок в bazel и tensorflow, поэтому решение этого может быть очевидным для кого-то с некоторым опытом. Моя сборка bazel для tensorflow завершается сбоем с сообщением об ошибке «отсутствует зависимость». Вот соответствующая последовательность команд сборки и вывод:

(tf-gpu)kss@linux-9c32:~/projects> git clone --recurse-submodules https://github.com/tensorflow/tensorflow tensorflow-nogpu
Cloning into 'tensorflow-nogpu'...
remote: Counting objects: 16735, done.
remote: Compressing objects: 100% (152/152), done.
remote: Total 16735 (delta 73), reused 0 (delta 0), pack-reused 16583
Receiving objects: 100% (16735/16735), 25.25 MiB | 911.00 KiB/s, done.
Resolving deltas: 100% (10889/10889), done.
Checking connectivity... done.
Submodule 'google/protobuf' (https://github.com/google/protobuf.git) registered for path 'google/protobuf'
Cloning into 'google/protobuf'...
remote: Counting objects: 30266, done.
remote: Compressing objects: 100% (113/113), done.
remote: Total 30266 (delta 57), reused 0 (delta 0), pack-reused 30151
Receiving objects: 100% (30266/30266), 28.90 MiB | 1.98 MiB/s, done.
Resolving deltas: 100% (20225/20225), done.
Checking connectivity... done.
Submodule path 'google/protobuf': checked out '0906f5d18a2548024b511eadcbb4cfc0ca56cd67'
(tf-gpu)kss@linux-9c32:~/projects> cd tensorflow-nogpu/
(tf-gpu)kss@linux-9c32:~/projects/tensorflow-nogpu> ./configure 
Please specify the location of python. [Default is /home/kss/.venv/tf-gpu/bin/python]: 
Do you wish to build TensorFlow with GPU support? [y/N] 
No GPU support will be enabled for TensorFlow
Configuration finished
(tf-gpu)kss@linux-9c32:~/projects/tensorflow-nogpu> bazel build -c opt //tensorflow/tools/pip_package:build_pip_package                                                        
Sending SIGTERM to previous Bazel server (pid=8491)... done.
....
INFO: Found 1 target...
ERROR: /home/kss/.cache/bazel/_bazel_kss/b97e0e942a10977a6b42467ea6712cbf/external/re2/BUILD:9:1: undeclared inclusion(s) in rule '@re2//:re2':
this rule is missing dependency declarations for the following files included by 'external/re2/re2/perl_groups.cc':
  '/usr/lib64/gcc/x86_64-suse-linux/4.8/include/stddef.h'
  '/usr/lib64/gcc/x86_64-suse-linux/4.8/include/stdarg.h'
  '/usr/lib64/gcc/x86_64-suse-linux/4.8/include/stdint.h'
  '/usr/lib64/gcc/x86_64-suse-linux/4.8/include/x86intrin.h'
  '/usr/lib64/gcc/x86_64-suse-linux/4.8/include/ia32intrin.h'
  '/usr/lib64/gcc/x86_64-suse-linux/4.8/include/mmintrin.h'
  '/usr/lib64/gcc/x86_64-suse-linux/4.8/include/xmmintrin.h'
  '/usr/lib64/gcc/x86_64-suse-linux/4.8/include/mm_malloc.h'
  '/usr/lib64/gcc/x86_64-suse-linux/4.8/include/emmintrin.h'
  '/usr/lib64/gcc/x86_64-suse-linux/4.8/include/immintrin.h'
  '/usr/lib64/gcc/x86_64-suse-linux/4.8/include/fxsrintrin.h'
  '/usr/lib64/gcc/x86_64-suse-linux/4.8/include/adxintrin.h'.
Target //tensorflow/tools/pip_package:build_pip_package failed to build
Use --verbose_failures to see the command lines of failed build steps.
INFO: Elapsed time: 144.661s, Critical Path: 1.18s
(tf-gpu)kss@linux-9c32:~/projects/tensorflow-nogpu> 

Я использую версию bazel release 0.1.4, я работаю на openSUSE 13.2. Я подтвердил, что файлы заголовков существуют, что, вероятно, ожидается:

(tf-gpu)kss@linux-9c32:~/projects/tensorflow-nogpu> ll /usr/lib64/gcc/x86_64-suse-linux/4.8/include/stddef.h
-rw-r--r-- 1 root root 13619 Oct  6  2014 /usr/lib64/gcc/x86_64-suse-linux/4.8/include/stddef.h

Примечание для тех, кто найдет этот вопрос:

Используйте ответ Дэмиена ниже, за исключением того, что вам нужно использовать --crosstool_top, а не --crosstool. Кроме того, если вы создаете ускорение графического процессора, вам также потребуется изменить файл CROSSTOOL в репозитории tensorflow, например:

(tf-gpu)kss@linux-9c32:~/projects/tensorflow-gpu> git diff third_party/gpus/crosstool/CROSSTOOL | cat
diff --git a/third_party/gpus/crosstool/CROSSTOOL b/third_party/gpus/crosstool/CROSSTOOL
index dfde7cd..b63f950 100644
--- a/third_party/gpus/crosstool/CROSSTOOL
+++ b/third_party/gpus/crosstool/CROSSTOOL
@@ -56,6 +56,7 @@ toolchain {
   cxx_builtin_include_directory: "/usr/lib/gcc/"
   cxx_builtin_include_directory: "/usr/local/include"
   cxx_builtin_include_directory: "/usr/include"
+  cxx_builtin_include_directory: "/usr/lib64/gcc"
   tool_path { name: "gcov" path: "/usr/bin/gcov" }

   # C(++) compiles invoke the compiler (as that is the one knowing where

person Keith    schedule 07.02.2016    source источник


Ответы (2)


Вы должны настроить компилятор C++.

Для этого лучше всего действовать следующим образом: отредактируйте файл tools/cpp/CROSSTOOL (https://github.com/bazelbuild/bazel/blob/master/tools/cpp/CROSSTOOL) из каталога пути вашего пакета (должен быть в ~/.bazel/base_workspace, можно найти с помощью bazel info package_path), чтобы добавить строку cxx_builtin_include_directory: /usr/lib64/gcc вокруг строки 100. (см. https://github.com/bazelbuild/bazel/blob/master/tools/cpp/CROSSTOOL#L101).

Затем echo "build --crosstool=//tools/cpp:toolchain" >>~/.bazelrc, а затем повторяет попытку сборки.

Извините за беспорядок, мы работаем над тем, чтобы набор инструментов C++ работал лучше из коробки.

person Damien Martin-Guillerez    schedule 08.02.2016
comment
(другой способ сделать это — скомпилировать пользовательскую версию bazel с этим изменением в файле CROSSTOOL). - person Damien Martin-Guillerez; 08.02.2016
comment
Большое спасибо за вашу помощь. Я попробовал предложенные вами модификации (в ответе, а не в комментарии), и компиляция сработала. Мне пришлось внести небольшое изменение в --crosstool_top, а не --crosstool, которое не распознается командой сборки. - person Keith; 09.02.2016
comment
Это продвинуло меня довольно далеко, но я все еще упираюсь в стену: `С++ компиляция правила '//tensorflow/python:py_func_lib' не удалось: gcc не удалось: ошибка при выполнении команды` - есть идеи, почему? - person tmsimont; 20.02.2016
comment
@tmsimont, это всего лишь выстрел в темноту, но вы установили библиотеки для разработки Python? - person Keith; 21.02.2016
comment
Привет, Кит, это хороший выстрел. Я узнал, что мне нужно обновить numpy, чтобы это работало, но теперь я все еще застрял с тем, что выглядит как еще одна проблема gcc. Я открыл проблема на github - person tmsimont; 21.02.2016

Bazel жалуется на файлы заголовков системы, потому что компилятор использует флаг -MD (в отличие от -MMD) при создании зависимостей. Хотя использование -MD разумно для среды, которая часто меняется, перечисление зависимости от системных заголовочных файлов вызывает ошибки «отсутствующие объявления зависимостей».

Мне помогло преобразование флага «-MD» в флаг «-MMD» в файлах-оболочках компилятора Third_Party/gpus/crosstool/clang/bin/crosstool_wrapper_driver_is_not_gcc.tpl непосредственно перед «subprocess.call([CPU_COMPILER]...)» :

cpu_compiler_flags = ['-MMD' if flag == '-MD' else flag for flag in cpu_compiler_flags]

и Third_Party/sycl/crosstool/computecpp.tpl, аналогичное место:

computecpp_device_compiler_flags = ['-MMD' if flag == '-MD' else flag for flag in computecpp_device_compiler_flags]
person Dmitry Baksheev    schedule 10.03.2017