g ++无法在Windows上(从已安装的二进制文件)构建自定义TensorFlow GPU op

时间:2018-06-21 11:38:33

标签: python c++ tensorflow

我正在尝试为Windows 10(内部版本17134)上的TensorFlow编译自定义GPU op,并使用pip3 -install --upgrade tensorflow-gpu安装TensorFlow,但似乎无法编译.so库文件以进行加载在我的脚本后面。

我已经准备了两个示例文件:一个带有op设置的add_one.cc file和一个带有GPU内核代码和启动器的cuda_op_kernel.cu file

现在,我同时关注了the official TensorFlow guide herethis other guide以及上一篇文章中列出的其他文章,但是我仍然无法获得自定义操作来正确编译。

在TensorFlow官方文档中,有一段用于从二进制文件而不是从源文件安装TensorFlow时构建自定义操作(这就是我的情况)。这是他们的脚本:

TF_CFLAGS=( $(python -c 'import tensorflow as tf; print(" ".join(tf.sysconfig.get_compile_flags()))') )
TF_LFLAGS=( $(python -c 'import tensorflow as tf; print(" ".join(tf.sysconfig.get_link_flags()))') )
g++ -std=c++11 -shared zero_out.cc -o zero_out.so -fPIC ${TF_CFLAGS[@]} ${TF_LFLAGS[@]} -O2

现在,当然不能在Windows上正常工作,所以这就是我尝试过的(请注意,自定义构建脚本和对构建问题进行故障排除绝对不是我的强项):

  1. 下载了MinGW,其中包含g ++编译器(版本7.3.0)并将其添加到我的系统路径中。
  2. 这些${TF_CFLAGS[@]}命令是一项Bash功能,在Windows上的cmd中当然不可用。因此,我只是预先手动执行了这些Python代码段,并使用这些附加的编译器标志来保留结果字符串。
  3. 准备了完整的构建命令,将所有这些标志放在一起并尝试执行它。

这是结果命令:

g++ -std=c++11 add_one.cc -o add_one.so -fPIC -IC:\Users\Sergio\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\include -D_GLIBCXX_USE_CXX11_ABI=0 -LC:\Users\Sergio\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow -ltensorflow_framework -O2
  

请注意,我已经从原始脚本中删除了输入文件名之前的-,因为这使g ++失败并显示“无法识别的命令行选项'-add_one.cc'”消息。是因为我想念-而把它放在那儿,还是我应该用其他东西代替它?

现在,执行上面的命令只会引发大量错误,here's the full output

我在这里很茫然,我不确定如何从这里继续。很可能是我只是缺少一些要在构建脚本中配置的东西,但我无法弄清楚。感谢您的帮助!

编辑#1:因此,我已经安装了VS2017社区,并尝试了两种不同的方法来构建所需的.so库文件( spoiler:无作用)。

  1. 尝试在上述构建命令中将g++替换为cpp。这成功创建了.so文件(至少是这样),而没有任何警告/错误。 但是,当我尝试使用tf.load_op_library加载该.so文件时,弹出一个错误窗口,提示诸如“无效的图像-该.so文件不能在Windows或Windows上使用。它包含一个错误”。在阅读了有关StackOverflow的有关Windows上TensorFlow的讨论之后,在自定义op上使用.dll文件而不是.so文件,然后,我尝试使用相同的脚本编译.dll文件。同样,.dll构建良好,但是TensorFlow在尝试加载库时报告了相同的错误。
  2. 试图使用CMake和CMake构建脚本。 Here's the code,主要来自here。当我得到this output时,这个似乎正常工作,而CMakes创建了a bunch of files and VS projects。但是,当我用VS打开生成的项目并尝试构建它时,出现此错误:
  

nvcc fatal:Microsoft Visual Studio 2013和更早版本仅支持32位编译

这似乎很不言自明,所以我再次尝试通过在-m64 CMake脚本的编译标志中添加CMakeLists.txt(希望在调用nvcc时将其保留下来),但是我仍然得到同样的错误。还尝试将VS构建平台设置为x64,但这也不起作用。要使nvcc以64位模式编译GPU内核,我还需要做些其他事情吗?

编辑#2:取得了一些进步。对于x64平台,我发现在调用CMake时添加-DCMAKE_GENERATOR_PLATFORM=x64可以解决此问题并调用x64编译器。我还从此处删除了对MSBuild较高版本的检查:

  

C:\ Program Files \ NVIDIA GPU计算工具包\ CUDA \ v9.0 \ include \ crt

在133行附近,如果检测到的MSBuild版本高于1911,则代码将失败,因此在使用最新版本的VS2017时,代码也将被破坏。

我想我现在应该很接近了,代码似乎正在使用MSBuild /p:Configuration=Release add_one.vcxproj进行编译,但是整个过程未能在MSVC\include\type_traits文件(?)中引发很多错误,请参见{{ 3}}。

编辑#3:我发现该文件的问题是由VS2017不正确支持CUDA 9.0引起的,因此我也安装了VS2015并使用了以下命令:

CMake CMakeLists.txt -DCMAKE_GENERATOR_PLATFORM=x64 -G "Visual Studio 14 2015"

这样做之后,nvcc错误似乎已修复。 但是,我仍然无法正确构建该库。我遇到的第一个错误是由于未正确执行.cc文件中的导入引起的。我发现CMake自动添加路径存在一些问题,因此我通过在CMake文件中手动添加以下行来解决了这一问题:

include_directories("C:/Program Files/Python36/lib/site-packages/tensorflow/include")

尽管如此,构建也会因以下错误而失败:

  

C:\ Program Files \ Python36 \ lib \ site-packages \ tensorflow \ include \ tensorflow / core / platform / default / mutex.h(25):致命   ror C1083:无法打开包含文件:'nsync_cv.h':没有这样的文件或目录[C:\ Users \ Sergi \ Documents   \ op \ test \ add_one.vcxproj]

我试图在整个tensorflow安装文件夹中查找“ nsync_cv.h”,但它并不存在。我不确定目前还可以尝试什么。

编辑#4:更改了方法,并尝试使用TensorFlow源构建操作。我遵循了guschmue提供的示例代码,设置了我的环境(VS2015,Anaconda 3 4.1.1和建议的所有其他工具,尽管我不得不使用CUDA 9.0,因为8.0版本只是拒绝安装),按照说明进行操作并构建了TensorFlow 。然后,我尝试构建自定义操作,但现在失败,并显示以下错误:

  

add_one.obj:错误LNK2019:riferimento al simbolo esterno“ void __cdecl AddOneKernelLauncher(float const *,int,int,   int,int,float *)“(?AddOneKernelLauncher @@ YAXPEBMHHHHPEAM @ Z)non risolto nella funzione” public:virtual void __cdecl A   ddOneOpGPU :: Compute(tensorflow :: OpKernelContext *)“(?Compute @ AddOneOpGPU @@ UEAAXPEAVOpKernelContext @ tensorflow @@@   Z)[C:\ Users \ Sergio \ Documents \ GitHub \ tensorflow \ tensorflow \ contrib \ cmake \ user_ops_gen_python.vcxproj]

不确定,因为该功能的实现位于user_op文件夹中的.cu文件中,并且文件路径也位于cmake文件中。 a screenshot here用于该cmake文件,以防万一。

0 个答案:

没有答案