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
相關推薦
TensorFlow非Root許可權原始碼編譯安裝
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