arm架构下使用bazel编译tensorflow.so:

  • 系统信息
体系架构 cpu 操作系统
arm64 鲲鹏920 UOS1021
  • 大致流程
从源码编译arm架构的bazel
使用编译好的bazel编译tensorflow.so

最后会有编译好的arm架构下的libtensorflow.so.1.15.0libtensorflow_framework.so.1.15.0下载链接(只编译了CPU版,没有编译GPU版)

1、版本确认

1.1 首先确定本次编译的tensorflow版本:tensorflow-1.15.0

  • 看项目需求,确定使用的tensorflow版本为:1.15.0
  • 下载好tensorflow-1.15.0的源码

1.2 其次确定需要的bazel版本:bazel-0.25.0

  • 在tensorflow源码内,有configure.py文件:
    arm架构下使用bazel编译tensorflow.so:_第1张图片

  • 打开configure.py文件,搜索bazel
    arm架构下使用bazel编译tensorflow.so:_第2张图片

  • 可以看到tensorflow-1.15.0版本需要的bazel版本在0.24.10.26.1之间,我们选择bazel-0.25.0的版本。

2、基础工具下载

2.1 jdk

2.1.1 确定版本

  • 查看bazel官方文档,选择bazel-0.25.0
    arm架构下使用bazel编译tensorflow.so:_第3张图片

  • 点击installation overview
    arm架构下使用bazel编译tensorflow.so:_第4张图片

  • 点击compile from source
    arm架构下使用bazel编译tensorflow.so:_第5张图片

  • 可以看到jdk版本要求以及他使用的jdk版本号:jdk1.8.0_112

在这里插入图片描述
在这里插入图片描述

2.1.2 下载安装:jdk1.8.0_112

  • 下载:jdk历史版本链接
  • 解压到自己喜欢的目录

2.1.3 jdk环境变量

  • 编辑:
$ sudo vim /etc/profile # 编辑文件

# 在最后添加以下三行
export JAVA_HOME=/home/baixin/Desktop/java/jdk1.8.0_112
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 

# 使其生效
$ source /etc/profile
  • 最好重启计算机

2.2 gcc与g++

  • 两者版本必须一致,否则可能报错:
gcc: error trying to exec 'cc1plus': execvp: No such file or directory

2.2.1 确定两者的版本号

$ gcc -v # 查看gcc版本
$ g++ -v # 查看g++版本

2.2.2 升级降级

参考链接

2.3 Nginx

2.3.1 Nginx简介(具体自行百度)

  • Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器。
  • 效果类似你在浏览器输入:https://linux265.com/static/images/upload/featured-nginx.jpg

2.3.2 为何使用Nginx?

  • 在后面编译tensorflow时会需要下载很多依赖包,但锐捷客户端在arm架构下闪退,再加上鲲鹏这批机器没有无线网卡,下载依赖包会大概率报错。
  • 其次,bazel在每次编译时,会清除上次下载的缓存,所以直接将下好的文件放在缓存目录也不可行。
  • 因此,只能使用Nginx在本地搭建文件服务器,让bazel从本地下载文件。

2.3.3 安装Nginx

  • 命令行输入:
$ sudo apt-get update
$ sudo apt-get install nginx
  • 若提示软件源没有Nginx,则先换源:
# 添加公匙
$ sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 40976EAF437D05B5 3B4FE6ACC0B21F32

# 清除软件仓库缓存
$ sudo apt-get clean

# 修改软件源:/etc/apt/source.list文件
deb http://mirrors.aliyun.com/ubuntu-ports/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial main
 
deb http://mirrors.aliyun.com/ubuntu-ports/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial-updates main
 
deb http://mirrors.aliyun.com/ubuntu-ports/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial universe
deb http://mirrors.aliyun.com/ubuntu-ports/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial-updates universe
 
deb http://mirrors.aliyun.com/ubuntu-ports/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu-ports/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial-security universe

# 重新安装
$ sudo apt-get update
$ sudo apt-get install nginx
  • 上述参考链接:Linux arm64架构修改软件源

2.3.4 配置

  • 找到Nginx配置文件nginx.conf的路径:
$ sudo find / -name "nginx.conf"
  • 编辑该nginx.conf配置文件(文件内容大同小异,先找到server模块,再编辑以下三项):
    • 端口(改大一点,防止默认端口80冲突):7140
    • 字符集:charset UTF-8;
    • 本地文件要存放的位置:root “/home/baixin/Desktop/file”
# 修改后的部分文件内容:

......

    server {
     
        listen       7140; # 设置端口
        server_name  localhost;

        charset UTF-8; # 设置字符集

        #access_log  logs/host.access.log  main;

        location / {
     
            root   "/home/baixin/Desktop/file"; # 本地文件存放位置,根据自己的情况而定
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
     
            root   html;
        }

......

2.3.5 验证

  • 直接在浏览器输入http://127.0.0.1:7140/img.jpg 即可。(当然,你的/home/baixin/Desktop/file路径下要有该图像文件)

3、编译bazel

3.1 环境(我们之前装过的就不用装了)

  • 官网教程:
sudo apt-get install build-essential openjdk-8-jdk python zip unzip

3.2 下载源码包

  • github项目地址

  • 选择bazel-0.25.0版本,进入release包地址。

  • 注意:源码编译bazel要下载bazel-0.25.0-dist.zip包,而不是bazel的Source code包。

arm架构下使用bazel编译tensorflow.so:_第6张图片

3.3 编译bazel

  • 进入bazel解压目录,输入命令:
env EXTRA_BAZEL_ARGS="--host_javabase=@local_jdk//:jdk" bash ./compile.sh # 其实这段代码来自官网
  • 若直接输入./compile.sh,有可能报错:找不到jdk

  • 安装bazel

$ cd ./output
$ ./bazel

3.4 配置bazel环境变量

  • 假定编译好的bazel/home/baixin/DeskTop/bazel/output目录下,则在~/.bashrc文件的末尾添加:
export PATH=/home/baixin/DeskTop/bazel/output:$PATH
  • 使新的环境变量生效
$ source ~/.bashrc

4、bazel编译tensorflow

4.1 正常思路

  • 在tensorflow源码目录下输入命令,按提示进行相关配置:
$ ./configure
  • bazel编译命令:
$ bazel build //tensorflow:libtensorflow.so # 我用的这个可以编译成功,可以多搜些命令,试下。

4.2 但是。。。

  • 编译过程会下载很多依赖包,而你很大可能下载失败
  • 报错会提示你哪个文件下载失败,以及该文件的的URL,根据该URL下好该依赖包,放在标题1.3.2/home/baixin/Desktop/file目录下

4.3 如何寻找并修改tensorflow源码内的URL?

4.3.1 修改处类似下图:

  • 其中红色框内即我们新添加的内容(注意:加入顺序也有可能报错):
    arm架构下使用bazel编译tensorflow.so:_第7张图片
  • 参考博客

4.3.2 具体寻找方法

  • 首先,我们要找的文件都是.bzl后缀,此外源码根目录下WORKSPACE文件也有可能。

  • 其次,仔细看报错提示,会告你tensorflow源码内的一个文件,去这个文件内搜索,看能不能搜到依赖包的URL地址。

  • 最后,根据依赖包名称,看源码的./tensorflow/core./third_party下有没有与缺少的依赖同名的文件夹,进入,寻找后缀是.bzl的文件。

  • 以上参考:这是一篇非常有用的一篇博客,帮了我很大的忙。当你遇到包下载失败的时候可以去看这篇文章

5、下载链接

  • 百度网盘

  • 提取码:2hb1

你可能感兴趣的:(机器学习)