- 系統信息
體系架構 | 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