Как мне создать отладочную версию последней версии Tensorflow с поддержкой CUDA? - PullRequest
0 голосов
/ 10 ноября 2018

Я пытался и пытался создать отладочную сборку для последней версии Tensorflow, используя официальные образы докера (latest-cuda-devel-py3 -> r1.12.0), но, похоже, ничего не работает. Кто-то недавно создал успешную отладочную сборку для Tensorflow (> = r1.11.0) и может поделиться своим подходом?

Это то, что я пробовал до сих пор.

Я в основном пытался следовать инструкциям на https://www.tensorflow.org/install/source,, но пытался изменить их для создания отладочной сборки. Ничто из того, что я пробовал, не привело к успешной сборке.

Хост-система - это компьютер Linux x86-64 с большим количеством оперативной памяти (например, 512 ГБ ОЗУ -> DGX-1). Версия CUDA в Docker-Image - CUDA-9.0. Последняя "последняя" версия Tensorflow, которая находится внутри образа док-станции: r1.12.0

Для работы cuda-build мне нужно было использовать "nvidia-docker", в противном случае я получаю ошибку компоновщика с "libcuda.so.1".

Я начал так:

nvidia-docker pull tensorflow/tensorflow:latest-devel-gpu-py3
nvidia-docker run --runtime=nvidia -it -w /tensorflow -v $PWD:/mnt -e HOST_PERMS="$(id -u):$(id -g)" \
    tensorflow/tensorflow:latest-devel-gpu-py3 bash

Затем я попытался настроить проект, используя

cd /tensorflow
./configure

Я пробовал разные конфиги. Я пытался сохранить все значения по умолчанию. Я попытался включить только те части, которые мне нужны. Я пытался не работает ./configure вообще. Я указал на мою собственную установку cuda-9.0 и tennsrt. Но не работает ./configure вообще (в образе докера), кажется, дает лучшие результаты (например, я могу делать оптимизированные сборки успешно с наименьшими усилиями).

Если я собираю его, используя точные официальные инструкции по сборке, т. Е. Создавая оптимизированную / не отладочную сборку, все работает как положено. Таким образом, запуск следующего выглядит успешным.

bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

То же самое, если я запускаю следующее, которое включает в себя информацию отладки, но не отключает оптимизацию (например, я не могу использовать это в целях отладки).

bazel build --config cuda --strip=never -c opt --copt="-ggdb"  //tensorflow/tools/pip_package:build_pip_package

Но все, что отключает оптимизацию, похоже, не работает. Если я запускаю следующее (с или без флага --strip = never)

bazel build --config cuda --strip=never -c dbg
//tensorflow/tools/pip_package:build_pip_package

Я получаю следующую ошибку:

ИНФОРМАЦИЯ: из компиляции tensorflow / вно / рамки / ядра / zero_initializer_op_gpu.cu.cc: external / com_google_absl / absl / strings / string_view.h (496): ошибка: Возвращение функции constexpr непостоянно

Что можно решить, определив -DNDEBUG (см. Ошибка nvcc: string_view.h: возврат функции constexpr не является константным ).

Но если я выполню следующее:

bazel build --config cuda --strip=never -c dbg --copt="-DNDEBUG"  //tensorflow/tools/pip_package:build_pip_package

Я получаю следующие ошибки компоновки на последнем этапе сборки:

