恰逢研一开学,在上课之余想利用这可以自己支配的半年时间再扩展一项技能。
突然想到自己平常在某乎看到众多帖子均在写pytorch大大小小的坑,于是思来想去,决定支持一下国产深度学习框架:PaddlePaddle
开个新坑,记录自己的学习历程
需要先启用“适用于 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。
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
sudo apt install g++
查看g++版本:
g++ --version
g++版本需要和gcc版本保持一致,比如都是11的大版本或者都是8的大版本,如果你是从gcc 7升级到gcc 8,可以参考参考文档6
进行升级
如果按照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 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 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的安装。
进入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
再次执行最后一行的安装命令后显示已经安装了,所以暂时搁置这个问题。
也可以直接使用自带的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
安装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_rsa
和id_rsa.pub
使用vscode直接打开id_rsa.pub
,复制其中的内容
打开github,按下图顺序将该ssh key添加进去
检查是否配置成功
ssh [email protected]
解决git clone无法连接的问题:
取消Git本身的代理,使用本机的代理。
//取消http代理
git config --global --unset http.proxy
//取消https代理
git config --global --unset https.proxy
sudo apt install -y bzip2
sudo apt install -y make
sudo apt install unrar swig patchelf
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
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 [email protected]: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 = [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给撤回就可以了:
第一步:
第二步:
对每个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
看到下面这个,说明成功了:
编译
make -j$(nproc)
编译成功后进入/paddle/build/python/dist
目录下找到生成的.whl
包,然后在需要安装该包的conda环境下进行安装即可
pip3 install -U xxx.whl