目录
目的
因未有支持aarch64架构的paddlepaddle的第三方包,且服务器环境难以链接github进行编译依赖包的下载,本文档的目的在于重新编译Paddle包。
环境准备
-
操作系统:Centos7
-
Python版本:3.7.2
-
系统架构:aarch64
-
gcc版本:8.3.1
安装步骤
推荐提前安装,避免后续编译过程中出现错误
$ yum install autoconf automake openssl-devel which -y
安装CMAKE
Paddle 依赖 cmake 进行编译构建,需要 cmake 版本>=3.15,如果操作系统提供的源包括了合适版本的 cmake,直接安装即可,否则需要源码安装。网络不好的可以提前下载包。
$ wget https://github.com/Kitware/CMake/releases/download/v3.16.8/cmake-3.16.8.tar.gz
$ tar -xzf cmake-3.16.8.tar.gz && cd cmake-3.16.8
$ ./bootstrap && make && sudo make install
安装Patchelf
Paddle 内部使用 patchelf 来修改动态库的 rpath,如果操作系统提供的源包括了 patchelf,直接安装即可,否则需要源码安装。因为版本更新,github源上已无aarch64的版本,直接下载最新master包进行编译。
安装gcc8
需要注意的是,patchelf的编译需要支持C++17,而系统自带的gcc版本为4.8.5,在编译之前需要提前更换好系统的gcc、g++、c++、cc版本。但gcc的版本不宜过高(例如版本gcc11),否则会出现高版本无法编译低版本C++代码的问题。
安装scl工具管理gcc版本
$ yum install -y centos-release-scl scl-utils
查看scl支持的安装版本
$ yum list all --enablerepo='centos-sclo-rh' | grep gcc
安装某个版本的gcc
yum install devtoolset-8-gcc
激活版本环境
$ scl enable devtoolset-8 bash
更换系统的默认gcc源
此操作为了防止之后进行Cmake的时候报错gcc版本冲突错误
查找系统中的gcc文件,并逐个目录检查相关版本 gcc --version,找到低版本目录,并替换低版本的执行文件路径、建立新版本的软连接
$ find / -name gcc #
/opt/rh/devtoolset-7/root/usr/libexec/gcc
/opt/rh/devtoolset-7/root/usr/lib/gcc
/opt/rh/devtoolset-7/root/usr/bin/gcc #7.3.1-5
/usr/libexec/gcc
/usr/lib/gcc
/usr/bin/gcc #4.8.5.net
更换版本,举例子为更换gcc版本,同理,还需要处理c++、g++、cc的
$ mv /usr/bin/gcc /usr/bin/gcc4.8.5
$ ln -s /opt/rh/devtoolset-8/root/usr/bin/gcc /usr/bin/gcc
编译Patchelf
$ ./bootstrap.sh
$ ./configure
$ make
$ make check
$ make install
安装Python依赖库
依赖库文件的路径在Paddle2.3/python文件夹下requirments.txt,建议提前安装,很多教程都没写,除此之外,检查依赖库是否含有protobuf、numpy、wheel包,没有应该提前安装。
$ pip3 install -r requirments.txt
网络不佳的推荐国内镜像:https://mirror.baidu.com/pypi/simple/
处理Paddle包内文件
- 【网络好的可忽略】因为服务器无法链接github,导致编译失败,所以需要预先把所有需要链接github网站的更换成看国内的github镜像源,例如CMakeListt.txt里的GIT_URL为https://github.com,可编写python代码遍历所有的包进行查找,主要修改.cmake文件和.h文件。在替换过程中大家也需要注意一下文件的编码问题,否则会替换不成功。国内可用的镜像源会进行更新,这里不做推荐,大家百度即可。如果遇到在镜像源里没有的包,也可以单独查找国内代码网站链接进行更换。
- 查找所有含有
-Werror
的文件,进行禁用,注释掉即可。
编译
$ mkdir build && cd build
$ ulimit -n 4096
$ cmake .. -DPY_VERSION=3 -DPYTHON_EXECUTABLE=`which python3` -DWITH_ARM=ON -DWITH_TESTING=OFF -DCMAKE_BUILD_TYPE=Release -DON_INFER=ON -DWITH_XBYAK=OFF -DCMAKE_CXX_FLAGS="-Wno-error -w"
$ make TARGET=ARMV8 -j$(nproc)
编译成功后在paddle/build/python/dist目录下找到生成.whl包。
安装whl包
$ pip install -U(whl 包的名字)`或`pip3 install -U(whl 包的名字)
Error
Q1:执行pip install报错
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv]
A1:pip安装命令中使用--force-reinstall参数:
$ pip3 install XXX --force-reinstall
Q2:编译过程中出现:
/usr/bin/c++
is not a full path to an existing compiler tool.
/usr/bin/cc
is not a full path to an existing compiler tool.
A2:版本冲突错误,参考上面gcc版本冲突解决办法
Q3:安装依赖包过程中出现
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-taoxz02y/grpcio/
A3:需要升级pip3,再重新执行安装命令
$ pip3 install --upgrade pip
$ pip3 install --upgrade setuptools
Q4: 使用过程中出现CXXABI错误 or 遇到libstdc++.so.6的版本不够的问题
/lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found
A4:gcc版本不匹配,参考上面gcc版本冲突解决办法
Q5:
configure: error: *** A compiler with support for C++17 language features is required
A5:gcc版本不匹配,参考上面gcc版本冲突解决办法