本文最后更新于 2024-11-10,文章内容可能已经过时。

【热身打卡】开发框架,从编译 paddle 开始 · Issue #45347 · PaddlePaddle/Paddle

在飞桨框架二次开发中,编译 paddle 是一个重要环节,也是很多任务(如API开发、算子性能优化、数据类型扩展等)的前置条件。本次热身打卡活动,要求参与者通过 github 拉取 PaddlePaddle/Paddle 仓库代码,并参考 源码编译教程 完成 paddle 编译

OS:Ubuntu 22.04LTS

Platform:x86-64

CPU:AMD 8845HS

GPU:Radeon 780m(paddle目前还不支持高版本的ROCm,因此核显暂时用不了)

Linux下源码编译

Linux 下使用 make 从源码编译-使用文档-PaddlePaddle深度学习平台

环境准备

  • Linux 版本 (64 bit)

    • CentOS 7 (GPU 版本支持 CUDA 11.0 - 12.0)

    • Ubuntu 18.04 (GPU 版本支持 CUDA 11.0 - 12.0)

    • Ubuntu 20.04 (GPU 版本支持 CUDA 11.0 - 12.0)

  • Python 版本 3.8/3.9/3.10/3.11/3.12 (64 bit)

选择 CPU/GPU

  • 如果您的计算机没有 NVIDIA® GPU,请安装 CPU 版本的 PaddlePaddle

  • 如果您的计算机有 NVIDIA® GPU,请确保满足以下条件以编译 GPU 版 PaddlePaddle

    • CUDA 工具包配合 cuDNN 8(如需多卡支持,需配合 NCCL2.7 及更高)

    • GPU 运算能力超过 6.0 的硬件设备

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

安装步骤

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

使用 Docker 编译

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

使用 Docker 编译 PaddlePaddle,您需要:

请您按照以下步骤安装:

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:

    docker pull registry.baidubce.com/paddlepaddle/paddle:latest-dev-cuda12.0-cudnn8.9-trt8.6-gcc12.2
    

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

  • CPU 版的 PaddlePaddle:

    docker pull paddlepaddle/paddle:latest-dev
    
  • GPU 版的 PaddlePaddle(建议使用较新的镜像,并确保已经成功安装 NVIDIA Container Toolkit):

    docker pull paddlepaddle/paddle:latest-dev-cuda12.0-cudnn8.9-trt8.6-gcc12.2
    

上例中,latest-dev-cuda12.0-cudnn8.9-trt8.6-gcc12.2 仅作示意用,表示安装 GPU 版的镜像。如果您还想安装其他 cuda/cudnn 版本的镜像,可以将其替换成其他版本(建议拉取最新的 GPU 版本)。 您可以访问DockerHub获取与您机器适配的镜像。

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

  • 编译 CPU 版本的 PaddlePaddle:

    用从百度拉取的镜像创建容器:

docker run --name paddle-test -v $PWD:/paddle --network=host -it registry.baidubce.com/paddlepaddle/paddle:latest-dev /bin/bash
  • --name paddle-test:为您创建的 Docker 容器命名为 paddle-test;

  • -v $PWD:/paddle: 将当前目录挂载到 Docker 容器中的/paddle 目录下(Linux 中 PWD 变量会展开为当前路径的绝对路径);

  • -it: 与宿主机保持交互状态;

  • registry.baidubce.com/paddlepaddle/paddle:latest-dev:使用名为registry.baidubce.com/paddlepaddle/paddle:latest-dev的镜像创建 Docker 容器,/bin/bash 进入容器后启动/bin/bash 命令。

若使用的是从 DockerHub 拉取的镜像创建容器,则修改镜像名即可:

docker run --name paddle-test -v $PWD:/paddle --network=host -it paddlepaddle/paddle:latest-dev /bin/bash
  • 编译 GPU 版本的 PaddlePaddle:

    用从百度拉取的镜像创建容器

    docker run --gpus all --name paddle-test -v $PWD:/paddle --network=host -it registry.baidubce.com/paddlepaddle/paddle:latest-dev-cuda12.0-cudnn8.9-trt8.6-gcc12.2 /bin/bash
    
    • --gpus all: 在 Docker 容器中允许使用 gpu;

    • --name paddle-test:为您创建的 Docker 容器命名为 paddle-test;

    • -v $PWD:/paddle: 将当前目录挂载到 Docker 容器中的/paddle 目录下(Linux 中 PWD 变量会展开为当前路径的绝对路径);

    • -it: 与宿主机保持交互状态;

    • registry.baidubce.com/paddlepaddle/paddle:latest-dev-cuda12.0-cudnn8.9-trt8.6-gcc12.2:使用名为registry.baidubce.com/paddlepaddle/paddle:latest-dev-cuda12.0-cudnn8.9-trt8.6-gcc12.2的镜像创建 Docker 容器,/bin/bash 进入容器后启动/bin/bash 命令。

    若使用的是从 DockerHub 拉取的镜像创建容器,则修改镜像名即可:

    docker run --gpus all --name paddle-test -v $PWD:/paddle --network=host -it paddlepaddle/paddle:latest-dev-cuda12.0-cudnn8.9-trt8.6-gcc12.2 /bin/bash
    

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

