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

写在前面

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

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

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

安装WSL2 Ubuntu 22.04 LTS

准备工作

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

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

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

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

在这里插入图片描述

注意,重启电脑后只能够安装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盘。

在这里插入图片描述

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

手动安装

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

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

在这里插入图片描述

双击运行其中的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系统进行选择:

在这里插入图片描述

按照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查看到版本即说明安装成功:

在这里插入图片描述

cudnn 8.9.4.25

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

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

在这里插入图片描述

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

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,按照下图指引:

在这里插入图片描述

使用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拉到本地就行

在这里插入图片描述

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 "xxxx@xxx.com"

注意提替换成自己的邮箱

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

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

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

在这里插入图片描述

检查是否配置成功

ssh git@github.com

在这里插入图片描述

解决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 git@github.com: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 = git@github.com: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 = git@github.com:gflags/gflags.git
    	ignore = dirty
    [submodule "third_party/gloo"]
    	path = third_party/gloo
    	url = git@github.com:ziyoujiyi/gloo.git
    	ignore = dirty
    [submodule "third_party/dlpack"]
    	path = third_party/dlpack
    	url = git@github.com:dmlc/dlpack.git
    	ignore = dirty
    [submodule "third_party/utf8proc"]
    	path = third_party/utf8proc
    	url = git@github.com:JuliaStrings/utf8proc.git
    	ignore = dirty
    [submodule "third_party/warpctc"]
    	path = third_party/warpctc
    	url = git@github.com:baidu-research/warp-ctc.git
    	ignore = dirty
    [submodule "third_party/warprnnt"]
    	path = third_party/warprnnt
    	url = git@github.com:PaddlePaddle/warp-transducer.git
    	ignore = dirty
    [submodule "third_party/xxhash"]
    	path = third_party/xxhash
    	url = git@github.com:Cyan4973/xxHash.git
    	ignore = dirty
    [submodule "third_party/pybind"]
    	path = third_party/pybind
    	url = git@github.com:pybind/pybind11.git
    	ignore = dirty
    [submodule "third_party/threadpool"]
    	path = third_party/threadpool
    	url = git@github.com:progschj/ThreadPool.git
    	ignore = dirty
    [submodule "third_party/zlib"]
    	path = third_party/zlib
    	url = git@github.com:madler/zlib.git
    	ignore = dirty
    [submodule "third_party/glog"]
    	path = third_party/glog
    	url = git@github.com: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 = git@github.com:google/snappy.git
    	ignore = dirty
    [submodule "third_party/cub"]
    	path = third_party/cub
    	url = git@github.com:NVIDIA/cub.git
    	ignore = dirty
    [submodule "third_party/cutlass"]
    	path = third_party/cutlass
    	url = git@github.com:NVIDIA/cutlass.git
    	ignore = dirty
    [submodule "third_party/xbyak"]
    	path = third_party/xbyak
    	url = git@github.com:herumi/xbyak.git
    	ignore = dirty
    [submodule "third_party/mkldnn"]
    	path = third_party/mkldnn
    	url = git@github.com:oneapi-src/oneDNN.git
    	ignore = dirty
    [submodule "third_party/flashattn"]
    	path = third_party/flashattn
    	url = git@github.com:PaddlePaddle/flash-attention.git
    	ignore = dirty
    [submodule "third_party/gtest"]
    	path = third_party/gtest
    	url = git@github.com:google/googletest.git
    	ignore = dirty
    [submodule "third_party/openblas"]
    	path = third_party/openblas
    	url = git@github.com:xianyi/OpenBLAS.git
    	ignore = dirty
    [submodule "third_party/leveldb"]
    	path = third_party/leveldb
    	url = git@github.com:google/leveldb.git
    	ignore = dirty
    [submodule "third_party/brpc"]
    	path = third_party/brpc
    	url = git@github.com:apache/brpc.git
    	ignore = dirty
    [submodule "third_party/rocksdb"]
    	path = third_party/rocksdb
    	url = git@github.com:Thunderbrook/rocksdb
    	ignore = dirty
    [submodule "third_party/absl"]
    	path = third_party/absl
    	url = git@github.com:abseil/abseil-cpp.git
    	ignore = dirty
    [submodule "third_party/jitify"]
    	path = third_party/jitify
    	url = git@github.com:NVIDIA/jitify.git
    	ignore = dirty
    

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

    第一步:

    在这里插入图片描述

    第二步:

    在这里插入图片描述

    对每个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一键设置代理
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用内容,安装PaddlePaddle需要在Anaconda Prompt中执行一些命令。引用\[1\]中提到了安装PaddlePaddle的命令,但是只支持到CUDA 11.6版本。如果你的CUDA版本是12,可以尝试使用引用\[3\]中提到的命令来安装PaddlePaddle。具体步骤如下: 1. 打开Anaconda Prompt。 2. 激活你的conda环境,可以使用命令:conda activate internet_plus。 3. 输入以下命令来安装PaddlePaddle: ``` python -m pip install paddlepaddle-gpu==2.3.1.post116 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html ``` 这个命令会安装PaddlePaddle的GPU版本,并且指定了CUDA 12所对应的安装包。 请注意,以上命令是基于引用内容提供的信息,如果官方有更新的安装指南,请参考官方文档进行安装。 #### 引用[.reference_title] - *1* [anaconda安装paddle(安装CUDA,CUDNN)](https://blog.csdn.net/weixin_43912621/article/details/128136290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [paddle GPU 终极安装教程](https://blog.csdn.net/apodx/article/details/123819148)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [百度飞桨paddle安装 包括CUDA,cuDNN,opencv的安装](https://blog.csdn.net/qq_43237333/article/details/125894250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值