1. 程式人生 > >TensorFlow非Root許可權原始碼編譯安裝

TensorFlow非Root許可權原始碼編譯安裝

Google的分散式深度學習框架TensorFlow出來也有一段時間了。筆者在TensorFlow最初放出時就跟進,不過當時其視訊記憶體管理優化不到位,最後放棄(改用mxnet了,是一個相當不錯的深度學習框架)。
最近,TensorFlow 0.8.0放出,同時開放了分散式學習能力。為此,筆者重新編譯安裝TensroFlow,打算對其效能做一些測試。
筆者的生產環境控制比較嚴格,開發人員不具有root許可權。另一方面,生產環境比較老了,編譯器的版本不夠。在這種情況下編譯安裝TensorFlow還是比較繁瑣的。尤其是bazel,總是不能對環境變數的變化做出匹配,導致安裝過程受阻。
經過一番折騰,摸索出一套編譯安裝方法,記錄在案。

1. 環境準備

筆者的系統環境:

Linux version 2.6.32-279.el6.x86_64 ([email protected]008.build.bos.redhat.com) (gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) )

首先搭建目錄結構。

mkdir usr

使用如下的環境變數配置,注意這裡包含了cuda和cudnn的路徑,不過這次安裝並沒有編譯安裝gpu版本。gpu版本的安裝還有一些麻煩事要做,留待下次再記錄吧。

export HOME=...#home資料夾的位置
export HOME_USR=$HOME
/usr export CUDA_HOME=$HOME/cuda export CUDNN_HOME=$HOME/cudnn export JAVA_HOME=$HOME/jdk1.8.0_65 export PATH=$HOME/bazel_bin:$HOME_USR/bin:$CUDA_HOME/bin:$PATH export CPATH=$HOME_USR/include:$CUDA_HOME/include:$CUDNN_HOME export C_INCLUDE_PATH=$CPATH export CPLUS_INCLUDE_PATH=$CPATH export LIBRARY_PATH=$HOME_USR
/lib:$HOME_USR/lib64:$CUDA_HOME/lib64:$CUDA_HOME/lib64:$CUDNN_HOME export LD_LIBRARY_PATH=$LIBRARY_PATH export LD_RUN_PATH=$LIBRARY_PATH export COMPILER_PATH=$PATH export CC=gcc export CXX=g++ export PKG_CONFIG_PATH=$HOME_USR/lib/pkgconfig:$PKG_CONFIG_PATH

目前gcc的版本太低,先編譯安裝gcc 4.8.4。
首先準備好以下原始檔包。

gmp-4.3.2.tar.bz2
mpfr-2.4.2.tar.bz2
mpc-0.8.1.tar.gz
libffi-3.2.1.tar.gz
gcc-4.8.4.tar.bz2

上述版本不一定必須一致,但安裝過程應該是大同小異。
整個安裝指令碼如下:

echo "gmp first"
tar xvf ./gmp-4.3.2.tar.bz2
cd ./gmp-4.3.2
./configure --prefix=$HOME_USR
make -j 20
make install
make check #### IMPORTANT
cd -

echo "mpfr second"
tar xvf ./mpfr-2.4.2.tar.bz2
cd ./mpfr-2.4.2
./configure --prefix=$HOME_USR
make -j 20
make install
cd -

echo "mpc third"
tar xvf ./mpc-0.8.1.tar.gz
cd ./mpc-0.8.1
./configure --prefix=$HOME_USR
make -j 20
make install
cd -

echo "libffi fourth"
tar xvf ./libffi-3.2.1.tar.gz
cd ./libffi-3.2.1
./configure --prefix=$HOME_USR
make -j 20
make install
cd -

echo "gcc"
tar xvf ./gcc-4.8.4.tar.bz2
cd ./gcc-4.8.4
mkdir build
cd build
../configure --prefix=$HOME_USR --mandir=$HOME_USR/share/man --infodir=$HOME_USR/share/info -enable-checking -enable-languages=c,c++,fortran -disable-multilib --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,fortran --disable-dssi --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
make -j 20
make install

然後是python 2.7.9,順便把pip也安裝上,方便python庫的安裝。準備好下面的原始檔包:

