相关文章推荐
瘦瘦的马克杯  ·  c# - XML Error: There ...·  2 年前    · 
拉风的牛肉面  ·  System.IO.IOException: ...·  2 年前    · 
风流倜傥的台灯  ·  python ...·  2 年前    · 

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

1 人关注

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

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

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

  • When choosing about the supported libraries, if only select CUDA out of the 4 questioned libraries, I get the following error:
  • 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)。

  • In case of selecting the two libraries then the script proceeds, however, the following message occurs Could not find any NvInferVersion.h matching version '' in any subdirectory. After providing CUDA and cudnn versions at the corresponding script prompts I have managed to proceed further by finding in my system cudnn.h and cuda.h paths and adding their paths in the additional scripts prompt:
  • 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'
            '/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...
    

    有没有关于如何继续的提示?哪些应该是我必须提供的路径?

    linux
    tensorflow
    build
    configuration
    bazel
    Sieg_
    Sieg_
    发布于 2020-07-22
    3 个回答
    HE MA
    HE MA
    发布于 2020-07-30
    0 人赞同

    我最近也遇到了这样的问题。

    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.X中,cuda的版本信息不再存储在 cudnn.h 中。在CUDA 11.X中,版本信息似乎存储在新的 cudnn_version.h 文件中。因此,许多构建工具,如cmake,依赖 cudnn.h 来获取CUDA的版本信息,就不能再猜测CUDA的版本。
    mcc
    mcc
    发布于 2020-07-30
    0 人赞同

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

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

    我把configure.py文件中的1323行 tuple(line.decode('ascii').rstrip().split(': ')) for line in proc.stdout) 换成了以下代码。我相信有一个更有效的方法来写这个。

      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'