Tensorflow源代码构建配置失败:找不到任何与cuda.h匹配的版本和字典值错误



我正在尝试从源代码构建Tensorflow,因为我有一个6.1计算能力的GPU,但我的CPU不支持AVX命令。我第一次尝试使用docker容器失败了,因为Tensorflow无法在Tensorflow上导入:最新的jupyter gpu也无法。我已经安装并验证了CUDA驱动程序,并从nvidia网站手动安装了CUDA驱动程序。根据nvidia-smi的输出,当前安装为 NVIDIA-SMI 450.51.05 Driver Version: 450.51.05 CUDA Version: 11.0。此外,我已经按照本指南安装并验证了CUDA 11的cunn-8.0.1的安装。我的系统运行Linux Mint 19.1。我已经下载了TF源代码,并检查了分支r2.2来构建相应的版本。尽管提出了通过Bazelisk安装Bazel的方法(根据本指南(,但唯一有效的方法是应用命令

cd "/home/user/.bazel/bin" && curl -LO https://releases.bazel.build/2.0.0/release/bazel-2.0.0-linux-x86_64 && chmod +x bazel-2.0.0-linux-x86_64

然而,在配置构建中,我必须处理两个问题:

  1. 在选择支持的库时,如果只从4个受质疑的库中选择CUDA,我会得到以下错误:
File "./configure.py", line 1440, in main
    if validate_cuda_config(environ_cp):
  File "./configure.py", line 1323, in validate_cuda_config
    tuple(line.decode('ascii').rstrip().split(': ')) for line in proc.stdout)
ValueError: dictionary update sequence element #9 has length 1; 2 is required

因此,我必须选择至少两个库(CUDA和TensorRT(。

  1. 如果选择了这两个库,则脚本将继续,但会出现以下消息Could not find any NvInferVersion.h matching version '' in any subdirectory。在相应的脚本提示下提供CUDA和cudnn版本后,我在系统中找到了cudnn.hcuda.h路径,并在其他脚本提示中添加了它们的路径,从而成功地继续进行:
Please specify the comma-separated list of base paths to look for CUDA libraries and headers. [Leave empty to use the default]: /usr/local/cuda-11.0/targets/x86_64-linux/include/cuda.h,/usr/include/hwloc/cuda.h,/usr/local/cuda-11.0/targets/x86_64-linux/include/cudnn.h,/usr/include/cudnn.h,/usr/include/linux,/usr/local/cuda/include

然而,由于脚本不断失败,我无法继续进行任何操作,并显示消息:

Could not find any cuda.h matching version '11' in any subdirectory:
        ''
        'include'
        'include/cuda'
        'include/*-linux-gnu'
        'extras/CUPTI/include'
        'include/cuda/CUPTI'
of:
        '/usr/include/hwloc/cuda.h'
        '/usr/local/cuda-11.0/targets/x86_64-linux/include/cuda.h'
        '/usr/local/cuda-11.0/targets/x86_64-linux/include/cudnn.h'
Asking for detailed CUDA configuration...

有关于如何继续的提示吗?我必须提供哪些路径?

谢谢!

我最近遇到了同样的问题:

File "./configure.py", line 1440, in main
    if validate_cuda_config(environ_cp):
  File "./configure.py", line 1323, in validate_cuda_config
    tuple(line.decode('ascii').rstrip().split(': ')) for line in proc.stdout)
ValueError: dictionary update sequence element #9 has length 1; 2 is required`

我认为这意味着我的CUDA和Cudnn版本不符合构建tensorflow gpu的需求。请在"configure.py"中找到他们的正确版本。TensorRT不是必不可少的。

因此,CUDA 11显然没有像前面的答案所说的那样在某些标头中引用cudnn版本,这实际上阻碍了元组的创建。发生这种情况是因为缺少第二个元素(实际版本号(,然后配置崩溃。

因此,您必须以某种方式将cudnn版本号解析为tensorflow中的配置文件。我所做的是对cudnn版本进行硬编码,只是用你的版本替换"8.1"。

我用以下代码替换了config.py文件tuple(line.decode('ascii').rstrip().split(': ')) for line in proc.stdout)中的1323行。我相信有一种非常有效的方法来写这篇文章。

  config = {}
  for line in proc.stdout:
    parameter_split = line.decode('ascii').rstrip().split(': ')
    if len(parameter_split) == 1:
        # had to manually add here the cudnn version
        config[parameter_split[0][:-1]] = '8.1'
    else:
        config[parameter_split[0]] = parameter_split[1]

最新更新