Python-2.7.9.tgz
pip-7.1.0.tar.gz
setuptools-18.1.tar.gz
wheel-0.26.0.tar.gz

整個安裝指令碼如下:

echo "python"
tar xvf ./Python-2.7.9.tgz
cd ./Python-2.7.9/
./configure --prefix=$HOME_USR --enable-shared
make -j 20
make install
cd -

echo "setuptools"
tar xvf ./setuptools-18.1.tar.gz
cd ./setuptools-18.1
python setup.py build
python setup.py install
cd -

echo "pip"
tar xvf ./pip-7.1.0.tar.gz
cd ./pip-7.1.0
python setup.py build
python setup.py install
cd -

echo "wheel"
tar xvf ./wheel-0.26.0.tar.gz
cd wheel-0.26.0
python setup.py build
python setup.py install
cd -

安裝一下OpenBLAS。獲取OpenBLAS原始碼。然後:

make -j 20
make PREFIX=$HOME_USR install

下面是numpy。為了方便還安裝了ipython,這個不是必須的。在OpenBLAS之後再安裝numpy,否則numpy就無法利用OpenBLAS的加速能力。

pip install numpy
pip install ipython

可以選擇安裝一個VirtualEnv。直接用pip就行了。這裡就不安裝了。
Bazel還需要一個jdk 1.8.0,直接去官網下載即可。注意到上面已經再環境變數中設定了JAVA_HOME的路徑。

2.Bazel

沒有root許可權要編譯安裝bazel,有一些麻煩。筆者使用了下面這種比較hack的方法。不知道有沒有更好的方法可以解決此問題。
首先要做如下準備:

mkdir $HOME/bazel_bin

注意到之前已經把bazel_bin寫入環境變量了。在上述資料夾中新增以下幾個檔案。

cpp_bazel
gcc_bazel
gcov_bazel
python_bazel

其內容分別如下。