ОШИБКА: / Tensorflow / Python / Сложение: 3865: 1: Связывание правила "//tensorflow/python:_pywrap_tensorflow_internal.so" не удалось (выход 1) /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o: в функция _init': (.init+0x7): relocation truncated to fit: R_X86_64_REX_GOTPCRELX against undefined symbol gmon_start ' /usr/lib/gcc/x86_64-linux-gnu/5/crtbeginS.o: в функции deregister_tm_clones': crtstuff.c:(.text+0x3): relocation truncated to fit: R_X86_64_PC32 against .tm_clone_table» crtstuff.c :(. text + 0xa): перемещение сокращено, чтобы соответствовать: R_X86_64_PC32 против символа __TMC_END__' defined in .nvFatBinSegment section in bazel-out/k8-dbg/bin/tensorflow/python/_pywrap_tensorflow_internal.so crtstuff.c:(.text+0x1e): relocation truncated to fit: R_X86_64_REX_GOTPCRELX against undefined symbol _ITM_deregisterTMCloneTable ' /usr/lib/gcc/x86_64-linux-gnu/5/crtbeginS.o: в функции register_tm_clones': crtstuff.c:(.text+0x43): relocation truncated to fit: R_X86_64_PC32 against .tm_clone_table 'crtstuff.c :(. Text + 0x4a): перемещение усечено до соответствия: R_X86_64_PC32 относительно символа __TMC_END__' defined in .nvFatBinSegment section in bazel-out/k8-dbg/bin/tensorflow/python/_pywrap_tensorflow_internal.so crtstuff.c:(.text+0x6b): relocation truncated to fit: R_X86_64_REX_GOTPCRELX against undefined symbol _ITM_registerTMCloneTable» /usr/lib/gcc/x86_64-linux-gnu/5/crtbeginS.o: в функции __do_global_dtors_aux': crtstuff.c:(.text+0x92): relocation truncated to fit: R_X86_64_PC32 against .bss 'crtstuff.c :(. Text + 0x9c): перемещение усечено до соответствия: R_X86_64_GOTPCREL против символа __cxa_finalize@@GLIBC_2.2.5' defined in .text section in /lib/x86_64-linux-gnu/libc.so.6 crtstuff.c:(.text+0xaa): relocation truncated to fit: R_X86_64_PC32 against symbol __dso_handle 'определено в разделе .data.rel.local в /usr/lib/gcc/x86_64-linux-gnu/5/crtbeginS.o crtstuff.c :(. text + 0xbb): дополнительные переполнения перемещения исключены из вывода Базэл выход / K8-DBG / бен / tensorflow / питон / _pywrap_tensorflow_internal.so: Относительное смещение с ПК в записи GOT PLT для `_ZNK5Eigen10TensorBaseINS_9TensorMapINS_6TensorIKjLi1ELi1EiEELi16ENS_11MakePointerEEELi0EE9unaryExprINS_8internal11scalar_leftIjjN10tensorflow7functor14right_shift_opIjEEEEEEKNS_18TensorCwiseUnaryOpIT_KS6_EERKSH_» collect2: error: ld вернул 1 состояние выхода Цель // tenorflow / tools / pip_package: сборка build_pip_package не смогла собрать

Я надеялся, что смогу решить это, выполнив монолитную сборку. Поэтому я попробовал это, и получил по существу ту же ошибку.

bazel build --config cuda -c dbg --config=monolithic --copt="-DNDEBUG"  //tensorflow/tools/pip_package:build_pip_package

Я также попробовал подходы из TensorFlow не строит с режимом отладки и несколькими другими вариантами, которые я нашел путем интенсивного поиска в Google. У меня заканчиваются варианты.

Я бы взял любую версию Tensorflow начиная с 1.11, включая (работающие) ночные сборки. Он просто должен работать с CUDA 9 в Linux x86, включать символы отладки и отключенные оптимизации.

Большое спасибо заранее.

1 Ответ

0 голосов
/ 10 ноября 2018

На тот случай, если кто-то еще наткнется на эту проблему. Я наконец получил его для компиляции, используя следующую команду:

bazel build --config cuda --strip=never --copt="-DNDEBUG" --copt="-march=native" --copt="-Og" --copt="-g3" --copt="-mcmodel=medium" --copt="-fPIC"  //tensorflow/tools/pip_package:build_pip_package

После этого установка становится немного затруднительной, поскольку колесо больше не может быть построено. Но сборку tenorflow можно установить в любом случае:

При сборке колеса через

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

Процесс завершается с ошибкой, которая, по-видимому, является проблемой встроенной библиотеки сжатия zip в python (т.е. она не может сжать результирующий архив, так как он слишком большой).

Важно запустить его в любом случае, так как он завершается неудачей только на последнем этапе (архивирование). При запуске build_pip_package он выводит на консоль прямо в начале процесса, что он собирает пакет во временный каталог (скажем, / tmp / Shjwejweu) - содержимое этого временного каталога можно использовать для установки отладочной версии tf. Просто скопируйте его на целевой компьютер, затем убедитесь, что у вас удален какой-либо старый пакет tenorflow (например, pip uninstall tenorflow), и запустите его в пределах:

python setup.py install

Но будьте осторожны, чтобы сначала активно деинсталлировать пакет tenorflow, иначе вы можете получить две одновременно установленные версии tenorflow.

...