Linux 下从源码编译

环境准备

Linux 版本 (64 bit)

CentOS 6 (不推荐,不提供编译出现问题时的官方支持)
CentOS 7 (GPU 版本支持 CUDA 10.2/11.0/11.1/11.2)
Ubuntu 14.04 (不推荐,不提供编译出现问题时的官方支持)
Ubuntu 16.04 (GPU 版本支持 CUDA 10.2/11.0/11.1/11.2)
Ubuntu 18.04 (GPU 版本支持 CUDA 10.2/11.0/11.1/11.2)

Python 版本 3.6/3.7/3.8/3.9/3.10 (64 bit)

选择 CPU/GPU

如果您的计算机没有 NVIDIA GPU,请安装 CPU 版本的 PaddlePaddle。 如果您的计算机有 NVIDIA GPU,请确保满足以下条件以编译 GPU 版 PaddlePaddle:

CUDA 工具包10.2配合 cuDNN 7 (cuDNN 版本>=7.6.5)
CUDA 工具包11.0配合 cuDNN v8.0.4
CUDA 工具包11.1配合 cuDNN v8.1.1
CUDA 工具包11.2配合 cuDNN v8.1.1
GPU 运算能力超过3.5的硬件设备

您可参考 NVIDIA 官方文档了解 CUDA 和 cuDNN 的安装流程和配置方法,请见 CUDAcuDNN

安装步骤

在 Linux 的系统下有2种编译方式,推荐使用 Docker 编译。 Docker 环境中已预装好编译 Paddle 需要的各种依赖,相较本机编译环境更简单。

1. 使用 Docker 编译(不提供在 CentOS 6下编译中遇到问题的支持)
2. 本机编译(不提供在 CentOS 6下编译中遇到问题的支持)

使用 docker 编译

Docker 是一个开源的应用容器引擎。使用 Docker,既可以将 PaddlePaddle 的安装&使用与系统环境隔离,也可以与主机共享 GPU、网络等资源

使用 Docker 编译时,您需要:

1. 在本地主机上安装 Docker
2. 如需在 Linux 开启 GPU 支持,请安装 nvidia-docker

请您按照以下步骤编译安装:

1. 请首先选择您希望储存 PaddlePaddle 的路径,然后在该路径下使用以下命令将 PaddlePaddle 的源码从 github 克隆到本地当前目录下名为 Paddle 的文件夹中

git clone https://github.com/PaddlePaddle/Paddle.git

2. 进入 Paddle 目录下

cd Paddle

3. 拉取 PaddlePaddle 镜像

对于国内用户,因为网络问题下载 docker 比较慢时,可使用百度提供的镜像:

CPU 版的 PaddlePaddle:

docker pull registry.baidubce.com/paddlepaddle/paddle:latest-dev

GPU 版的 PaddlePaddle:

nvidia-docker pull registry.baidubce.com/paddlepaddle/paddle:latest-dev-cuda11.2-cuDNN8-gcc82

如果您的机器不在中国大陆地区,可以直接从 DockerHub 拉取镜像:

CPU 版的 PaddlePaddle:

docker pull paddlepaddle/paddle:latest-dev

GPU 版的 PaddlePaddle:

nvidia-docker pull paddlepaddle/paddle:latest-dev-cuda11.2-cuDNN8-gcc82

上例中,latest-dev-cuda11.2-cuDNN8-gcc82 仅作示意用,表示安装 GPU 版的镜像。如果您还想安装其他 cuda/cuDNN 版本的镜像,可以将其替换成 latest-gpu-cuda10.1-cuDNN7-gcc82-dev、latest-gpu-cuda10.1-cuDNN7-gcc54-dev 等。 您可以访问 DockerHub 获取与您机器适配的镜像。

4. 创建并进入已配置好编译环境的 Docker 容器

编译 CPU 版本的 PaddlePaddle:

docker run --name paddle-test -v $PWD:/paddle --network=host --privileged=true -it registry.baidubce.com/paddlepaddle/paddle:latest-dev /bin/bash

其中参数的意义为:

--name paddle-test:为您创建的 Docker 容器命名为 paddle-test;
-v $PWD:/paddle: 将当前目录挂载到 Docker 容器中的 /paddle 目录下(Linux 中 PWD 变量会展开为当前路径的绝对路径);
--privileged=true: container 内的 root用户 拥有真正的 root 权限
-it: 与宿主机保持交互状态;
registry.baidubce.com/paddlepaddle/paddle:latest-dev:使用名为 registry.baidubce.com/paddlepaddle/paddle:latest-dev 的镜像创建 Docker 容器,/bin/bash 进入容器后启动 /bin/bash 命令。

编译 GPU 版本的 PaddlePaddle:

nvidia-docke run --name paddle-test -v $PWD:/paddle --network=host --privileged=true -it registry.baidubce.com/paddlepaddle/paddle:latest-dev /bin/bash

注意: 请确保至少为 docker 分配 4g 以上的内存,否则编译过程可能因内存不足导致失败。

5. 进入 Docker 后进入 paddle 目录下

cd /paddle

6. 切换到较稳定版本下进行编译

git checkout [分支名]

例如:

git checkout release/2.3

7. 创建并进入 /paddle/build 路径下

mkdir -p /paddle/build && cd /paddle/build

8. 使用以下命令安装相关依赖

安装 protobuf。

pip3.7 install protobuf

注意:以上用 Python3.7 命令来举例,请将上述命令中的 pip3.7 改成对应的版本。

9. 执行 cmake

编译 CPU 版本:

cmake .. -DPY_VERSION=3.7 -DWITH_TESTING=OFF -DWITH_MKL=ON -DWITH_GPU=OFF -DON_INFER=ON

编译 GPU 版本:

cmake .. -DPY_VERSION=3.7 -DWITH_TESTING=OFF -DWITH_MKL=ON -DWITH_GPU=ON -DON_INFER=ON

使用 TensorRT:

如果想使用 TensorRT 进行推理,首先需要根据自己的需求下载对应版本的 TensorRT GA build, 下载解压后,在 cmake 中开启 WITH_TENSORRT, 并通过 TENSORRT_ROOT 指定刚刚解压的 TensorRT_lib 的路径。假设下载的 TensorRT lib 解压 目录为 /paddle/nvidia/TensorRT/, cmake 编译指令如下:

cmake .. -DPY_VERSION=3.7 -DWITH_TESTING=OFF -DWITH_MKL=ON -DWITH_GPU=ON -DON_INFER=ON \
					-DWITH_TENSORRT=ON -DTENSORRT_ROOT=/paddle/nvidia/TensorRT/

更多 cmake 参数可以查看 cmake 参数表:

选项 说明 默认值
WITH_GPU 是否支持GPU ON
WITH_AVX 是否编译含有AVX指令集的飞桨二进制文件 ON
WITH_PYTHON 是否内嵌PYTHON解释器并编译Wheel安装包 ON
WITH_TESTING 是否开启单元测试 OFF
WITH_MKL 是否使用MKL数学库,如果为否,将使用OpenBLAS ON
WITH_SYSTEM_BLAS 是否使用系统自带的BLAS OFF
WITH_DISTRIBUTE 是否编译带有分布式的版本 OFF
WITH_BRPC_RDMA 是否使用BRPC,RDMA作为RPC协议 OFF
ON_INFER 是否打开推理优化 OFF
CUDA_ARCH_NAME 是否只针对当前CUDA架构编译 All:编译所有可支持的CUDA架构;Auto:自动识别当前环境的架构编译
WITH_TENSORRT 是否开启 TensorRT OFF
TENSORRT_ROOT TensorRT_lib的路径,该路径指定后会编译 TensorRT 子图功能eg:/paddle/nvidia/TensorRT/ /usr

10. 执行编译

make -j4

编译飞桨过程中可能会打开很多文件,如果编译过程中显示 “Too many open files” 错误时,请使用指令 ulimit -n 102400 来增大当前进程允许打开的文件数**

ulimit -n 102400

注意: 编译过程中需要从 github 上下载依赖,请确保您的编译环境能正常从 github 下载代码。

11. 编译成功后可在 dist 目录找到生成的 .whl 包

pip3 install python/dist/[wheel 包名字]

12. 推理库编译

make inference_lib_dist -j4

编译成功后,所有产出均位于 build 目录下的 paddle_inference_install_dir 目录内。

本机编译

本机编译与 docker 编译的区别只有环境准备不同, docker 中已经配置好了相关环境,本机编译中,需要用户自己配置编译依赖项