# cpp_bazel
export HOME=...#home資料夾的位置 ;
export HOME_USR=$HOME/usr ;
export CUDA_HOME=$HOME/cuda ;
export CUDNN_HOME=$HOME/cudnn ;
export JAVA_HOME=$HOME/jdk1.8.0_65 ;
export PATH=$HOME/bazel_bin:$HOME_USR/bin:$CUDA_HOME/bin:$PATH ;
export CPATH=$HOME_USR/include:$CUDA_HOME/include:$CUDNN_HOME ;
export C_INCLUDE_PATH=$CPATH ;
export CPLUS_INCLUDE_PATH=$CPATH ;
export LIBRARY_PATH=$HOME_USR/lib:$HOME_USR/lib64:$CUDA_HOME/lib64:$CUDA_HOME/lib64:$CUDNN_HOME ;
export LD_LIBRARY_PATH=$LIBRARY_PATH ;
export LD_RUN_PATH=$LIBRARY_PATH ;
export COMPILER_PATH=$PATH ;
export CC=gcc ;
export CXX=g++ ;
export PKG_CONFIG_PATH=$HOME_USR/lib/pkgconfig:$PKG_CONFIG_PATH ;
$HOME_USR/bin/cpp [email protected]
# gcc_bazel
export HOME=...#home資料夾的位置 ;
export HOME_USR=$HOME/usr ;
export CUDA_HOME=$HOME/cuda ;
export CUDNN_HOME=$HOME/cudnn ;
export JAVA_HOME=$HOME/jdk1.8.0_65 ;
export PATH=$HOME/bazel_bin:$HOME_USR/bin:$CUDA_HOME/bin:$PATH ;
export CPATH=$HOME_USR/include:$CUDA_HOME/include:$CUDNN_HOME ;
export C_INCLUDE_PATH=$CPATH ;
export CPLUS_INCLUDE_PATH=$CPATH ;
export LIBRARY_PATH=$HOME_USR/lib:$HOME_USR/lib64:$CUDA_HOME/lib64:$CUDA_HOME/lib64:$CUDNN_HOME ;
export LD_LIBRARY_PATH=$LIBRARY_PATH ;
export LD_RUN_PATH=$LIBRARY_PATH ;
export COMPILER_PATH=$PATH ;
export CC=gcc ;
export CXX=g++ ;
export PKG_CONFIG_PATH=$HOME_USR/lib/pkgconfig:$PKG_CONFIG_PATH ;
$HOME_USR/bin/gcc [email protected]
# gcov_bazel
export HOME=...#home資料夾的位置 ;
export HOME_USR=$HOME/usr ;
export CUDA_HOME=$HOME/cuda ;
export CUDNN_HOME=$HOME/cudnn ;
export JAVA_HOME=$HOME/jdk1.8.0_65 ;
export PATH=$HOME/bazel_bin:$HOME_USR/bin:$CUDA_HOME/bin:$PATH ;
export CPATH=$HOME_USR/include:$CUDA_HOME/include:$CUDNN_HOME ;
export C_INCLUDE_PATH=$CPATH ;
export CPLUS_INCLUDE_PATH=$CPATH ;
export LIBRARY_PATH=$HOME_USR/lib:$HOME_USR/lib64:$CUDA_HOME/lib64:$CUDA_HOME/lib64:$CUDNN_HOME ;
export LD_LIBRARY_PATH=$LIBRARY_PATH ;
export LD_RUN_PATH=$LIBRARY_PATH ;
export COMPILER_PATH=$PATH ;
export CC=gcc ;
export CXX=g++ ;
export PKG_CONFIG_PATH=$HOME_USR/lib/pkgconfig:$PKG_CONFIG_PATH ;
$HOME_USR/bin/gcov [email protected]
# python_bazel
export HOME=...#home資料夾的位置 ;
export HOME=/data/rd/tensor_flow_portable ;
export HOME_USR=$HOME/usr ;
export CUDA_HOME=$HOME/cuda ;
export CUDNN_HOME=$HOME/cudnn ;
export JAVA_HOME=$HOME/jdk1.8.0_65 ;
export PATH=$HOME/bazel_bin:$HOME_USR/bin:$CUDA_HOME/bin:$PATH ;
export CPATH=$HOME_USR/include:$CUDA_HOME/include:$CUDNN_HOME ;
export C_INCLUDE_PATH=$CPATH ;
export CPLUS_INCLUDE_PATH=$CPATH ;
export LIBRARY_PATH=$HOME_USR/lib:$HOME_USR/lib64:$CUDA_HOME/lib64:$CUDA_HOME/lib64:$CUDNN_HOME ;
export LD_LIBRARY_PATH=$LIBRARY_PATH ;
export LD_RUN_PATH=$LIBRARY_PATH ;
export COMPILER_PATH=$PATH ;
export CC=gcc ;
export CXX=g++ ;
export PKG_CONFIG_PATH=$HOME_USR/lib/pkgconfig:$PKG_CONFIG_PATH ;
$HOME_USR/bin/python2 [email protected]

以上是第一個比較hack的地方。目前還沒有找到更好的解決辦法。
獲取Bazel的原始碼。這裡建議獲取github上的release包而不是直接clone程式碼。

bazel_0.2.1.tar.gz

解壓後需要更改CROSSBUILD,這裡承接上面的hack工作。
修改下面的檔案:

bazel-0.2.1/tools/cpp/CROSSTOOL

尋找以下程式碼塊:

toolchain {
  abi_version: "local"
  ...
  toolchain_identifier: "local_linux"
  ...
  }

以下用[HOME]代表$HOME路徑,注意這裡需要用絕對路徑。

tool_path { name: "cpp" path: "/usr/bin/cpp" }

改為

tool_path { name: "cpp" path: "[HOME]/bazel_bin/cpp_bazel" }

tool_path { name: "gcc" path: "/usr/bin/gcc" }

改為

tool_path { name: "gcc" path: "[HOME]/bazel_bin/gcc_bazel" }

linker_flag: "-B/usr/bin/"

下面增加兩行:

linker_flag: "-B[HOME]/usr/bin/"
linker_flag: "-B[HOME]/bazel_bin/"

再往下把

cxx_builtin_include_directory: "/usr/lib/gcc/"

替換為

cxx_builtin_include_directory: "[HOME]/usr/lib/gcc/"
cxx_builtin_include_directory: "[HOME]/usr/include"

最後把

