不惧编译error,编译Tensorflow源码(一)

简介: 编译tensorflow遇到的bug本来就多,在Windows平台上bugs更是加大力度。明明官方教程中在配置完环境后只需执行两行bazel命令,第一行命令却产生不少error。笔者踩了不少坑后,总结出了一些解决方法形成此教程。

前言

编译tensorflow遇到的bug本来就多,在Windows平台上bugs更是加大力度。明明官方教程中在配置完环境后只需执行两行bazel命令,第一行命令却产生不少error。笔者踩了不少坑后,总结出了一些解决方法形成此教程。

1. 配置编译环境

1.1 选择合适的编译配置

Tensorflow源码编译bug多一直被广大用户诟病,不同版本对应不同的编译器,gpu版本还需要安装对应的cuda和cudnn库。因此笔者强烈建议先到官网查看编译配置,具体点击下面链接:Build from source on Windows(https://tensorflow.google.cn/install/source_windows)下面列出前5个官方已经测试过的配置:

CPU

60.jpg



图1.1 tensorflow-cpu的编译配置


GPU

53.jpg

1.2 配置编译环境

  • 准备源码。首先直接到github下载tensorflow源码(https://github.com/tensorflow/tensorflow/releases),或者直接git clone后checkout到对应的版本。这里笔者使用了1.14.0-rc1(https://github.com/tensorflow/tensorflow/releases/tag/v1.14.0-rc1),后面的配置也将按照对应的版本来进行,读者注意按需下载。
  • 安装msvc编译器。Windows平台下需要安装msvc2017,如果已经安装了VS2019,则需要再补充安装2017的编译工具,在此不做赘述。
  • 安装Bazel。Bazel的安装依赖的工具较多,需要VC++、MSYS2、JDK,具体参考Installing Bazel on Windows(https://docs.bazel.build/versions/master/install-windows.html)。配置好依赖后,直接下载Bazel Binary(https://github.com/bazelbuild/bazel/releases)即可,并将Bazel所在的文件夹路径添加到环境变量Path中。注:MSYS2安装好后,要按照官方的说明安装几个库。
  • 安装Python。笔者使用的是Anaconda3.5省去其他计算库和pip3的安装。
  • * 安装CUDA。如果想编译gpu版本,则需要再加装cuda9.0(https://developer.nvidia.com/cuda-toolkit-archive)和cudnn7.0(https://developer.nvidia.com/rdp/cudnn-archive)

下面列出笔者所使用的编译配置

软件 版本
Tensorflow源码 1.14.0-rc1
Visual Studio 2019加装msvc2017
Bazel 0.25.0
msys2 x86_64-20190524
JDK 1.8.0_171
Python 3.5.2Anaconda custom (64-bit)
cuda 9.0.176_win10
cudnn 9.0-windows10-x64-v7.6.2.24

从表中也可以看到,使用了即使用cudnn7.6配合cuda9.0笔者也编译成功了。




02

入门Bazel

在开始编译之前,有必要先了解Bazel的基本操作,出现error时才能有一个大概判断。笔者就曾到stackoverflow上问了两个stupid问题。在此笔者只讲Bazel的几个主要的操作或概念。

2.1 修改编译缓存路径

Tensorflow源码的编译过程产生了大量的缓存,可能占用25G以上的存储空间,而缓存路径默认在C盘。笔者第一次遇到C盘空间不足时,把C盘的Matlab搬出去。折腾几次后老老实实到查看官方文档,才知道可以用<--outputuserroot>指定缓存目录,不过编译过程依然在C盘产生了一些文件占用了几个G。详情可参考Output Directory Layout(https://docs.bazel.build/versions/master/output_directories.html)

2.2 何谓BUILD文件

BUILD中定义了一些编译的目标,包括其名称、头文件、源文件和依赖库等。在tensorflow-1.14.0-rc0/tensorflow/python/BUILD中定义了大量编译目标,各种算子等等的shared object。比如下面这个

cc_library(
    name = "numpy_lib",
    srcs = ["lib/core/numpy.cc"],
    hdrs = ["lib/core/numpy.h"],
    deps = [
        "//tensorflow/core:framework",
        "//tensorflow/core:lib",
        "//third_party/py/numpy:headers",
        "//third_party/python_runtime:headers",
    ],
)

编译第三方库numpy。

2.3 如何定义一个编译目标

用cc_binary、cc_library 或 cc_import可以编译可执行程序、共享库或导入依赖库。值得一提的是,也可以按需要编译动态链接库脱离Tensorflow源码池建立工程。现在假设有如下文件目录:

└──project0
   ├── main
   │   ├── BUILD
   │   ├── hello-world.cc
   │   ├── hello-greet.cc
   │   └── hello-greet.h
   ├── lib
   │   ├── BUILD
   │   ├── hello-time.cc
   │   └── hello-time.h
   ├── dll
   │   ├── third_party.dll
   │   ├── third_party.lib
   │   └── third_party.h
   └── WORKSPACE

WORKSPACE用来指定代码根目录。其中BUILD的定义分别为

# main/BUILD
cc_library(
    name = "hello-greet",
    srcs = ["hello-greet.cc"],
    hdrs = ["hello-greet.h"],
)
cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
    deps = [
        ":hello-greet",
        "//lib:hello-time",
    ],
)
# /lib/BUILD
cc_import(
    name = "third_party",
    hdrs = ["third_party.h"],
    interface_library = "//dll:third_party.lib",
    shared_library = "//dll:third_party.dll",
)
cc_library(
    name = "hello-time",
    srcs = ["hello-time.cc"],
    hdrs = ["hello-time.h"],
    deps = [":third_party",],
    visibility = ["//main:__pkg__"],
)

基本的属性有:

属性 作用
name 定义目标的唯一标识符或者名称
srcs 指定源文件
hdrs 指定头文件
deps 指定依赖库
visibility 可用来设定对其他目标的可见性,不常用


用一个图简单说明上面四个目标的关系:

54.jpg



接着打开命令行,定位到WORKSPACE文件所在目录,执行

  1. bazel build //main:hello-world

编译完成后在/bazel-bin/main/hello-world找到编译完成的可执行文件。详情可参考Introduction to Bazel: Building a C++ Project(https://docs.bazel.build/versions/master/tutorial/cpp.html),C / C++ Rules(https://docs.bazel.build/versions/master/be/c-cpp.html)

相关文章
|
6月前
|
机器学习/深度学习 算法 TensorFlow
【Python深度学习】Tensorflow对半环形数据分类、手写数字识别、猫狗识别实战(附源码)
【Python深度学习】Tensorflow对半环形数据分类、手写数字识别、猫狗识别实战(附源码)
123 0
|
1月前
|
并行计算 TensorFlow 算法框架/工具
Tensorflow error(三):failed to get convolution algorithm,cuDNN failed to initialize
这篇文章讨论了TensorFlow在进行卷积操作时可能遇到的“failed to get convolution algorithm”错误,通常由于cuDNN初始化失败引起,并提供了几种解决方案,包括调整GPU内存使用策略和确保CUDA、cuDNN与TensorFlow版本兼容性。
59 1
Tensorflow error(三):failed to get convolution algorithm,cuDNN failed to initialize
|
6月前
|
机器学习/深度学习 算法 TensorFlow
【Python机器学习】梯度下降法的讲解和求解方程、线性回归实战(Tensorflow、MindSpore平台 附源码)
【Python机器学习】梯度下降法的讲解和求解方程、线性回归实战(Tensorflow、MindSpore平台 附源码)
177 0
|
6月前
|
并行计算 TensorFlow 算法框架/工具
【环境配置】tensorflow11.1.0编译
【环境配置】tensorflow11.1.0编译
49 2
|
1月前
|
TensorFlow 算法框架/工具
Tensorflow error(二):x and y must have the same dtype, got tf.float32 != tf.int32
本文讨论了TensorFlow中的一个常见错误,即在计算过程中,变量的数据类型(dtype)不一致导致的错误,并通过使用`tf.cast`函数来解决这个问题。
21 0
|
3月前
|
TensorFlow 算法框架/工具 iOS开发
【Python-Tensorflow】ERROR: Could not find a version that satisfies the requirement tensorflow
本文讨论了在安装TensorFlow时遇到的版本兼容性问题,并提供了根据Python版本选择正确pip版本进行安装的解决方法。
309 1
|
6月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
【Python深度学习】Tensorflow+CNN进行人脸识别实战(附源码和数据集)
【Python深度学习】Tensorflow+CNN进行人脸识别实战(附源码和数据集)
656 4
|
6月前
|
文字识别 算法 TensorFlow
【Keras+计算机视觉+Tensorflow】OCR文字识别实战(附源码和数据集 超详细必看)
【Keras+计算机视觉+Tensorflow】OCR文字识别实战(附源码和数据集 超详细必看)
169 2
|
6月前
|
机器学习/深度学习 算法 TensorFlow
【Keras+计算机视觉+Tensorflow】实现基于YOLO和Deep Sort的目标检测与跟踪实战(附源码和数据集)
【Keras+计算机视觉+Tensorflow】实现基于YOLO和Deep Sort的目标检测与跟踪实战(附源码和数据集)
95 1
|
6月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
【Python机器学习】神经网络中全连接层与线性回归的讲解及实战(Tensorflow、MindSpore平台 附源码)
【Python机器学习】神经网络中全连接层与线性回归的讲解及实战(Tensorflow、MindSpore平台 附源码)
170 0

热门文章

最新文章