无法在 Windows 上编译 TensorFlow 2.4.1 (CPP)

Can't make TensorFlow 2.4.1 (CPP) compile on Windows

我正在尝试在 Windows 10 上构建 TensorFlow 2.4.1 C++ API,但我遇到了问题。

到目前为止我做了什么:

  1. 从官方仓库下载 TensorFlow 源代码 https://github.com/tensorflow/tensorflow 并切换到官方v2.4.1标签
  2. 下载并安装 Python 3.6.8 x64
  3. 使用 python 3.6.8
  4. 创建了一个虚拟环境
  5. 根据数据 here
  6. 创建并安装 requirements.txt
  7. 下载并安装 CUDA 11.0 和 cuDNN v8.0.4.30(适用于 CUDA 11)
  8. 已下载并安装 msys2 并在 PATH 中设置它的位置
  9. 下载并安装 bazel (3.1.0),因为它是最新的 here

然后我运行配置过程跟python configure.py 我为 C++ 构建 (tensorflow_cc) 配置了 GPU 支持 在这里我遇到了一些问题,显然在配置过程中 windows 样式的反斜杠被接受为有效输入,但是当你实际 运行 bazel 编译时它们会导致问题,所以我重新运行我的配置以提供 linux 风格的反斜杠。至此CUDA和cuDNN检测成功,开始编译。

下面是我.tf_configure.bazelrc的全部内容

build --action_env PYTHON_BIN_PATH="D:/code/sdk/tensorflow/venv/Scripts/python.exe"
build --action_env PYTHON_LIB_PATH="D:/code/sdk/tensorflow/venv/lib/site-packages"
build --python_path="D:/code/sdk/tensorflow/venv/Scripts/python.exe"
build --config=xla
build --action_env TF_CUDA_VERSION="11.0"
build --action_env TF_CUDNN_VERSION="8.0.4"
build --action_env TF_CUDA_PATHS="C:/Program Files/NVIDIA GPU Computing 
Toolkit/CUDA/v11.0,D:/code/sdk/cudnn-11.0-windows-x64-v8.0.4.30/cuda"
build --action_env CUDA_TOOLKIT_PATH="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.0"
build --action_env TF_CUDA_COMPUTE_CAPABILITIES="5.0"
build --config=cuda
build:opt --copt=/arch:AVX
build:opt --host_copt=/arch:AVX
build:opt --define with_default_optimizations=true
build --define=override_eigen_strong_inline=true
test --flaky_test_attempts=3
test --test_size_filters=small,medium
test:v1 --test_tag_filters=-benchmark-test,-no_oss,-no_windows,-no_windows_gpu,-no_gpu,-oss_serial
test:v1 --build_tag_filters=-benchmark-test,-no_oss,-no_windows,-no_windows_gpu,-no_gpu
test:v2 --test_tag_filters=-benchmark-test,-no_oss,-no_windows,-no_windows_gpu,-no_gpu,-oss_serial,- 
v1only
test:v2 --build_tag_filters=-benchmark-test,-no_oss,-no_windows,-no_windows_gpu,-no_gpu,-v1only
build --action_env TF_CONFIGURE_IOS="0"

编译大约 20 分钟后失败,出现以下错误:

ERROR: D:/code/sdk/tensorflow/tensorflow/stream_executor/cuda/BUILD:366:1: C++ compilation of rule '//tensorflow/stream_executor/cuda:cudnn_stub' failed (Exit 2): python.exe failed: error executing command

而命令执行失败的原因是

bazel-out/x64_windows-opt/bin/external/local_config_cuda/cuda/_virtual_includes/cudnn_header\third_party/gpus/cudnn/cudnn.h(61): fatal error C1083: Cannot open include file: 'cudnn_ops_infer.h': No such file or directory

我想知道这是怎么回事?我已经提供了通往 cuDNN 的路径,但显然 bazel 并不真正了解它,即使它之前承认我提供的路径是正确的。我是否缺少一些需要设置以指示 cuDNN 位置的环境变量? 有人在 Windows 上构建过 TF C++ v2.4.1 吗?网上的信息太少了,甚至官方页面也没有提到 Windows 构建。只有 Linux 和 Mac...

因为我 运行 没有想法,所以我决定去看看 CUDA 的 Bazel 构建脚本

<REPO>\tensorflow\third_party\gpus\cuda_configure.bzl 中,我看到 cuDNN 路径是从环境变量中读取的 CUDNN_INSTALL_PATH 如果不存在,它将默认为 /usr/local/include?

无论如何,尝试了 set CUDNN_INSTALL_PATH=D:/code/sdk/cudnn-11.0-windows-x64-v8.0.4.30/cuda 并且 WOOHOO 它编译了!

(专业提示:设置环境变量时不要使用任何引号并使用 linux 样式的斜杠...)