一般的文章都会写机器学习的原理,算法,python代码之类的,先跳过上面的过程。在实际应用的时候,机器学习的这些算法,最后需要落地在工程中。工程中在实际应用的时候,图像处理的底层处理是基于c++或者c,所以需要编译tenserflow的底层库,可以实现c++的调用。
主要说明一些tensorflow静态库的编译。一般的编译过程,都是镜像直接下载代码,安装。但是很多环境其实都是没有网络条件的,这种情况下。编译的过程比较麻烦一些:
1. gcc版本问题:不太建议gcc版本升级太高版本。
gcc-4.9.2 对应的版本为 GLIBCXX_3.4.20,很多服务器没有配置。
gcc-4.8.5 对应的版本为 GLIBCXX_3.4.19
gcc-4.8.1 对应的版本为 GLIBCXX_3.4.18
这些版本都可以编译,可以选择4.8.5.
因为环境比较旧,所以需要编译升级gcc。gcc源代码下载:https://ftp.gnu.org/gnu/gcc/gcc-4.8.5/
gcc编译安装: ./configure --prefix=/usr/local/gcc-4.8.5 --with-gmp=/usr/local/gcc-4.8.5 --with-mpfr=/usr/local/gcc-4.8.5 --with-mpc=/usr/local/gcc-4.8.5 --enable-languages=c,c++ --disable-multilib
(需要提前安装升级gmp,mpfr,mpc都比较简单)
http://mirror.hust.edu.cn/gnu/mpfr/ mpfr-3.1.2.tar.gz
https://gmplib.org/list-archives/gmp-announce/2014-March/000042.html gmp-6.0.0a.tar.bz2
http://mirror.hust.edu.cn/gnu/mpfr/ mpfr-3.1.2.tar.gz
为了不改变之前的环境,设置安装的路径 --prefix=/usr/local/gcc-4.8.5 这样比较好。
gcc编译之后,在./.bashrc 中添加 export PATH=/usr/local/gcc-4.8.5/bin/:$PATH
软连接设置:
ls -la /usr/bin/gcc*
/usr/bin/gcc -> /usr/bin/gcc_4.8.5
ls /usr/bin/g++* -la
/usr/bin/g++ -> /usr/local/gcc-4.8.5/bin/g++
查看gcc对应的libstdc++版本:
ls /usr/local/gcc-4.8.5/lib64/libstdc++.*
/usr/local/gcc-4.8.5/lib64/libstdc++.a /usr/local/gcc-4.8.5/lib64/libstdc++.so /usr/local/gcc-4.8.5/lib64/libstdc++.so.6.0.19
/usr/local/gcc-4.8.5/lib64/libstdc++.la /usr/local/gcc-4.8.5/lib64/libstdc++.so.6
拷贝/usr/local/gcc-4.8.5/lib64/libstdc++.so.6.0.19 到/lib64/下面,然后建立软连接
ln -s /usr/lib64/libstdc++.so.6.0.19 /lib64/libstdc++.so.6
/lib64/libstdc++.so.6 -> /usr/lib64/libstdc++.so.6.0.19
2 安装JDK1.8
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
或者使用:yum install java-1.8.0-openjdk 安装jdk8
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk/
3.安装bazel
https://github.com/bazelbuild/bazel/releases
bazel 18 19版本有兼容问题。安装17版本
bazel编译:sh bazel-0.17.2-installer-linux-x86_64.sh --user
4. 源码安装Tensorflow
https://github.com/tensorflow/tensorflow/tree/r1.12 测试版本
配置Tensorflow,解压进入下载的TensorFlow源码目录中,执行
$ ./configure (可以都选择no)
$ bazel build //tensorflow:libtensorflow.so
这个过程中,脚本会自动检测一些安装包,然后按照安装包的路径下载。没有网络的情况下,会一直提示网络错误。处理的办法,一个是下载到本地,然后改动脚本,按照本地包编译。但是改动比较多。另一个方法,就是建立一个局域网里的服务器,把安装包都统一放在服务器上面,然后改动一下脚本里面的下载地址就ok,这种方法相对简单,过程中需要改动50个以上的安装包地址。
比如以下包的地址:
tf_http_archive(
name = "com_google_absl",
build_file = clean_dep("//third_party:com_google_absl.BUILD"),
sha256 = "7dd09690ae7ca4551de3111d4a86b75b23ec17445f273d3c42bdcdc1c7b02e4e",
strip_prefix = "abseil-cpp-48cd2c3f351ff188bc85684b84a91b6e6d17d896",
urls = [
"https://myserver....../tensorflow_external/abseil-cpp-48cd2c3f351ff188bc85684b84a91b6e6d17d896.tar.gz",
"https://mirror.bazel.build/github.com/abseil/abseil-cpp/archive/48cd2c3f351ff188bc85684b84a91b6e6d17d896.tar.gz",
"https://github.com/abseil/abseil-cpp/archive/48cd2c3f351ff188bc85684b84a91b6e6d17d896.tar.gz",
],
)
本地包的改动方式如下:
原来的代码:
http_archive(
name = "io_bazel_rules_closure",
sha256 = "a38539c5b5c358548e75b44141b4ab637bba7c4dc02b46b1f62a96d6433f56ae",
strip_prefix = "rules_closure-dbb96841cc0a5fb2664c37822803b06dab20c7d1",
urls = [
"https://mirror.bazel.build/github.com/bazelbuild/rules_closure/archive/dbb96841cc0a5fb2664c37822803b06dab20c7d1.tar.gz",
"https://github.com/bazelbuild/rules_closure/archive/dbb96841cc0a5fb2664c37822803b06dab20c7d1.tar.gz", # 2018-04-13
],
)
修改使用本地包:
local_repository(
name = "io_bazel_rules_closure",
path = "/data/home/tools/io_bazel_rules_closure",
)
可能出现的错误:
zlib_archive/BUILD.bazel:5:1: undeclared inclusion(s) in rule '@zlib_archive//:zlib'
解决方法:bazel clean --expunge