写在前面
恰逢研一开学,在上课之余想利用这可以自己支配的半年时间再扩展一项技能。
突然想到自己平常在某乎看到众多帖子均在写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_rsa
和id_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相关的环境变量
- 找到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
- 找到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
-
设置系统环境变量路径:
将第一步的路径最后两级目录改为/bin/后的路径为:/home/liyang/anaconda3/envs/paddle/bin/
export PATH=/home/liyang/anaconda3/envs/paddle/bin/:$PATH
注意换成自己的路径
拉取源码仓库并编译
以下内容摘自Linux 下使用 make 从源码编译-使用文档-PaddlePaddle深度学习平台
-
从github拉取paddlepaddle的源码,进入其对应的
Paddle
目录下,并切换git分支到develop
git clone git@github.com:PaddlePaddle/Paddle.git && \ cd Paddle && \ git checkout develop
-
这是最关键的一点,修改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
全部补全即可。 -
创建
build
目录并进入,用于编译mkdir build && cd build
-
执行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环境名
、bin
和python版本
构成路径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
看到下面这个,说明成功了:
-
编译文章来源:https://www.toymoban.com/news/detail-776402.html
make -j$(nproc)
-
编译成功后进入
/paddle/build/python/dist
目录下找到生成的.whl
包,然后在需要安装该包的conda环境下进行安装即可文章来源地址https://www.toymoban.com/news/detail-776402.htmlpip3 install -U xxx.whl
参考文档
- Windows10/11 三步安装wsl2 Ubuntu20.04(任意盘) - 知乎 (zhihu.com)
- 旧版 WSL 的手动安装步骤 | Microsoft Learn
- ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
- Ubuntu将默认python版本改为python3_ubuntu20如何将python3默认为python_早睡的叶子的博客-CSDN博客
- 【Linux】安装CUDA 11.2 和 cuDNN 8.4.0并检查是否安装成功_linux查看cudnn是否安装成功_TangPlusHPC的博客-CSDN博客
- gcc: error trying to exec ‘cc1plus‘: execvp: no such file or directory_gcc: error trying to exec ‘cc1plus’: execvp: no su_pan_mlpan的博客-CSDN博客
- Linux文件 profile、bashrc、bash_profile区别 - 知乎 (zhihu.com)
- 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博客
- 为WSL2一键设置代理
到了这里,关于【PaddlePaddle】保姆级教程:Ubuntu22.04+CUDA12.2编译PaddlePaddle源码并安装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!