如何创建具有CUDA支持的Tensorflow最新版本的调试版本?

时间:2018-11-10 10:26:38

标签: c++ tensorflow build bazel debug-symbols

我尝试并尝试使用官方docker镜像(latest-cuda-devel-py3-> r1.12.0)为最新版本的Tensorflow创建调试版本,但似乎无济于事。最近有人为Tensorflow(> = r1.11.0)创建了成功的调试版本并可以分享他的方法吗?

这是我到目前为止尝试过的。

我基本上尝试遵循https://www.tensorflow.org/install/source上的说明,但是尝试修改它们以生成调试版本。我尝试过的一切都没有成功完成构建。

主机系统是具有大量RAM(例如512 GB RAM-> DGX-1)的Linux x86-64计算机。 Docker-Image中的CUDA版本为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和tensorrt安装。但是根本不运行./configure(在docker映像中)似乎会产生最佳结果(例如,我可以毫不费力地成功完成优化的构建)。

如果我按照确切的官方构建说明进行构建,即创建一个优化/无调试的构建,那么一切都会按预期进行。因此,运行以下命令似乎可以成功。

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

我遇到以下错误:

  

INFO:来自编译   tensorflow / contrib / framework / kernels / zero_initializer_op_gpu.cu.cc:   external / com_google_absl / absl / strings / string_view.h(496):错误:   constexpr函数返回的值不是恒定的

可以通过定义-DNDEBUG(参见nvcc error: string_view.h: constexpr function return is non-constant)来解决。

但是如果我运行以下命令:

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

在构建的最后一步,我得到了这些链接错误:

  

错误:   / tensorflow / python / BUILD: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):   输出中省略了其他重定位溢出   bazel-out / k8-dbg / bin / tensorflow / python / _pywrap_tensorflow_internal.so:   GOT PLT条目中PC相对偏移溢出   `_ZNK5Eigen10TensorBaseINS_9TensorMapINS_6TensorIKjLi1ELi1EiEELi16ENS_11MakePointerEEELi0EE9unaryExprINS_8internal11scalar_leftIjjN10tensorflow7functor14right_shift_opIjEEEEEEKK__ary_EkEE_NS_6TensorCwise   collect2:错误:ld返回1退出状态目标   // tensorflow / tools / pip_package:build_pip_package无法构建

我希望能够通过进行整体构建来解决该问题。所以我尝试了一下,并且得到了基本上相同的错误。

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

我还尝试了TensorFlow doesnt build with debug mode中的方法以及通过广泛的Google搜索发现的其他几种变体。我没办法了。

我会从1.11开始使用任何Tensorflow版本,包括(正在运行的)夜间构建。它只需要与x86 linux上的CUDA 9一起使用,包括调试符号和禁用的优化。

非常感谢您。

1 个答案:

答案 0 :(得分:2)

以防万一有人偶然发现了这个问题。我终于使用以下命令将其编译:

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

在那之后,安装变得有点麻烦,因为无法再制造轮子了。但是tensorflow构建仍然可以安装:

在构建车轮时,通过

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

该过程失败并显示一个错误,该错误似乎是python内置的zip压缩库的问题(即它无法压缩生成的归档文件,因为它太大了)。

无论如何都要运行它很重要,因为它只会在最后一步(归档)失败。运行build_pip_package时,它会在过程开始时立即打印到控制台,它是在一个临时目录(例如/ tmp / Shjwejweu)中构建软件包-该temp目录的内容可用于安装tf调试版本。只需将其复制到目标计算机,然后确保已删除任何旧的tensorflow软件包(例如pip卸载tensorflow),并在以下环境中运行:

python setup.py install

但是要小心,首先要主动卸载“ tensorflow”软件包,否则您将获得两个同时安装的tensorflow版本。.