使用 GPU 版本镜像时,请确保成功安装 NVIDIA Container Toolkit ,否则无法在镜像中启用 GPU ,并且建议选择最新的 CPU 或者 GPU 镜像,否则可能会由于代码迭代较快,出现编译相关问题。

5. 进入 Docker 后首先安装依赖进入 paddle 目录下:

注:笔者提前安装了conda,之后使用的是虚拟环境

docker exec -it paddle-test /bin/bash
cd /paddle

6. 切换到 develop 版本进行编译:

git checkout develop

paddle 支持 Python 3.8 以上版本

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

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

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

  • 安装 protobuf。

pip install protobuf

注意:以上用 Python3.10 命令来举例,如您的 Python 版本为 3.8/3.9/3.11/3.12,请将上述命令中的 pip3.10 改成 pip3.8/pip3.9/pip3.11/pip3.12

  • 安装 patchelf,PatchELF 是一个小而实用的程序,用于修改 ELF 可执行文件的动态链接器和 RPATH。

apt install patchelf

9. 执行 cmake:

首先查看Python版本与Python位置

python -V
which python

根据python版本设置-DPY_VERSION=3.10

同时需要

  • 对于需要编译CPU 版本 PaddlePaddle的用户:

    time cmake .. -DPY_VERSION=3.10 -DWITH_GPU=OFF
  • 对于需要编译GPU 版本 PaddlePaddle的用户:

    time cmake .. -DPY_VERSION=3.10 -DWITH_GPU=ON
    
  • 具体编译选项含义请参见编译选项表

  • 请注意修改参数-DPY_VERSION为您希望编译使用的 python 版本, 例如-DPY_VERSION=3.10表示 python 版本为 3.10

  • 我们目前不支持 CentOS 6 下使用 Docker 编译 GPU 版本的 PaddlePaddle

10. 执行编译:

使用多核编译

time make -j$(nproc)

11. 编译成功后进入/paddle/build/python/dist目录下找到生成的.whl包:

cd /paddle/build/python/dist

12. 在当前机器或目标机器安装编译好的.whl包:

For Python3:

# pip install -U [whl 包的名字]
pip install -U paddlepaddle-0.0.0-cp310-cp310-linux_x86_64.whl

恭喜,至此您已完成 PaddlePaddle 的编译安装。您只需要进入 Docker 容器后运行 PaddlePaddle,即可开始使用。更多 Docker 使用请参见Docker 官方文档

编译中可能出现的问题

Missing build dependency: xxx——参考centos编译paddle develop (cpu)报错。 · Issue #66283 · PaddlePaddle/Paddle

version `GLIBCXX_3.4.30' not found——参考如何解决 :libstdc++.so.6: version `GLIBCXX_3.4.30‘ not found-CSDN博客

首先使用find /usr/lib -name libstdc++.so.6 查找位置,随后软链接到paddle虚拟环境

ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /root/miniconda3/envs/paddle/lib/libstdc++.so.6

本机编译(暂时略过)

验证安装

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

import paddle

再输入

paddle.utils.run_check()

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

可能出现的问题

module compiled against ABI version 0x1000009 but this version of numpy is 0x2000000

这是因为numpy版本不匹配,对numpy进行降版本

pip install -U numpy==1.26.4

如何卸载

请使用以下命令卸载 PaddlePaddle:

  • CPU 版本的 PaddlePaddle:

    pip uninstall paddlepaddle
    

    pip3 uninstall paddlepaddle
    
  • GPU 版本的 PaddlePaddle:

    pip uninstall paddlepaddle-gpu
    

    pip3 uninstall paddlepaddle-gpu
    

使用 Docker 安装 PaddlePaddle 的用户,请进入包含 PaddlePaddle 的容器中使用上述命令,注意使用对应版本的 pip

运行单元测试

不同的编译选项,能编译出不同的功能,对应的编译时间也各不相同。可以参考编译选项表,尝试打开WITH_TESTING=ON编译出单元测试,并正确运行一个单测。

  • 重新运行cmake命令:time cmake .. -DPY_VERSION=3.10 -DWITH_GPU=OFF -DWITH_TESTING=ON(在原来的cmake命令后加入-DWITH_TESTING=ON

  • 执行编译命令time make -j16