2024 Q4 PaddleMIX(四)热身任务——开发框架,从编译 paddle 开始
本文最后更新于 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 版本 (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 的硬件设备
安装步骤
在 Linux 的系统下有 2 种编译方式,推荐使用 Docker 编译。 Docker 环境中已预装好编译 Paddle 需要的各种依赖,相较本机编译环境更简单。
使用 Docker 编译
Docker是一个开源的应用容器引擎。使用 Docker,既可以将 PaddlePaddle 的安装&使用与系统环境隔离,也可以与主机共享 GPU、网络等资源
使用 Docker 编译 PaddlePaddle,您需要:
在本地主机上安装 Docker
如需在 Linux 开启 GPU 支持,请安装 NVIDIA Container Toolkit
请您按照以下步骤安装:
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
本机编译(暂时略过)
验证安装
安装完成后您可以使用 python
或 python3
进入 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
安装第三方依赖
pip install -r ../python/requirements.txt
进入build目录,运行单元测试:参考【飞桨API python端开发指南】之【运行单元测试】,执行
ctest -R test_logsumexp
运行logsumexp的单测。
- 感谢你赐予我前进的力量