寫(xiě)在前面
恰逢研一開(kāi)學(xué),在上課之余想利用這可以自己支配的半年時(shí)間再擴(kuò)展一項(xiàng)技能。
突然想到自己平常在某乎看到眾多帖子均在寫(xiě)pytorch大大小小的坑,于是思來(lái)想去,決定支持一下國(guó)產(chǎn)深度學(xué)習(xí)框架:PaddlePaddle
開(kāi)個(gè)新坑,記錄自己的學(xué)習(xí)歷程
安裝WSL2 Ubuntu 22.04 LTS
準(zhǔn)備工作
需要先啟用“適用于 Linux 的 Windows 子系統(tǒng)”可選功能,然后才能在 Windows 上安裝 Linux 分發(fā)。
以管理員身份打開(kāi)PowerShell并運(yùn)行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
顯示操作成功后,重啟電腦即可(注意是重啟不是“關(guān)機(jī)然后啟動(dòng)”):
注意,重啟電腦后只能夠安裝WSL1
安裝 WSL2 之前,必須啟用“虛擬機(jī)平臺(tái)”可選功能,以管理員身份打開(kāi) PowerShell 并運(yùn)行:
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
顯示操作成功后,再次重新啟動(dòng)電腦,以完成WSL安裝并更新到 WSL2
重啟后,將WSL2設(shè)為默認(rèn)版本,用管理員身份打開(kāi) Powershell 輸入以下命令:
wsl --set-default-version 2
便捷安裝
直接在Microsoft Store搜索ubuntu,選擇合適版本,默認(rèn)只能安裝在c盤(pán)。
安裝后“打開(kāi)”即可,按照命令行的指引輸入用戶(hù)名和密碼。
手動(dòng)安裝
首先獲取安裝包:ubuntu2204,其他版本的安裝包詳見(jiàn)參考文檔2
。
下載完成后,可以看到文件名為Ubuntu2204-221101.AppxBundle
,我們將其重命名為Ubuntu2204.zip
,并解壓縮至你想安裝的盤(pán)內(nèi),可以看到里面的文件結(jié)構(gòu)是這樣的:
雙擊運(yùn)行其中的Ubuntu_2204.1.7.0_x64.appx
,按照引導(dǎo)進(jìn)行安裝、輸入用戶(hù)名和密碼即可完成安裝。
收尾工作
最后通過(guò)管理員Powershell執(zhí)行以下命令將 Ubuntu 18.04.6 LTS 設(shè)置為 WSL2 去執(zhí)行:
wsl --set-version Ubuntu-22.04 2
換源和系統(tǒng)更新
以下內(nèi)容就要進(jìn)入WSL2 Ubuntu進(jìn)行操作了,我習(xí)慣使用vscode連接WSL
首先對(duì)原本的軟件源配置文件/etc/apt/sources.list
做一個(gè)備份:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
然后打開(kāi)sources.list文件:
sudo vim /etc/apt/sources.list
直接鍵盤(pán)敲下49dd
清除其中的全部?jī)?nèi)容,然后鍵盤(pán)敲下i
進(jìn)入輸入模式。
在ubuntu | 鏡像站使用幫助 | 清華大學(xué)開(kāi)源軟件鏡像站 | Tsinghua Open Source Mirror中選擇對(duì)應(yīng)版本,我們使用22.04,復(fù)制對(duì)應(yīng)內(nèi)容:
# 默認(rèn)注釋了源碼鏡像以提高 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
# 預(yù)發(fā)布軟件源,不建議啟用
# 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
將內(nèi)容使用ctrl v
粘貼到sources.list中,鍵盤(pán)敲下ESC
后繼續(xù)敲下:wq
,按下回車(chē)即可完成寫(xiě)入。
最后更新源即可完成源的替換,注意要全部get成功,沒(méi)有err:
sudo apt update
之后我們使用清華源更新系統(tǒng):
sudo apt -y update && sudo apt -y upgrade
最后,如果你想用linux自帶的python進(jìn)行源碼編譯,需要下載python3.7以上的python版本,并設(shè)為默認(rèn),詳情參考參考文檔4
。
由于我習(xí)慣用ananconda作為python管理工具,因此不使用自帶的python。
安裝gcc、g++、cmake
gcc 11.4
sudo apt install gcc
查看gcc版本:
gcc --version
版本高于8.2.0即可,否則無(wú)法編譯paddle源碼,如果仍是gcc 7,使用以下指令升級(jí)到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升級(jí)到gcc 8,可以參考參考文檔6
進(jìn)行升級(jí)
cmake 3.27
如果按照paddle官方的說(shuō)法裝3.16,會(huì)發(fā)生下面的問(wèn)題:CUDA_STANDARD is set to invalid value ‘17’ · Issue #54822 · PaddlePaddle/Paddle (github.com)
PaddlePaddle自己不把github issue給更新到文檔里嗎???太坑了點(diǎn)吧???
首先獲取安裝包:
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
配置環(huán)境變量,進(jìn)入~/.bashrc
文件:
sudo vim ~/.bashrc
鍵盤(pán)敲擊i
進(jìn)入編輯,在末尾添加內(nèi)容:
export PATH=/home/liyang/cmake-3.27.0-linux-x86_64/bin:$PATH
然后讓配置文件生效:
source ~/.bashrc
使用cmake --version
查看到相應(yīng)版本即說(shuō)明安裝成功。
安裝cuda、cudnn、nccl
cuda 12.2
首先去CUDA Toolkit Archive | NVIDIA Developer找到自己想安裝的版本,單擊進(jìn)去,按照自己的ubuntu系統(tǒng)進(jìn)行選擇:
按照installation instructions下的兩個(gè)命令安裝就行:
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
安裝完成后,添加環(huán)境變量
首先進(jìn)入~/.bashrc
文件:
sudo vim ~/.bashrc
鍵盤(pán)敲擊i
進(jìn)入編輯,在末尾添加如下兩行內(nè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
查看到版本即說(shuō)明安裝成功:
cudnn 8.9.4.25
安裝包在cuDNN Archive | NVIDIA Developer下載,注意版本對(duì)cuda對(duì)應(yīng)。
PaddlePaddle 可以使用 cuDNN v5.1 之后的任何一個(gè)版本來(lái)編譯運(yùn)行,但盡量請(qǐng)保持編譯和運(yùn)行使用的 cuDNN 是同一個(gè)版本。 推薦使用最新版本的 cuDNN。
下載好安裝包后,進(jìn)行解壓:
tar -xvf cudnn-linux-x86_64-8.9.4.25_cuda12-archive.tar.xz
命令行進(jìn)入解壓后的文件夾,輸入以下命令:
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
進(jìn)入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
此時(shí)出現(xiàn)了以下問(wèn)題:
/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
再次執(zhí)行最后一行的安裝命令后顯示已經(jīng)安裝了,所以暫時(shí)擱置這個(gè)問(wèn)題。
安裝anaconda
也可以直接使用自帶的python,我個(gè)人更喜歡包管理工具。
從Free Download | Anaconda獲取安裝包鏈接,然后命令行使用wget拉到本地就行
wget https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-x86_64.sh
將sh文件運(yùn)行安裝即可
bash Anaconda3-2023.07-2-Linux-x86_64.sh
中途會(huì)有多次回車(chē)和輸入"yes"的情況
重啟命令行,看到(bash)
即表示安裝成功
完成安裝,現(xiàn)在新建個(gè)env用于之后paddlepaddle的安裝
conda create -n paddle python=3.11
進(jìn)入虛擬環(huán)境:
conda activate paddle
安裝之后編譯必要的包:
pip install numpy protobuf
配置github
安裝git:
sudo apt-get install git
隨后用git --version
檢查是否安裝成功。
配置用戶(hù)名:
git config --global user.name xxx
注意把xxx替換成自己的用戶(hù)名
配置郵箱地址:
git config --global user.email xxx
注意把xxx替換成自己的郵箱
隨后用git config --list
查看是否配置成功
生成SSH密鑰:
ssh-keygen -t rsa -C "xxxx@xxx.com"
注意提替換成自己的郵箱
之后就可以看到生成了~/.ssh
目錄,并且其中包含了兩個(gè)文件id_rsa
和id_rsa.pub
-
使用vscode直接打開(kāi)
id_rsa.pub
,復(fù)制其中的內(nèi)容 -
打開(kāi)github,按下圖順序?qū)⒃搒sh key添加進(jìn)去
檢查是否配置成功
ssh git@github.com
解決git clone無(wú)法連接的問(wèn)題:
取消Git本身的代理,使用本機(jī)的代理。
//取消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
- 其他依賴(lài)環(huán)境
sudo apt install unrar swig patchelf
設(shè)置python相關(guān)的環(huán)境變量
- 找到Python lib的路徑,設(shè)置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的路徑,設(shè)置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
-
設(shè)置系統(tǒng)環(huán)境變量路徑:
將第一步的路徑最后兩級(jí)目錄改為/bin/后的路徑為:/home/liyang/anaconda3/envs/paddle/bin/
export PATH=/home/liyang/anaconda3/envs/paddle/bin/:$PATH
注意換成自己的路徑
拉取源碼倉(cāng)庫(kù)并編譯
以下內(nèi)容摘自Linux 下使用 make 從源碼編譯-使用文檔-PaddlePaddle深度學(xué)習(xí)平臺(tái)
-
從github拉取paddlepaddle的源碼,進(jìn)入其對(duì)應(yīng)的
Paddle
目錄下,并切換git分支到develop
git clone git@github.com:PaddlePaddle/Paddle.git && \ cd Paddle && \ git checkout develop
-
這是最關(guān)鍵的一點(diǎn),修改git submodule的url,使用SSH而不是http,(如果你配置了科學(xué)上網(wǎng),請(qǐng)?zhí)^(guò)此步,如何為wsl配置可以參考
參考文檔9
的一條關(guān)于TUN模式的評(píng)論,當(dāng)然我更推薦配置一下,這樣就沒(méi)后面這些破事兒了-.-)打開(kāi)
Paddle/.gitmodules
文件,復(fù)制下面的內(nèi)容替換其中的內(nèi)容:[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
==注意:==此時(shí)所有的submodule均以clone,但被清除內(nèi)容了,此時(shí),只需要回去把每個(gè)倉(cāng)庫(kù)的changes給撤回就可以了:
第一步:
第二步:
對(duì)每個(gè)submodule都重復(fù)這樣的操作,得到其內(nèi)容
然后再選擇性的對(duì)未成功clone的submodule進(jìn)行手動(dòng)SSH clone即可,如果都clone成功了就不需要手動(dòng)。
這一步可能需要點(diǎn)時(shí)間,可以在編譯的時(shí)候(第4步)重復(fù)進(jìn)行,自己操作一下把
third_party
全部補(bǔ)全即可。 -
創(chuàng)建
build
目錄并進(jìn)入,用于編譯mkdir build && cd build
-
執(zhí)行cmake,注意提前查閱附錄-使用文檔-PaddlePaddle深度學(xué)習(xí)平臺(tái)中的編譯選項(xiàng)表,這里我編譯的是GPU版本
首先我們回頭去安裝相關(guān)依賴(lài)包中4找到之前得到的兩個(gè)路徑:
PYTHON_INCLUDE_DIR:/home/liyang/anaconda3/envs/paddle/include/python3.11
PYTHON_LIBRARY:/home/liyang/anaconda3/envs/paddle/lib/libpython3.11.so
然后將envs及之前的路徑復(fù)制下來(lái),之后加上
創(chuàng)建的conda環(huán)境名
、bin
和python版本
構(gòu)成路徑DPYTHON_EXECUTABLE:/home/liyang/anaconda3/envs/paddle/bin/python.3.11在編譯選項(xiàng)中填入對(duì)應(yīng)路徑即可
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
看到下面這個(gè),說(shuō)明成功了:
-
編譯文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-776402.html
make -j$(nproc)
-
編譯成功后進(jìn)入
/paddle/build/python/dist
目錄下找到生成的.whl
包,然后在需要安裝該包的conda環(huán)境下進(jìn)行安裝即可文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-776402.htmlpip3 install -U xxx.whl
參考文檔
- Windows10/11 三步安裝wsl2 Ubuntu20.04(任意盤(pán)) - 知乎 (zhihu.com)
- 舊版 WSL 的手動(dòng)安裝步驟 | Microsoft Learn
- ubuntu | 鏡像站使用幫助 | 清華大學(xué)開(kāi)源軟件鏡像站 | Tsinghua Open Source Mirror
- Ubuntu將默認(rèn)python版本改為python3_ubuntu20如何將python3默認(rèn)為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區(qū)別 - 知乎 (zhihu.com)
- git提交或克隆報(bào)錯(cuò)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一鍵設(shè)置代理
到了這里,關(guān)于【PaddlePaddle】保姆級(jí)教程:Ubuntu22.04+CUDA12.2編譯PaddlePaddle源碼并安裝的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!