【PaddlePaddle】保姆级教程:Ubuntu22.04+CUDA12.2编译PaddlePaddle源码并安装

文章目录

  • 写在前面
  • 安装WSL2 Ubuntu 22.04 LTS
    • 准备工作
    • 便捷安装
    • 手动安装
    • 收尾工作
    • 换源和系统更新
  • 安装gcc、g++、cmake
    • gcc 11.4
    • g++ 11.4
    • cmake 3.27
  • 安装cuda、cudnn、nccl
    • cuda 12.2
    • cudnn 8.9.4.25
    • nccl
  • 安装anaconda
  • 配置github
  • Linux下使用make从源码编译PaddlePaddle
    • 安装必要工具
    • 设置python相关的环境变量
    • 拉取源码仓库并编译
  • 参考文档

写在前面

恰逢研一开学,在上课之余想利用这可以自己支配的半年时间再扩展一项技能。

突然想到自己平常在某乎看到众多帖子均在写pytorch大大小小的坑,于是思来想去,决定支持一下国产深度学习框架:PaddlePaddle

开个新坑,记录自己的学习历程

安装WSL2 Ubuntu 22.04 LTS

准备工作

需要先启用“适用于 Linux 的 Windows 子系统”可选功能,然后才能在 Windows 上安装 Linux 分发。

以管理员身份打开PowerShell并运行:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

显示操作成功后,重启电脑即可(注意是重启不是“关机然后启动”):

【PaddlePaddle】保姆级教程:Ubuntu22.04+CUDA12.2编译PaddlePaddle源码并安装_第1张图片

注意,重启电脑后只能够安装WSL1

安装 WSL2 之前,必须启用“虚拟机平台”可选功能,以管理员身份打开 PowerShell 并运行:

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

显示操作成功后,再次重新启动电脑,以完成WSL安装并更新到 WSL2

重启后,将WSL2设为默认版本,用管理员身份打开 Powershell 输入以下命令:

wsl --set-default-version 2

便捷安装

直接在Microsoft Store搜索ubuntu,选择合适版本,默认只能安装在c盘。

【PaddlePaddle】保姆级教程:Ubuntu22.04+CUDA12.2编译PaddlePaddle源码并安装_第2张图片

安装后“打开”即可,按照命令行的指引输入用户名和密码。

手动安装

首先获取安装包:ubuntu2204,其他版本的安装包详见参考文档2

下载完成后,可以看到文件名为Ubuntu2204-221101.AppxBundle,我们将其重命名为Ubuntu2204.zip,并解压缩至你想安装的盘内,可以看到里面的文件结构是这样的:

【PaddlePaddle】保姆级教程:Ubuntu22.04+CUDA12.2编译PaddlePaddle源码并安装_第3张图片

双击运行其中的Ubuntu_2204.1.7.0_x64.appx,按照引导进行安装、输入用户名和密码即可完成安装。

收尾工作

最后通过管理员Powershell执行以下命令将 Ubuntu 18.04.6 LTS 设置为 WSL2 去执行:

wsl --set-version Ubuntu-22.04 2

换源和系统更新

以下内容就要进入WSL2 Ubuntu进行操作了,我习惯使用vscode连接WSL

首先对原本的软件源配置文件/etc/apt/sources.list做一个备份:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

然后打开sources.list文件:

sudo vim /etc/apt/sources.list

直接键盘敲下49dd清除其中的全部内容,然后键盘敲下i进入输入模式。

在ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror中选择对应版本,我们使用22.04,复制对应内容:

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse

# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse

将内容使用ctrl v粘贴到sources.list中,键盘敲下ESC后继续敲下:wq,按下回车即可完成写入。

最后更新源即可完成源的替换,注意要全部get成功,没有err:

sudo apt update

之后我们使用清华源更新系统:

sudo apt -y update && sudo apt -y upgrade

最后,如果你想用linux自带的python进行源码编译,需要下载python3.7以上的python版本,并设为默认,详情参考参考文档4

由于我习惯用ananconda作为python管理工具,因此不使用自带的python。

安装gcc、g++、cmake

gcc 11.4

