阿里 云 centos上 搭建paddlepaddle

image.png

周一早上 前百度 的leader 问我 周日发在群里的 说什么在测试机安装好了 paddle 是什么,我说就是你们百度的paddlepaddle呀,他 很错愕
质疑我,你确认你是安装好了吗 ,是要源码编译的。。。你编译成功了吗?[潜台词 是 你在逗我嘛 是不是 只是 tar 包解压缩放在磁盘上了。。paddle 的编译太 tm困难 ,成功的太少,你怎么可能编译成功呢?]
可惜我真的成功了,真的编译成功了,苦苦整了一天 去填各种坑,看到我leader的质疑,看来资深用户都知道paddle的编译安装非常恶心和困难,这个我就放心了。我想我这份 关于在 centos上的paddlepaddle的编译安装 现在来看应该是全网第一份 公开 较为全面的解说 吧,好吧,要致敬 paddle的作者和开源运动。

image.png

从网上看 paddlepaddle 的安装大部分都是docker 容器在运行,有一部分使用Ubuntu安装的,比如这个
http://www.jianshu.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 是 百度开源的,不具备国际性,使用Google 搜索也没有找到合适的centos安装paddle的教程实例,不过paddlepaddle 官网有 docker mac ubuntu centos 的四个平台的安装教程,看样子还是比较简单,不过 隔一种语言 真如隔一座山,还是碰到了 一些问题。
centos 默认的cmake 版本低2.8要升级到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.进入到cmake文件夹中执行引导命令
    注:此时会检查gcc ,gcc-c++,是否安装和版本,如果没有请先安装
    yum install gcc
    yum install gcc-c++
    cd cmake-3.3.2
    ./bootstrap
    4.执行make
    gmake
    5.执行安装(root权限)
    make install

paddlepaddle 即使源码安装也要依赖 golang,所以 需要在centoS 上 搭建golang的运行环境,
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 官网的教程
http://doc.paddlepaddle.org/release/0.10.0/doc/getstarted/build_and_install/build_from_source_en.html#centos
官网 看 现在 paddle 只支持 python 2.7,所以搭建 要确定python的版本,现在不支持 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 其实相当于一个类似java maven的一个建构工具,但是如果不会用还是让你超级头疼的
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

这个坑就在执行 cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/local/paddle/build 时 报错
通过 细细察看 报错的log 日志
发现
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把 警告当做错误来处理 ,阻碍了 建构完成,
那个这个警告其实就是C++支持 这个参数 ,而 C 不支持,也就是说 cmake 在这里默认调用了C 编译器而不是 C++,如果让 cmake 的默认编译器指定是 C++,这个环节就可以解开了,或者让cmake 别把警告当错误处理
其实cmake 是可以设置参数 忽略警告的,cmake -h 可以查看到参数 及解释,不过我尝试了多次还是 失败了

嗯,不瞒大家,我就卡在了这里,过了这道坎 我估计就没有问题了,等我解决了这个,就完整了
后来看了这个
http://blog.csdn.net/houzhizhen/article/details/71515458
感觉人生好像可以圆满了,但是还是不可以,

后来发现实在没有折,干脆就跑到 paddle的github 看issue 看有没有人碰到过,当时并不抱希望,看 paddle的issue竟然有快600条,搜索了一番,反而有了思路,
当时又看log 日志的error 发现 有一个
cannot find -lpthreads,
https://github.com/PaddlePaddle/Paddle/issues/1140 不过这个也没有解决到真正的问题

再找发现在执行 cmake 的时候,console中出现的提示
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)

这个太重要的,然后在issue 中就搜到了 https://github.com/PaddlePaddle/Paddle/issues/2791
其实很简单 ,就是我的centos 没有安装 boost
,哎就这个耽误了我四个小时,麻蛋
之后就是 安装 boost 这个工具
yum install boost yum install boost-devel yum install boost-doc
另外需要在 paddle根目录下的 CMakeLists.txt [相当于maven项目的pom.xml] 文件中 加入 几个环境变量
SET(CMAKE_C_COMPILER "/usr/bin/gcc") SET(CMAKE_CXX_COMPILER "/usr/bin/g++") SET(CMAKE_Go_COMPILER "/usr/local/go/bin/go")
如果还有问题就 在 安装这个
yum install glibc-static

之后再 执行 cmake 的时候顺利解决,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 上的反引号 键盘 Esc 下面 ~号对应的键
这一步耗时很长,大概有半小时之长吧,反正凌晨一点,等了十分钟还没有完,第一次好像还是卡顿失败了,
第二次等了好久没完,就去睡觉了,第二天看到结果
[ 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
然后进入 paddle的根目录 ,就有了 bin目录 和opt,进入 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
说明安装paddle差不多成功了,再配置一下环境变量,基本就可以使用,因为服务器没有挂载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

会发现 paddle 依赖的一些数据科学包 机器学习包都在里面
`
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
`

至此 所有的关于paddle就都安装好了, 大功告成
paddle 安装结束,我才懂了,为什么paddle 官方推荐用docker 容器运行 paddle ,因为 坑太多了
为什么公司 另一位百度的同事 ,淡淡的说 paddle 必须由他源码编译 安装,潜台词是他认为别人安装不了
为什么 paddle的github issue 竟然有五百来个,除了编译 还有运行的异常,模仿 天文学家 郑永春的语气
“哎 地球【paddle】到处都是坑!!!!!”

总之 ,出现问题不要怕,关键是定位问题的根源,前前后后 看到了好几个错误提示,
但是 如果某个错误只是错误链中连锁反应的后继的话,还是无法从根源解决的,只有抓住问题的根源才可以,

最重要的是不了解cmake 这个东西,另外 就是如何解决问题,百度 Google 都没有搜到合理的答案,简书 和微信搜索也没有找到,其实最好找的地方就是 这个paddle的github的 issue 中,以后 我要常来 issue 区看看,

最主要是我之前一直没有重视 github上的issue,要是早四个小时就看issue,我今天可以多睡四个小时 ,好气哦,想起了 一个之前发生的事情,有一个阿里的员工 写了一个开源的工具,我在用的时候 有一些bug 解决不了 ,邮箱联系他,他很不耐烦的丢下一句
“去提个 issue 吧?” [又来烦我、、、]
我当时真的很懵逼,也没有提issue,当时也没有把github 当回事,原来 github的issue还是蛮好用的,关键时候解决大问题,定位好问题 ,定位问题不能只看 log日志,还要多多关注 执行时的congsole输出,
找解决方案时,解决方案的选择资源一定要丰富哦

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.

推荐阅读更多精彩内容