我正在尝试从源代码构建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
然而,在配置构建中,我必须处理两个问题:
- 在选择支持的库时,如果只从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(。
- 如果选择了这两个库,则脚本将继续,但会出现以下消息
Could not find any NvInferVersion.h matching version '' in any subdirectory
。在相应的脚本提示下提供CUDA和cudnn版本后,我在系统中找到了cudnn.h
和cuda.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]