我的目标是将编译好的动态库用于推导,因此,编译过程中所涉及的编译选项,能关闭的都将其关闭,尽量减少依赖。

Tensorflow 官方 Github 下载或 checkout 出 v1.8 版代码。

另外,我用到的工具 CMake v3.11.4CUDA v9.0cuDNN v7.0.5 及 Visual Studio 2015 Update 3。

在编译文件存放目录执行以下 CMake 命令来生成 Visual Studio 2015 项目文件:

cmake "${SOURCE_PATH}/tensorflow/contrib/cmake" ^
      -T "host=x64" ^
      -G "Visual Studio 14 2015 Win64" ^
      -Dtensorflow_ENABLE_SSL_SUPPORT=OFF ^
      -Dtensorflow_ENABLE_GRPC_SUPPORT=OFF ^
      -Dtensorflow_ENABLE_HDFS_SUPPORT=OFF ^
      -Dtensorflow_ENABLE_JEMALLOC_SUPPORT=OFF ^
      -Dtensorflow_BUILD_CC_EXAMPLE=OFF ^
      -Dtensorflow_BUILD_CC_TESTS=OFF ^
      -Dtensorflow_BUILD_PYTHON_TESTS=OFF ^
      -Dtensorflow_OPTIMIZE_FOR_NATIVE_ARCH=ON ^
      -Dtensorflow_WIN_CPU_SIMD_OPTIONS=/arch:AVX ^
      -Dtensorflow_BUILD_SHARED_LIB=ON ^
      -Dtensorflow_ENABLE_GPU=ON ^
      "-DCUDNN_HOME=%CUDA_PATH_V9_0%" ^
      -Dtensorflow_BUILD_PYTHON_BINDINGS=OFF ^
      "-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}"

${SOURCE_PATH} 替换为 Tensorflow v1.8 的源代码路径。

%CUDA_PATH_V9_0% 这个环境变量对应为 CUDA v9.0 的安装目录;该环境变量在 CUDA v9.0 安装时被自动设置。

${INSTALL_DIR} 替换为你希望最后生成 lib、dll 文件及头文件的存放目录。

不着急执行上述命令,因为有坑需要先进行修改。

提示找不到 cpp_shape_inference.pb.h 文件。

在文件在 tensorflow_BUILD_PYTHON_BINDINGS=ON 时会被生成,因此,我们模仿下,在 =OFF 时也进行生成就 OK 了。 修改 ${SOURCE_PATH}/tensorflow/contrib/cmake/tf_c.cmake 文件。

add_library(tf_c_python_api OBJECT
  "${tensorflow_source_dir}/tensorflow/c/python_api.cc"
  "${tensorflow_source_dir}/tensorflow/c/python_api.h"
)

修改为

function(RELATIVE_PROTOBUF_GENERATE_CPP SRCS HDRS ROOT_DIR)
  if(NOT ARGN)
    message(SEND_ERROR "Error: RELATIVE_PROTOBUF_GENERATE_CPP() called without any proto files")
    return()
  endif()

  set(${SRCS})
  set(${HDRS})
  foreach(FIL ${ARGN})
    set(ABS_FIL ${ROOT_DIR}/${FIL})
    get_filename_component(FIL_WE ${FIL} NAME_WE)
    get_filename_component(FIL_DIR ${ABS_FIL} PATH)
    file(RELATIVE_PATH REL_DIR ${ROOT_DIR} ${FIL_DIR})

    list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${REL_DIR}/${FIL_WE}.pb.cc")
    list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${REL_DIR}/${FIL_WE}.pb.h")

    add_custom_command(
      OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${REL_DIR}/${FIL_WE}.pb.cc"
             "${CMAKE_CURRENT_BINARY_DIR}/${REL_DIR}/${FIL_WE}.pb.h"
      COMMAND  ${PROTOBUF_PROTOC_EXECUTABLE}
      ARGS --cpp_out  ${CMAKE_CURRENT_BINARY_DIR} -I ${ROOT_DIR} ${ABS_FIL} -I ${PROTOBUF_INCLUDE_DIRS}
      DEPENDS ${ABS_FIL} protobuf
      COMMENT "Running C++ protocol buffer compiler on ${FIL}"
      VERBATIM )
  endforeach()

  set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE)
  set(${SRCS} ${${SRCS}} PARENT_SCOPE)
  set(${HDRS} ${${HDRS}} PARENT_SCOPE)
endfunction()

if (NOT tensorflow_BUILD_PYTHON_BINDINGS)
  set(tf_python_protos_cc_srcs tensorflow/python/framework/cpp_shape_inference.proto)
  RELATIVE_PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS
    ${tensorflow_source_dir} ${tf_python_protos_cc_srcs}
  )

  add_library(tf_c_python_api OBJECT
    ${PROTO_SRCS} ${PROTO_HDRS}
    "${tensorflow_source_dir}/tensorflow/c/python_api.cc"
    "${tensorflow_source_dir}/tensorflow/c/python_api.h"
  )
else()
  add_library(tf_c_python_api OBJECT
    "${tensorflow_source_dir}/tensorflow/c/python_api.cc"
    "${tensorflow_source_dir}/tensorflow/c/python_api.h"
  )
endif()

经过上述修改后再执行 CMake 命令来生成 Visual Studio 2015 项目文件。

接下打开 tensorflow.sln ,并编译 INSTALL 项目。或直接用命令进行编译:

msbuild INSTALL.vcxproj /t:build /p:configuration=Release /p:platform=x64 /m

这里还有个,如果你的内存不够,会提示 Faltal Error “compiler is out of heap space”。我试过,12 GB 内存会有此提示,32 GB 内存不会有此提示。

该问题是项目多进程编译引起的多编译进程叠加占用内存过高,单个进程不高,不过有时单个也会达到 6 GB。

其中占用内存最大的是编译 tf_core_kernels 的时候,因此,我们可以单独修改该项目的设置,该项目的 Properties -> C/C++ General -> Multi-processor Compilation 设置为 No。

另外,有个小,因为看一眼就知道被墙了,被墙的是 libpng-1.2.53.tar.gz 文件,该文件我们可以提前从 sourceforge 下好放编译目录下的 downloads 目录下。libpng-1.2.53.tar.gz 下载链接

好了,接下去愉快的编译吧!不过编译时间有点长,我 i7 处理器花了 5 个多小时。