2025年9月更新,隨著人工智能的發展,現在深度學習環境配置越來越簡單了,常用的pytorch、paddle(3.x)等深度學習庫安裝的時候自帶了cuda和cudnn的python包,不需要在操作系統層面自己安裝,配置環境方便快捷。
2024年1月9日更新,如果當服務器用,不建議安裝圖形界面,穩定性堪憂,每次操作系統卡死后本人需要到另一棟樓手動重啟,如果用作桌面系統倒是無所謂。
后來本人禁用了圖形界面。
# 多用戶模式
systemctl set-default multi-user.target
# 圖形界面
systemctl set-default graphical.target
2023年8月16日更新,經歷環境配置、維護的痛苦才知道docker有多香,建議測試開發使用docker完成,在深度學習這一塊,docker可以打包任意版本的cuda和cudnn鏡像,各種包版本都可以在容器中操作。宿主機上只需要安裝nvidia驅動和nvidia-container-toolkit。
Windows子系統WSL2也支持CUDA了,可以看我的另一篇文章。
圖形界面安裝
本人內網環境PC工作站用于跑模型
圖形界面安裝一般不需要額外安裝網卡等驅動,gcc版本默認9.4,網絡可使用圖形界面配置。
安裝系統
本人使用的UltraSO制作系統盤,網上教程很多。
配置root用戶登錄
配置root用戶方便操作,但是最高權限也可能導致一些問題,按需配置。
- 最小化安裝下,創建系統時的用戶登錄后,直接為root設置密碼后root可正常登錄。
- 圖形界面下,需要以下幾步
-
為root設置密碼
sudo passwd root
-
修改/etc/gdm3/custom.conf,在[daemon]配置項下添加
AllowRoot=true
-
修改/etc/pam.d/gdm-password,注釋掉該行
auth required pam_succeed_if.so user != root quiet_success
-
重啟
-
參考ubuntu20.04圖形界面允許root登錄
更換apt源
相比以前,最近安裝ubuntu默認的源已經不慢了,按需替換apt源,如果是在內網,則必做此步。
cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 按照sources.list內容和目標源更改即可
sed -i 's/cn.archive.ubuntu.com\/ubuntu/10.160.8.81:8081\/repository\/ubuntu-aliyun/g' /etc/apt/sources.list
更新軟件
默認情況下,ubuntu20.04 Linux內核是5.15.0-76,截至2023年8月15日,更新后內核為5.15.0-79
apt-get update
apt-get upgrade
安裝Nvidia-driver、CUDA、CUDNN
本人首次配置踩了各種坑,包括系統、驅動等,個人踩過太多的坑,網上許多博客只能參考,每個人的情況都不一樣,最靠譜的還是官方文檔,這里貼出官方的安裝教程。
Nvidia-driver和CUDA官方安裝教程
cuDNN官方安裝教程
有兩種兩種方式,特定發行的軟件包(deb和rpm)和獨立的軟件包(runfile),rufile方式自帶了各種依賴,可在各種Linux發行版工作,但是容易與本地依賴包產生沖突,不太建議使用這種方式。推薦使用deb包方式,快捷簡單。
注意,安裝driver和安裝驅動最好使用同一種方式,即都用deb包或者都是用runfile方式!
注意,安裝完之后請不要隨意升級或降級內核版本!
nvidia驅動程序需要內核頭文件和開發包,并且一旦內核版本改變,驅動程序也需要重新編譯安裝。Runfile安裝方式不對內核相關包做任何檢驗,但是RPM和DEB包則會檢驗,如果沒有內核相關包,安裝程序將自動安裝這些包的最新版本,可能不匹配當前內核。因此,最好在安裝驅動程序和CUDA之前,安裝內核相關包的正確版本,否則可能出現各種各樣的問題。
安裝前準備
lspci | grep -i nvidia
查看顯卡設備,查看是否支持cuda- gcc、linux內核版本等,ubuntu20.04不存在此問題
- 如果之前安裝過,請卸載干凈并重啟,如何卸載請看下文。
deb包安裝方式
下載自己需要的 CUDAdeb包,local或者network(內網的話下載local),然后參考下載頁面的安裝指示完成安裝,更詳細的步驟可以參考官網的安裝指示。
本人下載的是cuda11.8-ubuntu20.04-local,復制粘貼執行命令后cuda和driver都成功安裝,driver版本是520。開發過程中更關注的是cuda版本,driver只要能驅動顯卡即可,本人對驅動版本沒有要求。
如果需要安裝指定版本驅動
# sudo apt-get install cuda-drivers-<branch>
# 安裝418版本的驅動
sudo apt-get install cuda-drivers-418
需要確認本地apt添加了這個軟件包,這種安裝指定驅動的方式本人沒有嘗試過,網上也幾乎沒有見到過,不確定能否成功,更詳細的指示可以參考官網。
安裝完記得重啟,然后就可以開始添加環境變量了。
runfile安裝方式
首先貼上官網鏈接,本人安裝過程中碰到的很多問題多源于自己沒有認真看官網文檔,或者說懶得看英文,碰到問題沒法解決了才去認真讀官方文檔。官網runfile安裝方式,前幾段話就說明了RunFile安裝是通過基于交互式NCURSES的接口安裝NVIDIA驅動程序和CUDA工具包,安裝步驟指引、禁用Nouveau驅動、安裝后的附加操作、如何卸載以及CUDA跨平臺等內容,直接看官網文檔可以少走很多彎路。
安裝前準備
準備工作同上,默認的cuda runfile安裝包帶了驅動程序,能用但不是最新的。
英偉達cuda下載
英偉達顯卡驅動下載,最新版驅動。
禁用Nouveau驅動
創建/etc/modprobe.d/blacklist-nouveau.conf
并再末尾加入以下內容
blacklist nouveau
options nouveau modeset=0
執行命令
sudo update-initramfs -u
這樣就禁用ubuntu默認的開源驅動程序了。
禁用開源Nouvea驅動后還需要一些設置并重啟才能生效,本人在沒看文檔之前,是直接重啟的,也沒碰到問題。
但是按照官網的指示,禁用開源驅動Nouvea后,修改linux內核啟動參數,設置runlevel為3(多用戶字符界面),不加載任何圖形驅動重啟系統,修改/etc/default/grub
,找到下面這行,末尾添加nomodeset(不加載任何圖像驅動)和3(runlevel為3)。
GRUB_CMDLINE_LINUX_DEFAULT=“quiet nomodeset 3”
執行
update-grub
reboot
在安裝驅動的過程中如果碰到圖形界面無法正常顯示,開機一直黑屏的情況下,可以進入ubuntu的安全恢復模式(重啟ubuntu,電腦品牌logo出現后隨即長按shirft菜單,選擇第二個選項 Advanced options for Ubuntu,然后進入下一個界面,選recovery mode),修改這個文件如上所示,然后update-grub并重啟,即可正常開機進入字符界面,重新安裝驅動。
安裝驅動
sudo sh NVIDIA-Linux-x86_64-xxxxx.run
安裝驅動時會有警告和幾個選項
- 如果之前安裝過,會確認是否繼續安裝,確認
- 是否向 kernel 注冊 dkms 模塊,是,防止內核更新導致驅動的重新安裝
- 是否安裝32位兼容庫,一般選否
- 是否安裝opengl文件,一般選否
- xconfig,本人選的是
安裝cuda
執行
sudo sh cuda_<version>_linux.run
然后彈出幾個選項,可選擇連帶driver一起安裝,也可以單獨安裝driver,如果在這里不選擇安裝驅動,請確保在這之前驅動已經安裝。安裝完驅動和cuda之后,還原/etc/default/grub
文件,然后重啟。
添加環境變量
vim ~/.bashrc
export CUDA_HOME=/usr/local/cuda-11.8
export LD_LIBARAY_PATH=$CUDA_HOME/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export PATH=$CUDA_HOME/bin${PATH:+:${PATH}}
執行source ~/.bashrc
cudnn安裝
官方安裝教程
下載需要的CUDNN版本,執行
apt-get install zlib1g
apt-get install ./下載的cudnn.deb文件
cp /var/cudnn-local-repo-*/cudnn-local-*-keyring.gpg /usr/share/keyrings/
apt-get update
apt search libcudnn*
會看到libcudnn,libcudnn-dev,libcudnn-samples三個包,分別是運行時庫,開發庫,示例和測試代碼,正常情況下安裝libcudnn即可。
sudo apt-get install libcudnn8=${cudnn_version}-1+${cuda_version}
sudo apt-get install libcudnn8-dev=${cudnn_version}-1+${cuda_version}
sudo apt-get install libcudnn8-samples=${cudnn_version}-1+${cuda_version}
測試安裝是否成功
- nvidia-smi查看驅動是否安裝成功,顯示的cuda版本表示最高支持的cuda。
- nvcc -V查看cuda版本,下載適配版本的pytorch驗證是否可調用cuda庫。
- 安裝libcudnn-samples測試cudnn是否成功,如何測試請參考文檔。
驅動和CUDA卸載
- runfile安裝方式
sudo /usr/local/cuda-X.Y/bin/cuda-uninstaller
sudo /usr/bin/nvidia-uninstall
- deb包安裝方式
sudo apt-get --purge remove "*cuda*" "*cublas*" "*cufft*" "*cufile*" "*curand*" \"*cusolver*" "*cusparse*" "*gds-tools*" "*npp*" "*nvjpeg*" "nsight*" "*nvvm*"sudo apt-get --purge remove "*nvidia*" "libxnvctrl*"sudo apt-get autoremove
其他
非必要,本人在此一起記錄下
SSH服務,遠程需要
- 安裝ssh
apt-get install ssh
- 配置root允許登錄
vim /etc/ssh/sshd_config # PermitRootLogin yes # 修改后重啟sshd服務
- 設置開機自啟
systemctl enable ssh
- 啟動ssh服務
systemctl start ssh
cuda容器運行環境,docker需要
官方安裝教程
nvidia-container-toolkit用于在容器中使用NVIDIA GPU,包括一個容器運行時庫和實用程序。
容器中有應用程序和cuda,通過docker和nvidia-container-toolkit與宿主機的nvidia driver聯系,然后使用顯卡。
這里以docker運行環境為例,安裝nvidia-container-toolkit。
- 安裝docker
- 安裝軟件源和CPG Key
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
- 更新并安裝
apt-get update
apt-get install -y nvidia-container-toolkit
如果是內網環境下,需要下載nvidia-container-toolkit的所有依賴拷貝到內網并apt-get install *.deb
,下面是下載某包及其依賴的命令。
apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends nvidia-container-toolkit | grep -v i386 | grep "^\w")
- 設置docker nvidia運行時環境
- 命令行配置
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
- 配置文件
vim /etc/docker/daemon.json
,添加如下內容
"runtimes": {"nvidia": {"path": "/usr/bin/nvidia-container-runtime","runtimeArgs": []}}
重新加載配置,重啟docker
systemctl daemon-reload
systemctl restart docker
- 測試
# --gpus all 所有顯卡可用
# --gpus device=1 第二塊顯卡可用
# --gpus device=0,1 第一塊和第二塊顯卡可用
docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.8.0-runtime-ubuntu20.04 nvidia-smi
出現nvidia-smi命令的執行結果表示安裝成功
- nvidia/cuda docker倉庫
nvidia/cuda倉庫地址
里面有各版本的已經打好的cuda和cudnn鏡像,每個cuda版本對應有三種鏡像
- base
cuda運行時環境 - runtime
從base打包而來,包括cuda數學庫、NCCL和cudnn。一般我們拉runtime鏡像即可。 - devel
從runtime打包而來,包括一些頭文件和cuda開發工具,需要依賴做額外的開發,可以拉取這個鏡像。
- 自己打包nvidia/cuda鏡像
克隆官方的git倉庫
到docker hub創建賬戶,并新建一個存儲庫
# 登錄docker
docker login -u windcfcd cuda
# 打包windcf/cuda:11.8.0-ubuntu20.04鏡像,x86_64
# --push推送到docker hub
# --load保存為本地鏡像
./build.sh -d --image-name windcf/cuda --cuda-version 11.8.0 --os ubuntu --os-version 20.04 --arch x86_64 --push
docker hub結果
編譯安裝指定Python版本
ubuntu20.04默認安裝的python是3.8.10,如需安裝其他版本,可自行下載源碼編譯。
如果需要安裝多版本Python,可以看這里
以安裝python3.10.12為例
# 安裝依賴
apt update
apt install wget build-essential libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev# python源碼
wget https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tgz
# 解壓
tar -xzvf Python3.10.12.tgz
# 編譯
cd Python-3.10.12/
./configure --prefix=/usr/local/python310 --enable-optimizations
make -j$(nproc)
# 安裝
make altinstall
安裝完之后python、pip等可執行程序在/usr/local/python310/bin
目錄下,本人沒有覆蓋默認的python,使用時注意路徑即可。
如果需要設置為默認的python,執行
sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/python310/bin/python3.10 110sudo update-alternatives --config python3
卸載新安裝的python
# 卸載
# 如果沒有刪除源代碼目錄
sudo make uninstall
# 已刪除源代碼目錄
cd /usr/local/python310/bin && rm -f sudo rm -f 2to3 2to3-3.11 idle3 idle3.11 pip pip3 pip3.10 pip3.11 pydoc3 pydoc3.11 python3 python3.11 python3.11-config python3-config
防火墻配置
ubuntu下iptables配置的規則重啟后失效,系統自帶了ufw命令配置防火墻,配置命令簡單易懂。
使用ufw配置后都會在iptables上體現,重啟后有效。
一些心得總結
安裝驅動和cuda其實挺簡單的,內網可能稍微麻煩點,但本人還是碰到了各種各樣的問題,安裝完后PC工作站使用一段時間又會卡死,工作站又放在機房,每次重啟很麻煩。找不到卡死的原因,推測是驅動的問題,又卸載重裝,來來回回遇到很多問題,在這里統一記錄下。
- 關閉系統休眠
- 關閉自動更新
- 包沖突錯誤解決
在安裝各種包的過程中多次遇到版本沖突,apt install --fix-broken
無法解決,所有的apt install
都不執行,解決辦法是使用apt下載需要的包,使用dpkg -i --force-overwrite deb_name
強制覆蓋安裝。 - 內網安裝外網包
有些包不在ubuntu軟件源中,必須要聯網下載,本人在外網電腦創建一個和內網軟件環境一樣的虛擬機,需要連接外網下載的包現在虛擬機中下載后拷貝到內網,主要有兩種包。- deb包,使用上面提到的下載包及其依賴的命令在外網虛擬機下載后拷貝到內網,
apt-get install *.deb
- python包,有些包也不再pypi源,比如pytorch某些版本,某些包必須從源碼編譯等,外網使用
pip download
,拷貝到內網pip install *.whl
,也可以將文件上傳到內網Nexus Pypi源。
- deb包,使用上面提到的下載包及其依賴的命令在外網虛擬機下載后拷貝到內網,
- 官方文檔
最小化安裝
ubuntu server識別不到網卡
安裝系統后,使用ip a命令發現只有lo本地回環,識別不到網卡,網上搜了挺久并不能解決問題。
猜測應該是缺了網卡驅動,畢竟網卡較新而操作系統較老且是最小化安裝,可能并沒有帶驅動,需要自己下載安裝。
lspci查看自己的網卡,結合主板等信息去外網下載對應驅動,拷貝到內網中。本人下載的是RTL8125,安裝驅動需要gcc、make等依賴,最小化安裝這些都是沒有的,需要手動離線安裝。
ubuntu server離線安裝gcc等依賴
手動下載了ubuntu server離線gcc、make等及其依賴,鏈接如下
鏈接:https://pan.baidu.com/s/1sK73grxfqokv0hADUS0DWg?pwd=dqz8
提取碼:dqz8
解壓后直接dpkg -i *.deb即可,默認ubuntu上好像沒unzip命令。
記錄一下直接下載某包及其依賴的命令
apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends libasan5:amd64 | grep -v i386 | grep "^\w")
ubuntu server配置網絡
如果安裝的是桌面版,可以選擇圖形化界面配置。
20.04最小化版本配置網絡已不再/etc/network/interface中,而在/etc/netplan/xxxx.yaml中,以下是一個配置示例,ipv6相關配置改4為6即可。
# This is the network config written by 'subiquity'
network:ethernets:ens32:dhcp4: noaddresses: [192.168.8.6/24]optional: truegateway4: 192.168.8.2nameservers:addresses: [192.168.8.2]version: 2renderer: networkd
參考
Ubuntu20.04下CUDA、cuDNN的詳細安裝與配置過程