tool_path { name: "gcov" path: "/usr/bin/gcov" }

替換為

tool_path { name: "gcov" path: "[HOME]/bazel_bin/gcov_bazel" }

如此修改完成後,開始編譯

cd bazel-0.2.1
./compile.sh

如果編譯失敗,最好每次都把/tmp/bazel.****刪除再重新編譯。
最後,建立一個軟連結方便bazel的使用:

ln -s 原始碼所在目錄絕對路徑/bazel-0.2.1/output/bazel ~/bazel_bin/bazel

使用

bazel version

檢查是否安裝成功。

3. TensorFlow CPU

有了上面關於Bazel的hack之後,TensorFlow CPU的編譯相對簡單。不過TensorFlow GPU的編譯還需要其他的hack,這個之後再記錄。
建議去github上直接獲取最新的原始碼:

git clone --recursive https://github.com/tensorflow/tensorflow.git

接下來需要改變檔案

tensorflow/tensorflow.bzl

找到函式

tf_extension_linkopts

return []

改為

return ["-lrt"]

下面可以基本上按照官網的指示編譯安裝了。

./configure

注意,這裡不能選擇支援GPU。更改了預設的環境變數,要編譯安裝GPU支援的TensorFlow,還需要更多的hack。

bazel build -c opt //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
pip install /tmp/tensorflow_pkg/tensorflow-0.8.0-py2-none-any.whl

可以用執行一個mnist訓練測試TensorFlow是否安裝成功

cd tensorflow/models/image/mnist
python convolutional.py

相關推薦

TensorFlowRoot許可權原始碼編譯安裝

Google的分散式深度學習框架TensorFlow出來也有一段時間了。筆者在TensorFlow最初放出時就跟進,不過當時其視訊記憶體管理優化不到位,最後放棄(改用mxnet了,是一個相當不錯的深度學習框架)。 最近,TensorFlow 0.8.0放出,同

linux下root許可權的mysql安裝

使用mysql使用者安裝mysql Centos系統: 切換到使用者根目錄:cd ~ 下載安裝包: 解壓包: tar -zxvf mysql-5.1.28-rc.tar.gz 建立安裝目錄:mkdir mysql cd mysql-5.1.28-rc .

linux伺服器下root許可權安裝anaconda(以Anaconda3-5.0.1-Linux-x86_64.sh為例)

1.找到自己需要的anaconda版本並下載下來(可以用迅雷下載~速度還快點~),上傳到伺服器自己目錄下; 下載地址:https://repo.anaconda.com/archive/ 2.cd到anaconda安裝包目錄下,安裝anaconda: # bash Anaconda3-5

原始碼編譯安裝tensorflow

由於公司要在飛騰、龍芯上安裝、因此原始碼編譯tensorflow,但編譯tensorflow要用bazel工具包來進行編譯,因此要首先編譯安裝bazel。 因為tensorflow是基於python的一個模組,因此首先下載python等 下載 python-pip、enu

root許可權)在伺服器自己目錄下安裝Python及依賴包

        參考:https://blog.csdn.net/tanzuozhev/article/details/77585342                   https://blog.csdn.net/nayishunjian13/article/detail

[無]root許可權 伺服器 下安裝perl以及perl模組

轉載自http://www.zilhua.com 在本部落格中,所有的軟體安裝都在伺服器上,且無root許可權。理論上適合所有的使用者。 我的安裝目錄 cd /home/zilhua/software 1、在官方網站下載新版本的原始碼包: 2、解壓

ubantu16.04下原始碼編譯安裝tensorflow

Ubuntu16.04原始碼編譯安裝CPU版本的tensorflow 安裝說明:本教程針對tensorflow原始碼編譯安裝cpu版本,參考於tensorflow官網 安裝環境說明: os:Ubuntu 16.04 arch:x86_64 tensorflow版本:1.0.

linux伺服器root許可權下搭建tensorflow框架

在linux上跑tensorflow程式的時候,往往需要各種python包,或者不同的版本的python,tensorflow,在沒有root許可權的情況下,只能去找管理員。這裡分享一下我是如何在自己的

Linux之Nginx原始碼編譯安裝,並實現Nginx版本升級,秒級切換和Nginx版本回滾,秒級回退

