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文件:
    在這裏插入圖片描述

  • 打開configure.py文件,搜索bazel
    在這裏插入圖片描述

  • 可以看到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
    在這裏插入圖片描述

  • 點擊installation overview
    在這裏插入圖片描述

  • 點擊compile from source
    在這裏插入圖片描述

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

在這裏插入圖片描述
在這裏插入圖片描述

2.1.2 下載安裝:jdk1.8.0_112

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

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 具體尋找方法

5、下載鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章