- 系统信息
体系架构 | cpu | 操作系统 |
---|---|---|
arm64 | 鲲鹏920 | UOS1021 |
- 大致流程
最后会有编译好的arm架构下的
libtensorflow.so.1.15.0
和libtensorflow_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
文件:
-
打开
configure.py
文件,搜索bazel
:
-
可以看到
tensorflow-1.15.0
版本需要的bazel
版本在0.24.1
到0.26.1
之间,我们选择bazel-0.25.0
的版本。
2、基础工具下载
2.1 jdk
2.1.1 确定版本
-
查看bazel官方文档,选择
bazel-0.25.0
:
-
点击
installation overview
:
-
点击
compile from source
:
-
可以看到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
包。
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 修改处类似下图:
- 其中红色框内即我们新添加的内容(注意:加入顺序也有可能报错):
- 参考博客
4.3.2 具体寻找方法
-
首先,我们要找的文件都是
.bzl
后缀,此外源码根目录下WORKSPACE
文件也有可能。 -
其次,仔细看报错提示,会告你tensorflow源码内的一个文件,去这个文件内搜索,看能不能搜到依赖包的URL地址。
-
最后,根据依赖包名称,看源码的
./tensorflow/core
与./third_party
下有没有与缺少的依赖同名的文件夹,进入,寻找后缀是.bzl
的文件。
5、下载链接
-
提取码:2hb1