Linux之Nginx原始碼編譯安裝,並實現Nginx版本升級,秒級切換和Nginx版本回滾,秒級回退 1、先檢查Nginx依賴庫(主要4個gcc、pcre、zlib、openssl,通過yum安裝) 2、GCC——GNU編譯器集合(GCC可以使用預設包管理器的倉庫(reposito

[環境配置]Ubuntu 16.04 原始碼編譯安裝OpenCV-3.2.0+OpenCV_contrib-3.2.0及產生的問題

1.OpenCV-3.2.0+OpenCV_contrib-3.2.0編譯安裝過程 1)下載官方要求的依賴包 GCC 4.4.x or later CMake 2.6 or higher Git GTK+2.x or higher, including headers (libgtk2.

: 擴充套件的幾個應用 釋出網路YUM源 vim編輯技巧 原始碼編譯安裝 systemctl控制 總結和答疑

Top NSD SERVICES DAY01 案例1:補充應用技巧 案例2:軟連線與硬連線 案例3:man手冊、zip備份 案例4:自定義yum軟體倉庫 案例5:釋出及測試yum倉庫 案例6:vim效率操作 案例7:編譯安裝軟體包 案例8:使用

擴充套件的幾個應用 釋出網路YUM源 vim編輯技巧 原始碼編譯安裝 systemctl控制 總結和答疑

Top NSD SERVICES DAY01 案例1:補充應用技巧 案例2:軟連線與硬連線 案例3:man手冊、zip備份 案例4:自定義yum軟體倉庫 案例5:釋出及測試yum倉庫 案例6:vim效率操作 案例7:編譯安裝軟體包 案例8:使用

原始碼編譯安裝Greenplum資料庫

文章目錄 概述 下載原始碼包 安裝一些常用的依賴 安裝c++ 11 開始編譯 按greenplum正常步驟安裝 一些細節問題 第二次新增 新的configure選項

Ubuntu 18.04.1下原始碼編譯安裝OpenJDK8

自己編譯個JDK來提升對JVM的興趣。本文分三部分來描述編譯OpenJDK的過程,分別是編譯前準備工作、構建編譯環境、進行編譯,在這三部分內容中順帶把趟的坑一起說明下。 一、編譯前準備工作 1.1 安裝Linux環境 https://askubuntu.com/questions/107059

Ubuntu nginx php7 原始碼編譯安裝

  在Ubuntu 16.04下原始碼編譯安裝PHP7 過程記錄。   nginx 安裝 ./configure --prefix=/opt/nginx --with-http_ssl_module --with-pcre 

阿里雲伺服器 root許可權 建立基於python的虛擬環境

阿里雲 伺服器 非root許可權 建立虛擬環境   (新增 --user 即可) # 安裝虛擬環境-virtualenv pip install --user virtualenv # 建立自己的虛擬環境-scrapy_env virtualenv scrapy_env

在Linux上進行原始碼編譯安裝程式詳解

文章轉載自:http://xuweitao.blog.51cto.com/11761672/1905357 1. 編譯安裝概述 前面兩篇關於程式包管理器的文章談到,無論是使用rpm命令還是yum命令安裝的都是已編譯好的程式包,在整個安裝過程中使用者只需執行一條命令即可完成安裝。這樣帶

原始碼編譯安裝swoole,並讓php支援swoole

第一步:下載swoole    : git  clone https://gitee.com/swoole/swoole.git 第二步:進入下載目錄。輸入phpize(phpize是在php/bin/phpize) phpize擴充套件php的擴充套

mcached快取之原始碼編譯安裝

系統環境: 主機名 作業系統 ip地址 服務軟體 memcached centos7.5 192.168.80.100 memcached-1.5.9.tar.gzlibevent-2.1.8-stable.tar.gz web1 centos7.5 192.168.80.101 yum

Linux 原始碼編譯安裝mysql

MySQL 安裝與使用 MySQL Installer 5.7.24 1、 MySQl安裝 1.1 下載MySQL MySQL 官網:https://dev.mysql.com/downloads/mysql/ 下載連線:https://cdn.mysql.com//Downloads/M