sudo apt install gcc

查看gcc版本:

gcc --version

版本高于8.2.0即可,否则无法编译paddle源码,如果仍是gcc 7,使用以下指令升级到gcc 8.4.0:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test && \
sudo apt update && \
sudo apt install gcc-8 && \
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 90

g++ 11.4

sudo apt install g++

查看g++版本:

g++ --version

g++版本需要和gcc版本保持一致,比如都是11的大版本或者都是8的大版本,如果你是从gcc 7升级到gcc 8,可以参考参考文档6进行升级

cmake 3.27

如果按照paddle官方的说法装3.16,会发生下面的问题:CUDA_STANDARD is set to invalid value ‘17’ · Issue #54822 · PaddlePaddle/Paddle (github.com)

PaddlePaddle自己不把github issue给更新到文档里吗???太坑了点吧???

首先获取安装包:

wget -q https://cmake.org/files/LatestRelease/cmake-3.27.0-linux-x86_64.tar.gz

解压:

tar -zxvf cmake-3.27.0-linux-x86_64.tar.gz

配置环境变量,进入~/.bashrc文件:

sudo vim ~/.bashrc

键盘敲击i进入编辑,在末尾添加内容:

export PATH=/home/liyang/cmake-3.27.0-linux-x86_64/bin:$PATH

然后让配置文件生效:

source ~/.bashrc

使用cmake --version查看到相应版本即说明安装成功。

安装cuda、cudnn、nccl

cuda 12.2

首先去CUDA Toolkit Archive | NVIDIA Developer找到自己想安装的版本,单击进去,按照自己的ubuntu系统进行选择:

【PaddlePaddle】保姆级教程:Ubuntu22.04+CUDA12.2编译PaddlePaddle源码并安装_第4张图片

按照installation instructions下的两个命令安装就行:

wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run && \
sudo sh cuda_12.2.2_535.104.05_linux.run

安装完成后,添加环境变量

首先进入~/.bashrc文件:

sudo vim ~/.bashrc

键盘敲击i进入编辑,在末尾添加如下两行内容:

export PATH=/usr/local/cuda-12.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64$LD_LIBRARY_PATH

然后让配置文件生效:

source ~/.bashrc

使用nvcc --version查看到版本即说明安装成功:

【PaddlePaddle】保姆级教程:Ubuntu22.04+CUDA12.2编译PaddlePaddle源码并安装_第5张图片

cudnn 8.9.4.25

安装包在cuDNN Archive | NVIDIA Developer下载,注意版本对cuda对应。

PaddlePaddle 可以使用 cuDNN v5.1 之后的任何一个版本来编译运行,但尽量请保持编译和运行使用的 cuDNN 是同一个版本。 推荐使用最新版本的 cuDNN。

【PaddlePaddle】保姆级教程:Ubuntu22.04+CUDA12.2编译PaddlePaddle源码并安装_第6张图片

下载好安装包后,进行解压:

tar -xvf cudnn-linux-x86_64-8.9.4.25_cuda12-archive.tar.xz

命令行进入解压后的文件夹,输入以下命令:

