阿里 云 centos上 搭建paddlepaddle

image.png

周一早上 前百度 的leader 問我 周日發(fā)在群里的 說(shuō)什么在測(cè)試機(jī)安裝好了 paddle 是什么,我說(shuō)就是你們百度的paddlepaddle呀,他 很錯(cuò)愕
質(zhì)疑我,你確認(rèn)你是安裝好了嗎 ,是要源碼編譯的。。。你編譯成功了嗎?[潛臺(tái)詞 是 你在逗我嘛 是不是 只是 tar 包解壓縮放在磁盤上了。。paddle 的編譯太 tm困難 ,成功的太少,你怎么可能編譯成功呢?]
可惜我真的成功了,真的編譯成功了,苦苦整了一天 去填各種坑,看到我leader的質(zhì)疑,看來(lái)資深用戶都知道paddle的編譯安裝非常惡心和困難,這個(gè)我就放心了。我想我這份 關(guān)于在 centos上的paddlepaddle的編譯安裝 現(xiàn)在來(lái)看應(yīng)該是全網(wǎng)第一份 公開 較為全面的解說(shuō) 吧,好吧,要致敬 paddle的作者和開源運(yùn)動(dòng)。

image.png

從網(wǎng)上看 paddlepaddle 的安裝大部分都是docker 容器在運(yùn)行,有一部分使用Ubuntu安裝的,比如這個(gè)
http://www.lxweimin.com/p/3dd5dd27dab0
paddle 的新手入門 http://doc.paddlepaddle.org/develop/doc_cn/
安裝和編譯 http://doc.paddlepaddle.org/develop/doc_cn/getstarted/build_and_install/cmake/build_from_source_cn.html

,由于 paddlepaddle 是 百度開源的,不具備國(guó)際性,使用Google 搜索也沒有找到合適的centos安裝paddle的教程實(shí)例,不過(guò)paddlepaddle 官網(wǎng)有 docker mac ubuntu centos 的四個(gè)平臺(tái)的安裝教程,看樣子還是比較簡(jiǎn)單,不過(guò) 隔一種語(yǔ)言 真如隔一座山,還是碰到了 一些問題。
centos 默認(rèn)的cmake 版本低2.8要升級(jí)到3,
參看 這篇 http://blog.csdn.net/l1028386804/article/details/50779092

  1. 下載cmake源碼
    https://cmake.org/download/
    wget https://cmake.org/files/v3.3/cmake-3.3.2.tar.gz
    2.解壓縮
    tar xzvf cmake-3.3.2.tar.gz
    3.進(jìn)入到cmake文件夾中執(zhí)行引導(dǎo)命令
    注:此時(shí)會(huì)檢查gcc ,gcc-c++,是否安裝和版本,如果沒有請(qǐng)先安裝
    yum install gcc
    yum install gcc-c++
    cd cmake-3.3.2
    ./bootstrap
    4.執(zhí)行make
    gmake
    5.執(zhí)行安裝(root權(quán)限)
    make install

paddlepaddle 即使源碼安裝也要依賴 golang,所以 需要在centoS 上 搭建golang的運(yùn)行環(huán)境,
goland 地址 wget https://storage.googleapis.com/golang/go1.9.2.linux-amd64.tar.gz
參看這篇 http://www.cnblogs.com/chy123/p/6750347.html

https://golang.org/doc/install?download=go1.9.2.linux-amd64.tar.gz

paddle 官網(wǎng)的教程
http://doc.paddlepaddle.org/release/0.10.0/doc/getstarted/build_and_install/build_from_source_en.html#centos
官網(wǎng) 看 現(xiàn)在 paddle 只支持 python 2.7,所以搭建 要確定python的版本,現(xiàn)在不支持 python 3.*
Requirements
To compile the source code, your computer must be equipped with the following dependencies.

Compiler: GCC >= 4.8 or Clang >= 3.3 (AppleClang >= 5.1) and gfortran compiler
CMake: CMake >= 3.0 (at least CMake 3.4 on Mac OS X)
BLAS: MKL, OpenBlas or ATLAS
Python: only support Python 2.7