1. 安装必要的工具

以 Ubuntu 上为例, 安装编译依赖项可通过如下命令:

sudo apt-get install gcc g++ make cmake git vim unrar python3 python3-dev python3-pip swig wget  libopencv-dev
pip3 install numpy protobuf wheel setuptools

若需启用 CUDA 加速,需准备 CUDA、cuDNN。请参考 NVIDIA 官网文档了解 CUDA 和 cuDNN 的安装流程和配置方法,请见 CUDAcuDNN, 版本对应关系如下表所示:

CUDA 版本 cuDNN 版本 TensorRT 版本
10.2 7.6 7
11.0 8.0 7
11.2 8.2 8

以 CUDA 11.3,cuDNN 8.2 为例配置 CUDA 环境。

# cuda
sh cuda_11.3.0_465.19.01_linux.run
export PATH=/usr/local/cuda-11.3/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.3/${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

# cuDNN
tar -xzvf cudnn-11.3-linux-x64-v8.2.1.32.tgz
sudo cp -a cuda/include/cuDNN.h /usr/local/cuda/include/
sudo cp -a cuda/lib64/libcuDNN* /usr/local/cuda/lib64/

2. 编译

2.1) 下载 Paddle

使用 Git 将飞桨代码克隆到本地,并进入目录,切换到稳定版本(git tag显示的标签名,如 release/2.3)。 飞桨使用 develop 分支进行最新特性的开发,使用 release 分支发布稳定版本。在 GitHub 的 Releases 选项卡中,可以看到飞桨版本的发布记录。

git clone https://github.com/PaddlePaddle/Paddle.git
cd Paddle
git checkout release/2.3

2.2)cmake

下面以 GPU 版本为例说明编译命令。其他环境可以参考“ CMake 编译选项表”修改对应的 cmake 选项。比如,若编译 CPU 版本,请将 WITH_GPU 设置为 OFF。

# 创建并进入 build 目录
mkdir build_cuda && cd build_cuda
# 执行cmake指令
cmake .. -DPY_VERSION=3 \
        -DWITH_TESTING=OFF \
        -DWITH_MKL=ON \
        -DWITH_GPU=ON \
        -DON_INFER=ON \
        ..

2.3) 使用 make 编译

make -j4

更多 cmake 参数可以查看 cmake 参数表:

选项 说明 默认值
WITH_GPU 是否支持GPU ON
WITH_AVX 是否编译含有AVX指令集的飞桨二进制文件 ON
WITH_PYTHON 是否内嵌PYTHON解释器并编译Wheel安装包 ON
WITH_TESTING 是否开启单元测试 OFF
WITH_MKL 是否使用MKL数学库,如果为否,将使用OpenBLAS ON
WITH_SYSTEM_BLAS 是否使用系统自带的BLAS OFF
WITH_DISTRIBUTE 是否编译带有分布式的版本 OFF
WITH_BRPC_RDMA 是否使用BRPC,RDMA作为RPC协议 OFF
ON_INFER 是否打开推理优化 OFF
CUDA_ARCH_NAME 是否只针对当前CUDA架构编译 All:编译所有可支持的CUDA架构;Auto:自动识别当前环境的架构编译
WITH_TENSORRT 是否开启 TensorRT OFF
TENSORRT_ROOT TensorRT_lib的路径,该路径指定后会编译 TensorRT 子图功能eg:/paddle/nvidia/TensorRT/ /usr

3. 安装Wheel包

编译成功后可在 dist 目录找到生成的 .whl 包

pip3 install python/dist/[wheel 包名字]

4. 编译C++推理库(按需)

make inference_lib_dist -j4

编译成功后,所有产出均位于 build 目录下的 paddle_inference_install_dir 目录内。

编译飞桨过程中可能会打开很多文件,如果编译过程中显示 “Too many open files” 错误时,请使用指令 ulimit -n 102400 来增大当前进程允许打开的文件数

ulimit -n 102400

5. 验证安装

安装完成后你可以使用 python 进入 python 解释器,输入:

import paddle
paddle.utils.run_check()

如果出现 PaddlePaddle is installed successfully!,说明你已成功安装。

恭喜,至此你已完成 Paddle Inference 的编译安装