sudo cp lib/* /usr/local/cuda-12.2/lib64/ && \
sudo cp include/* /usr/local/cuda-12.2/include/ && \
sudo chmod a+r /usr/local/cuda-12.2/lib64/* && \
sudo chmod a+r /usr/local/cuda-12.2/include/*

完成cudnn的安装。

nccl

进入NVIDIA Collective Communications Library (NCCL) Legacy Download Page | NVIDIA Developer,按照下图指引:

【PaddlePaddle】保姆级教程:Ubuntu22.04+CUDA12.2编译PaddlePaddle源码并安装_第7张图片

使用Network installer安装nccl:

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb && \
sudo dpkg -i cuda-keyring_1.0-1_all.deb && \
sudo apt-get update && \
sudo apt install libnccl2=2.18.3-1+cuda12.2 libnccl-dev=2.18.3-1+cuda12.2

此时出现了以下问题:

/sbin/ldconfig.real: /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8 is not a symbolic link

/sbin/ldconfig.real: /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_adv_train.so.8 is not a symbolic link

/sbin/ldconfig.real: /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8 is not a symbolic link

/sbin/ldconfig.real: /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn.so.8 is not a symbolic link

/sbin/ldconfig.real: /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8 is not a symbolic link

/sbin/ldconfig.real: /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_ops_train.so.8 is not a symbolic link

/sbin/ldconfig.real: /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8 is not a symbolic link

/sbin/ldconfig.real: Can’t link /usr/lib/wsl/lib/libnvoptix_loader.so.1 to libnvoptix.so.1
/sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link

再次执行最后一行的安装命令后显示已经安装了,所以暂时搁置这个问题。

安装anaconda

也可以直接使用自带的python,我个人更喜欢包管理工具。

从Free Download | Anaconda获取安装包链接,然后命令行使用wget拉到本地就行

【PaddlePaddle】保姆级教程:Ubuntu22.04+CUDA12.2编译PaddlePaddle源码并安装_第8张图片

wget https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-x86_64.sh

将sh文件运行安装即可

bash Anaconda3-2023.07-2-Linux-x86_64.sh

中途会有多次回车和输入"yes"的情况

重启命令行,看到(bash)即表示安装成功

在这里插入图片描述

完成安装,现在新建个env用于之后paddlepaddle的安装

conda create -n paddle python=3.11

进入虚拟环境:

conda activate paddle

安装之后编译必要的包:

pip install numpy protobuf

配置github

安装git:

sudo apt-get install git

随后用git --version检查是否安装成功。

配置用户名:

git config --global user.name xxx

注意把xxx替换成自己的用户名

配置邮箱地址:

git config --global user.email xxx

注意把xxx替换成自己的邮箱

随后用git config --list查看是否配置成功

生成SSH密钥:

ssh-keygen -t rsa -C "[email protected]"

注意提替换成自己的邮箱

之后就可以看到生成了~/.ssh目录,并且其中包含了两个文件id_rsaid_rsa.pub

  • 使用vscode直接打开id_rsa.pub,复制其中的内容

  • 打开github,按下图顺序将该ssh key添加进去

【PaddlePaddle】保姆级教程:Ubuntu22.04+CUDA12.2编译PaddlePaddle源码并安装_第9张图片

检查是否配置成功

ssh [email protected]

【PaddlePaddle】保姆级教程:Ubuntu22.04+CUDA12.2编译PaddlePaddle源码并安装_第10张图片

解决git clone无法连接的问题:

取消Git本身的代理,使用本机的代理。

//取消http代理
git config --global --unset http.proxy
//取消https代理 
git config --global --unset https.proxy

Linux下使用make从源码编译PaddlePaddle

安装必要工具

  • bzip2
sudo apt install -y bzip2
  • make
sudo apt install -y make
  • 其他依赖环境
sudo apt install unrar swig patchelf

设置python相关的环境变量

  1. 找到Python lib的路径,设置PYTHON_LIBRARIES:
find `dirname $(dirname $(which python3.11))` -name "libpython3.11.so"

得到路径:/home/liyang/anaconda3/envs/paddle/lib/libpython3.11.so 注意下面换成自己的路径

export PYTHON_LIBRARY=/home/liyang/anaconda3/envs/paddle/lib/libpython3.11.so
  1. 找到Python Include的路径,设置PYTHON_INCLUDE_DIR:
find `dirname $(dirname $(which python3))`/include -name "python3.11"

得到路径:/home/liyang/anaconda3/envs/paddle/include/python3.11 注意下面换成自己的路径。

export PYTHON_INCLUDE_DIRS=/home/liyang/anaconda3/envs/paddle/include/python3.11
  1. 设置系统环境变量路径:

    将第一步的路径最后两级目录改为/bin/后的路径为:/home/liyang/anaconda3/envs/paddle/bin/

    export PATH=/home/liyang/anaconda3/envs/paddle/bin/:$PATH
    

注意换成自己的路径

拉取源码仓库并编译

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

  1. 从github拉取paddlepaddle的源码,进入其对应的Paddle目录下,并切换git分支到develop

    git clone [email protected]:PaddlePaddle/Paddle.git && \
    cd Paddle && \
    git checkout develop
    
  2. 这是最关键的一点,修改git submodule的url,使用SSH而不是http,(如果你配置了科学上网,请跳过此步,如何为wsl配置可以参考参考文档9的一条关于TUN模式的评论,当然我更推荐配置一下,这样就没后面这些破事儿了-.-)

    打开Paddle/.gitmodules文件,复制下面的内容替换其中的内容:

    [submodule "third_party/protobuf"]
    	path = third_party/protobuf
    	url = [email protected]:protocolbuffers/protobuf.git
    	ignore = dirty
    [submodule "third_party/pocketfft"]
    	path = third_party/pocketfft
    	url = https://gitlab.mpcdf.mpg.de/mtr/pocketfft.git
    	ignore = dirty
    [submodule "third_party/gflags"]
    	path = third_party/gflags
    	url = [email protected]:gflags/gflags.git
    	ignore = dirty
    [submodule "third_party/gloo"]
    	path = third_party/gloo
    	url = [email protected]:ziyoujiyi/gloo.git
    	ignore = dirty
    [submodule "third_party/dlpack"]
    	path = third_party/dlpack
    	url = [email protected]:dmlc/dlpack.git
    	ignore = dirty
    [submodule "third_party/utf8proc"]
    	path = third_party/utf8proc
    	url = [email protected]:JuliaStrings/utf8proc.git
    	ignore = dirty
    [submodule "third_party/warpctc"]
    	path = third_party/warpctc
    	url = [email protected]:baidu-research/warp-ctc.git
    	ignore = dirty
    [submodule "third_party/warprnnt"]
    	path = third_party/warprnnt
    	url = [email protected]:PaddlePaddle/warp-transducer.git
    	ignore = dirty
    [submodule "third_party/xxhash"]
    	path = third_party/xxhash
    	url = [email protected]:Cyan4973/xxHash.git
    	ignore = dirty
    [submodule "third_party/pybind"]
    	path = third_party/pybind
    	url = [email protected]:pybind/pybind11.git
    	ignore = dirty
    [submodule "third_party/threadpool"]
    	path = third_party/threadpool
    	url = [email protected]:progschj/ThreadPool.git
    	ignore = dirty
    [submodule "third_party/zlib"]
    	path = third_party/zlib
    	url = [email protected]:madler/zlib.git
    	ignore = dirty
    [submodule "third_party/glog"]
    	path = third_party/glog
    	url = [email protected]:google/glog.git
    	ignore = dirty
    [submodule "third_party/eigen3"]
    	path = third_party/eigen3
    	url = https://gitlab.com/libeigen/eigen.git
    	ignore = dirty
    [submodule "third_party/snappy"]
    	path = third_party/snappy
    	url = [email protected]:google/snappy.git
    	ignore = dirty
    [submodule "third_party/cub"]
    	path = third_party/cub
    	url = [email protected]:NVIDIA/cub.git
    	ignore = dirty
    [submodule "third_party/cutlass"]
    	path = third_party/cutlass
    	url = [email protected]:NVIDIA/cutlass.git
    	ignore = dirty
    [submodule "third_party/xbyak"]
    	path = third_party/xbyak
    	url = [email protected]:herumi/xbyak.git
    	ignore = dirty
    [submodule "third_party/mkldnn"]
    	path = third_party/mkldnn
    	url = [email protected]:oneapi-src/oneDNN.git
    	ignore = dirty
    [submodule "third_party/flashattn"]
    	path = third_party/flashattn
    	url = [email protected]:PaddlePaddle/flash-attention.git
    	ignore = dirty
    [submodule "third_party/gtest"]
    	path = third_party/gtest
    	url = [email protected]:google/googletest.git
    	ignore = dirty
    [submodule "third_party/openblas"]
    	path = third_party/openblas
    	url = [email protected]:xianyi/OpenBLAS.git
    	ignore = dirty
    [submodule "third_party/leveldb"]
    	path = third_party/leveldb
    	url = [email protected]:google/leveldb.git
    	ignore = dirty
    [submodule "third_party/brpc"]
    	path = third_party/brpc
    	url = [email protected]:apache/brpc.git
    	ignore = dirty
    [submodule "third_party/rocksdb"]
    	path = third_party/rocksdb
    	url = [email protected]:Thunderbrook/rocksdb
    	ignore = dirty
    [submodule "third_party/absl"]
    	path = third_party/absl
    	url = [email protected]:abseil/abseil-cpp.git
    	ignore = dirty
    [submodule "third_party/jitify"]
    	path = third_party/jitify
    	url = [email protected]:NVIDIA/jitify.git
    	ignore = dirty
    

    ==注意:==此时所有的submodule均以clone,但被清除内容了,此时,只需要回去把每个仓库的changes给撤回就可以了

    第一步:

    【PaddlePaddle】保姆级教程:Ubuntu22.04+CUDA12.2编译PaddlePaddle源码并安装_第11张图片

    第二步:

    【PaddlePaddle】保姆级教程:Ubuntu22.04+CUDA12.2编译PaddlePaddle源码并安装_第12张图片

    对每个submodule都重复这样的操作,得到其内容

    然后再选择性的对未成功clone的submodule进行手动SSH clone即可,如果都clone成功了就不需要手动。

    这一步可能需要点时间,可以在编译的时候(第4步)重复进行,自己操作一下把third_party全部补全即可。

  3. 创建build目录并进入,用于编译

    mkdir build && cd build
    
  4. 执行cmake,注意提前查阅附录-使用文档-PaddlePaddle深度学习平台中的编译选项表,这里我编译的是GPU版本

    首先我们回头去安装相关依赖包中4找到之前得到的两个路径:

    PYTHON_INCLUDE_DIR:/home/liyang/anaconda3/envs/paddle/include/python3.11

    PYTHON_LIBRARY:/home/liyang/anaconda3/envs/paddle/lib/libpython3.11.so

    然后将envs及之前的路径复制下来,之后加上创建的conda环境名binpython版本构成路径DPYTHON_EXECUTABLE:/home/liyang/anaconda3/envs/paddle/bin/python.3.11

    在编译选项中填入对应路径即可

    cmake .. -DPYTHON_EXECUTABLE:FILEPATH=/home/liyang/anaconda3/envs/paddle/bin/python3.11 -DPYTHON_INCLUDE_DIR:PATH=/home/liyang/anaconda3/envs/paddle/include/python3.11 -DPYTHON_LIBRARY:FILEPATH=/home/liyang/anaconda3/envs/paddle/lib/libpython3.11.so -DWITH_GPU=ON
    

    看到下面这个,说明成功了:

    在这里插入图片描述

  5. 编译

    make -j$(nproc)
    
  6. 编译成功后进入/paddle/build/python/dist目录下找到生成的.whl包,然后在需要安装该包的conda环境下进行安装即可

    pip3 install -U xxx.whl
    

参考文档

  1. Windows10/11 三步安装wsl2 Ubuntu20.04(任意盘) - 知乎 (zhihu.com)
  2. 旧版 WSL 的手动安装步骤 | Microsoft Learn
  3. ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
  4. Ubuntu将默认python版本改为python3_ubuntu20如何将python3默认为python_早睡的叶子的博客-CSDN博客
  5. 【Linux】安装CUDA 11.2 和 cuDNN 8.4.0并检查是否安装成功_linux查看cudnn是否安装成功_TangPlusHPC的博客-CSDN博客
  6. gcc: error trying to exec ‘cc1plus‘: execvp: no such file or directory_gcc: error trying to exec ‘cc1plus’: execvp: no su_pan_mlpan的博客-CSDN博客
  7. Linux文件 profile、bashrc、bash_profile区别 - 知乎 (zhihu.com)
  8. git提交或克隆报错fatal: unable to access ‘https://github.com/tata20191003/autowrite.git/‘: Failed to connec_fatal: unable to access 'https://github.com/whldk/_good_good_xiu的博客-CSDN博客
  9. 为WSL2一键设置代理

你可能感兴趣的:(paddlepaddle,学习,人工智能,python)