git clone https://github.com/PaddlePaddle/Paddle paddle cd paddle
install cpu dependency

necessary

sudo yum update
sudo yum install -y epel-release
sudo yum install -y make cmake3 python-devel python-pip gcc-gfortran swig git
sudo pip install wheel numpy
sudo pip install 'protobuf>=3.0.0'

在搭建paddlepaddle的最后兩部 卡住了,cmake 其實(shí)相當(dāng)于一個(gè)類似java maven的一個(gè)建構(gòu)工具,但是如果不會(huì)用還是讓你超級(jí)頭疼的
mkdir build && cd build

you can add build option here, such as:

cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/local/paddle #<path to install>

please use sudo make install, if you want to install PaddlePaddle into the system

make -j nproc && make install

set PaddlePaddle installation path in ~/.bashrc

export PATH=<path to install>/bin:$PATH

install PaddlePaddle Python modules.

sudo pip install <path to install>/opt/paddle/share/wheels/*.whl

這個(gè)坑就在執(zhí)行 cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/local/paddle/build 時(shí) 報(bào)錯(cuò)
通過(guò) 細(xì)細(xì)察看 報(bào)錯(cuò)的log 日志
發(fā)現(xiàn)
cc1: error: command line option '-Wnon-virtual-dtor' is valid for C++/ObjC++ but not for C [-Werror]
cc1: all warnings being treated as errors

也就是cmake把 警告當(dāng)做錯(cuò)誤來(lái)處理 ,阻礙了 建構(gòu)完成,
那個(gè)這個(gè)警告其實(shí)就是C++支持 這個(gè)參數(shù) ,而 C 不支持,也就是說(shuō) cmake 在這里默認(rèn)調(diào)用了C 編譯器而不是 C++,如果讓 cmake 的默認(rèn)編譯器指定是 C++,這個(gè)環(huán)節(jié)就可以解開了,或者讓cmake 別把警告當(dāng)錯(cuò)誤處理
其實(shí)cmake 是可以設(shè)置參數(shù) 忽略警告的,cmake -h 可以查看到參數(shù) 及解釋,不過(guò)我嘗試了多次還是 失敗了

嗯,不瞞大家,我就卡在了這里,過(guò)了這道坎 我估計(jì)就沒有問題了,等我解決了這個(gè),就完整了
后來(lái)看了這個(gè)
http://blog.csdn.net/houzhizhen/article/details/71515458
感覺人生好像可以圓滿了,但是還是不可以,

后來(lái)發(fā)現(xiàn)實(shí)在沒有折,干脆就跑到 paddle的github 看issue 看有沒有人碰到過(guò),當(dāng)時(shí)并不抱希望,看 paddle的issue竟然有快600條,搜索了一番,反而有了思路,
當(dāng)時(shí)又看log 日志的error 發(fā)現(xiàn) 有一個(gè)
cannot find -lpthreads,
https://github.com/PaddlePaddle/Paddle/issues/1140 不過(guò)這個(gè)也沒有解決到真正的問題

再找發(fā)現(xiàn)在執(zhí)行 cmake 的時(shí)候,console中出現(xiàn)的提示
CMake Error: The following variables are used in this project, but they are set to NOTFOUND. Please set them or make sure they are set and tested correctly in the CMake files: Boost_INCLUDE_DIR (ADVANCED)

這個(gè)太重要的,然后在issue 中就搜到了 https://github.com/PaddlePaddle/Paddle/issues/2791
其實(shí)很簡(jiǎn)單 ,就是我的centos 沒有安裝 boost
,哎就這個(gè)耽誤了我四個(gè)小時(shí),麻蛋
之后就是 安裝 boost 這個(gè)工具
yum install boost yum install boost-devel yum install boost-doc
另外需要在 paddle根目錄下的 CMakeLists.txt [相當(dāng)于maven項(xiàng)目的pom.xml] 文件中 加入 幾個(gè)環(huán)境變量
SET(CMAKE_C_COMPILER "/usr/bin/gcc") SET(CMAKE_CXX_COMPILER "/usr/bin/g++") SET(CMAKE_Go_COMPILER "/usr/local/go/bin/go")
如果還有問題就 在 安裝這個(gè)
yum install glibc-static

之后再 執(zhí)行 cmake 的時(shí)候順利解決,successful
-- Compile with MKLDNNMatrix
-- Compile with MKLDNNLayers and MKLDNNActivations
-- Configuring done
-- Generating done
-- Build files have been written to: /usr/local/paddle/build

然后 make -j nproc && make install 注意nproc 上的反引號(hào) 鍵盤 Esc 下面 ~號(hào)對(duì)應(yīng)的鍵
這一步耗時(shí)很長(zhǎng),大概有半小時(shí)之長(zhǎng)吧,反正凌晨一點(diǎn),等了十分鐘還沒有完,第一次好像還是卡頓失敗了,
第二次等了好久沒完,就去睡覺了,第二天看到結(jié)果
[ 99%] Built target python_api_wheel [ 99%] Built target copy_paddle_pybind [ 99%] Built target paddle_python [100%] Built target protobuf_equal Install the project...
-- Install configuration: "RelWithDebInfo" -- Installing: /usr/local/paddle/opt/paddle/bin/paddle_pserver_main -- Set runtime path of "/usr/local/paddle/opt/paddle/bin/paddle_pserver_main" to "/usr/local/paddle/build/third_party/install/mklml/mklml_lnx_2018.0.20170720/lib:/usr/local/paddle/build/third_party/install/mkldnn/lib"
-- Installing: /usr/local/paddle/opt/paddle/bin/paddle_trainer -- Set runtime path of "/usr/local/paddle/opt/paddle/bin/paddle_trainer" to "/usr/local/paddle/build/third_party/install/mklml/mklml_lnx_2018.0.20170720/lib:/usr/local/paddle/build/third_party/install/mkldnn/lib" -- Installing: /usr/local/paddle/opt/paddle/bin/paddle_merge_model -- Set runtime path of "/usr/local/paddle/opt/paddle/bin/paddle_merge_model" to "/usr/local/paddle/build/third_party/install/mklml/mklml_lnx_2018.0.20170720/lib:/usr/local/paddle/build/third_party/install/mkldnn/lib" -- Installing: /usr/local/paddle/bin/paddle -- Installing: /usr/local/paddle/opt/paddle/bin/paddle_usage -- Installing: /usr/local/paddle/opt/paddle/share/wheels -- Installing: /usr/local/paddle/opt/paddle/share/wheels/paddlepaddle-0.10.0-cp27-cp27mu-linux_x86_64.whl
然后進(jìn)入 paddle的根目錄 ,就有了 bin目錄 和opt,進(jìn)入 bin目錄

./paddle version
PaddlePaddle 0.10.0, compiled with with_avx: ON with_gpu: OFF with_mkldnn: ON with_mklml: ON with_double: OFF with_python: ON with_rdma: OFF with_timer: OFF
說(shuō)明安裝paddle差不多成功了,再配置一下環(huán)境變量,基本就可以使用,因?yàn)榉?wù)器沒有掛載GPU,所以
這次只是單單 CPU的

`
export PATH=/usr/local/paddle/bin:$PATH 到 /etc/profile 和 ~/.bashrc,

export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export SCALA_HOME=/usr/local/scala

export GOROOT=/usr/local/go
export GOPATH=/usr/local/gopath
export PADDLE_HOME=/usr/local/paddle

export PATH=$SQOOP_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/java/bin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin:/usr/local/java/bin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin:/root/bin:/usr/local/java/bin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin:/usr/local/scala/bin

export PATH=$GOROOT/bin:$GOPATH/bin:/usr/local/paddle/bin:$PATH
source /etc/profile
source ~/.bashrc

`

最后把paddle包pip本地安裝一下 paddlepaddle-0.10.0-cp27-cp27mu-linux_x86_64.whl
sudo pip install /usr/local/paddle/opt/paddle/share/wheels/*.whl

會(huì)發(fā)現(xiàn) paddle 依賴的一些數(shù)據(jù)科學(xué)包 機(jī)器學(xué)習(xí)包都在里面
`
Successfully built nltk rarfile olefile subprocess32
Installing collected packages: scipy, nltk, opencv-python, olefile, Pillow, pyparsing, backports.functools-lru-cache, python-dateutil, subprocess32, pytz, cycler, matplotlib, recordio, requests, rarfile, protobuf, paddlepaddle

Found existing installation: pyparsing 1.5.6
DEPRECATION: Uninstalling a distutils installed project (pyparsing) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.

Uninstalling pyparsing-1.5.6:
Successfully uninstalled pyparsing-1.5.6

Found existing installation: requests 2.18.4
Uninstalling requests-2.18.4:
Successfully uninstalled requests-2.18.4

Found existing installation: protobuf 3.4.0
Uninstalling protobuf-3.4.0:
Successfully uninstalled protobuf-3.4.0
Successfully installed Pillow-4.3.0 backports.functools-lru-cache-1.4 cycler-0.10.0 matplotlib-2.1.0 nltk-3.2.5 olefile-0.44 opencv-python-3.3.0.10 paddlepaddle-0.10.0 protobuf-3.1.0 pyparsing-2.2.0 python-dateutil-2.6.1 pytz-2017.2 rarfile-3.0 recordio-0.1.4 requests-2.9.2 scipy-1.0.0 subprocess32-3.2.7
`

至此 所有的關(guān)于paddle就都安裝好了, 大功告成
paddle 安裝結(jié)束,我才懂了,為什么paddle 官方推薦用docker 容器運(yùn)行 paddle ,因?yàn)?坑太多了
為什么公司 另一位百度的同事 ,淡淡的說(shuō) paddle 必須由他源碼編譯 安裝,潛臺(tái)詞是他認(rèn)為別人安裝不了
為什么 paddle的github issue 竟然有五百來(lái)個(gè),除了編譯 還有運(yùn)行的異常,模仿 天文學(xué)家 鄭永春的語(yǔ)氣
“哎 地球【paddle】到處都是坑!!!!!”

總之 ,出現(xiàn)問題不要怕,關(guān)鍵是定位問題的根源,前前后后 看到了好幾個(gè)錯(cuò)誤提示,
但是 如果某個(gè)錯(cuò)誤只是錯(cuò)誤鏈中連鎖反應(yīng)的后繼的話,還是無(wú)法從根源解決的,只有抓住問題的根源才可以,

最重要的是不了解cmake 這個(gè)東西,另外 就是如何解決問題,百度 Google 都沒有搜到合理的答案,簡(jiǎn)書 和微信搜索也沒有找到,其實(shí)最好找的地方就是 這個(gè)paddle的github的 issue 中,以后 我要常來(lái) issue 區(qū)看看,

最主要是我之前一直沒有重視 github上的issue,要是早四個(gè)小時(shí)就看issue,我今天可以多睡四個(gè)小時(shí) ,好氣哦,想起了 一個(gè)之前發(fā)生的事情,有一個(gè)阿里的員工 寫了一個(gè)開源的工具,我在用的時(shí)候 有一些bug 解決不了 ,郵箱聯(lián)系他,他很不耐煩的丟下一句
“去提個(gè) issue 吧?” [又來(lái)煩我、、、]
我當(dāng)時(shí)真的很懵逼,也沒有提issue,當(dāng)時(shí)也沒有把github 當(dāng)回事,原來(lái) github的issue還是蠻好用的,關(guān)鍵時(shí)候解決大問題,定位好問題 ,定位問題不能只看 log日志,還要多多關(guān)注 執(zhí)行時(shí)的congsole輸出,
找解決方案時(shí),解決方案的選擇資源一定要豐富哦

eems like you need to install boost and rerun cmake again. And you can add options -DWITH_MKLML=OFF -DWITH_MKLDNN=OFF to turn off mkl since it's still under heavy development.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容