智算場景NVIDIA-GPU鏡像組件的安裝指南
本文介紹智算相關組件的安裝方法,其中包含(nvidia driver、ofed、cuda、cudnn)具體的組件版本根據需求設置,本文主要包含三大部分內容:
● 介紹適配nvidia-driver-530驅動的相關組件的安裝方法;
● 內核升級指南;
● Ubuntu內核升級后,保證環境正常運行的指南;
該安裝指南以 Ubuntu20.04 系統為例,遇到GPU多機互聯的使用場景,建議關閉設備的防火墻(systemctl disable 防火墻; systemctl disable 防火墻)。
一、本文使用的軟件下載鏈接匯總
nvidia驅動下載地址: (各版本驅動下載地址為//download.nvidia.com/XFree86/Linux-x86_64,本文使用530.30.02版本)
CUDA下載地址:
//developer.nvidia.com/cuda-toolkit-archive(各版本cuda下載地址)
cuDNN下載地址:
//developer.nvidia.com/rdp/cudnn-archive(需要注冊登錄后才能下載)
OFED下載地址:
//content.mellanox.com/ofed/MLNX_OFED-23.04-1.1.3.0/MLNX_OFED_LINUX-23.04-1.1.3.0-ubuntu20.04-x86_64.tgz或
//network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/
CUDA版本與nvidia driver版本對應表://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#
二、組件版本
宿主機操作系統:Ubuntu20.04
NVIDIA驅動:Driver Version: 530.30.02
CUDA版本:11.8
cuDNN版本:8.6.0
IB驅動:LINUX-23.04-1.1.3.0-ubuntu20.04-x86_64
三、安裝過程
利用nvidia-smi查看Nvidia-driver是否安裝,若已安裝則跳過步驟1;
3.1 安裝Nvidia-driver
默認Ubuntu 20.04/20.10存儲庫中提供的穩定的NVIDIA驅動程序,如果您希望得到更前沿的驅動程序,則可以從NVIDIA網站(地址://www.nvidia.cn/Download/index.aspx)或用Graphics Drivers PPA安裝最新的驅動程序。
方法一:從NVIDIA網站下載驅動并安裝
安裝驅動前一定要更新軟件列表和安裝必要軟件、依賴
apt -y install build-essential #更新必要依賴
查看GPU型號
lspci | grep -i nvidia
官網下載對應GPU驅動:
下載鏈接//download.nvidia.com/XFree86/Linux-x86_64/530.30.02/NVIDIA-Linux-x86_64-530.30.02.run
中的NVIDIA-Linux-x86_64-530.30.02.run
注意:將驅動放在英文名文件夾下,例如:/driver。驅動名稱為:NVIDIA-Linux-x86_64-530.30.02.run
禁用nouveau通用驅動,執行
cat >> /etc/modprobe.d/blacklist-nouveau.conf << EOF
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
EOF
添加完成后檢查,并進入文本界面
sudo update-initramfs –u #更新initramfs鏡像文件
reboot #重啟電腦
lsmod | grep nouveau #檢查,輸入之后無其他輸出,成功,繼續
sudo telinit 3 #進入文本界面,在文本界面輸入用戶名和密碼登錄,telinit 5返回圖形界面
sudo service gdm3 stop #停止顯示服務
安裝驅動
sudo chmod 777 NVIDIA-Linux-x86_64-530.30.02.run #給你下載的驅動賦予可執行權限,才可以安裝
sudo ./NVIDIA-Linux-x86_64-530.30.02.run #安裝
會出現的選項:
● Install Nvidia's 32-bit compatibility libraries?
選擇 "No"
● Would you like to run the nvidia-xconfig utility to automatically update your X configuration file so that the NVIDIA X driver dill be used dhen you restart X? Any pre-existing X configuration file will be backed up.
選擇 "Yes"
返回圖形界面執行
sudo service gdm3 start #重啟顯示服務
reboot #重啟系統
nvidia-smi #重啟后,檢查驅動是否安裝完成
出現如下類似畫面說明安裝完成。
注意事項:
1、進入tty模式如果不是英語系統可能會出現亂碼,輸入以下命令:
export LANG="UTF-8"
export LANGUAGE="UTF-8"
2、返回圖形界面黑屏
檢查hdmi線是不是接在主板的hdmi接口上了,接到顯卡上就可以了
方法二:
Graphics Drivers PPA安裝
sudo add-apt-repository ppa:graphics-drivers/ppa #添加源
sudo apt update
sudo apt install nvidia-driver-530 #安裝指定版本530的GPU驅動
reboot #重啟電腦
nvidia-smi #查看驅動是否安裝成功
3.2 安裝CUDA與cudnn
CUDA和cnDNN是支持NVIDIA支持GPU的兩個庫,分別用于高性能計算和深度神經網絡計算的支持。
CUDA(Compute Unified Device Architecture):是NVIDIA支持GPU的通用并行計算架構,該架構使GPU能夠解決復雜的計算問題。可以看作使能GPU的驅動程序或算法SDK。
cuDNN:是基于CUDA的深度學習GPU加速庫,有了它可以在GPU上完成高效的深度學習計算。
CUDA版本與nvidia driver版本對應表://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#
由上圖可知,本文采用的530驅動,最高可支持12.2版本的CUDA,本文為保證機器學習的穩定性和對tensorflow與pytorch等工具庫的兼容,參考下圖pytorch和tensorflow的版本要求,本文采用11.8版本的CUDA,參考tensorflow所支持的套件,選擇8.6版本的cudnn。
注意:其中CUDA和cudnn需要下載對應架構的版本,主要為x86_64和arm(arch64),本文以x86_64的版本為例。
pytorch依賴版本:
tensorflow依賴版本:
3.2.1 下載并安裝11.8版本的cuda:
//developer.nvidia.com/cuda-11-8-0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=20.04&target_type=deb_local
下載runfile,安裝方式最簡潔
wget //developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run
輸入上述代碼后輸入continue;
遇見上圖問題,輸入accetp;
隨后遇到上圖問題,不勾選第一項Driver,因為驅動已經安裝過了,選擇install;
安裝好CUDA后,設置環境變量:
sudo vim ~/.bashrc
在./bashrc文件最后一行加上如下兩句
export PATH=/usr/local/cuda-11.8/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64\${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
:wq! #命令行輸入該命令退出vim并保持修改內容
執行更新后的./bashrc
source ~/.bashrc
檢查CUDA是否安裝正確,顯示版本號就正確安裝
nvcc --version
3.2.2下載并安裝8.6版本的cudnn:
cuDNN比CUDA安裝簡單,下載對應版本壓縮包,拷貝文件到指定目錄,給予權限就好了。
下載地址://developer.nvidia.com/rdp/cudnn-archive(需注冊賬號并登錄才能下載)
下載local installer for Ubuntu20.04 x86_64 (Tar)
解壓上述下載好的tar包
tar -xzvf cudnn-linux-x86_64-8.6.0.163_cuda11-archive.tar.xz //這里cudnn-linux-x86_64-8.6.0.163_cuda11-archive.tar.xz是我們下載的cudnn的壓縮包
進入加壓后的文件夾
cd cudnn-linux-x86_64-8.6.0.163_cuda11-archive/
隨后在當前路徑的命令行終端輸入以下三條命令進行cudnn的安裝:
兩個復制,一個添加權限命令
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
測試cudnn是否安裝成功,顯示對應的8.6.0版本號
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
至此CUDA和cudnn安裝完成。
3.3安裝MLNX_OFED(InfiniBand驅動)
3.3.1 下載驅動
下載方式一:直接使用鏈接//developer.nvidia.com/networking/mlnx-ofed-eula?mtag=linux_sw_drivers&mrequest=downloads&mtype=ofed&mver=MLNX_OFED-5.4-3.7.5.0&mname=MLNX_OFED_LINUX-5.4-3.7.5.0-ubuntu20.04-x86_64.iso下載驅動。
下載方式二:訪問頁面//network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/,選擇5.4版的MLNX_OFED驅動。
3.3.2 安裝驅動
假設下載好的驅動已經放到了/root/MLNX_OFED_LINUX-5.4-3.7.5.0-ubuntu20.04-x86_64.iso。按下面指令安裝MLNX_OFED驅動。(若是內核升級后,不是默認內核,安裝指令可能要添加--add-kernel-support 參數)
apt-get install -y gfortran libnl-3-dev tcl graphviz dpatch swig quilt bison flex libltdl-dev tk \
debhelper m4 libnuma-dev autoconf autotools-dev chrpath automake libnl-route-3-dev \
libgfortran5
mkdir -p /tmp/mlnx
mount /root/MLNX_OFED_LINUX-5.4-3.7.5.0-ubuntu20.04-x86_64.iso /tmp/mlnx
pushd /tmp/mlnx
安裝指令;
./mlnxofedinstall --all -q
若是內核升級后,不是默認內核,可能--add-kernel-support 參數,執行
./mlnxofedinstall --add-kernel-support --all -q --force,見4.3小節(3)部分
popd
umount /tmp/mlnx
rmdir /tmp/mlnx
MLNX_OFED會添加自己的網卡命名的udev規則,如果不想使用此網卡命名,可以去掉此udev規則。
mv -v /usr/lib/udev/rules.d/8*-net-setup-link.rules /usr/lib/udev/rules.d/net-setup-link.rules.bak
檢查OFED是否安裝
ls /usr/mpi/gcc/openmpi-3.1.0rc2/bin/mpirun
rpm -qa | grep mlnx-ofa
檢查PCIE 是否識別IB卡
lspci | grep -i Mellanox*
3.4 安裝nvidia-fabricmanager
命令如下:(和驅動版本強相關,本文按照GPU驅動 530.30.02版本為例)
wget -c //developer.download.nvidia.cn/compute/cuda/repos/ubuntu2004/x86_64/nvidia-fabricmanager-530_530.30.02-1_amd64.deb
安裝并啟動該服務
dpkg -i nvidia-fabricmanager-530_530.30.02-1_amd64.deb
systemctl enable nvidia-fabricmanager
systemctl start nvidia-fabricmanager
驗證方法:安裝無報錯
systemctl status nvidia-fabricmanager #打印正常運行
nvidia-smi topo -m #可以看到相關信息
四、 升級內核后,保證環境正常運行指南
用戶執行apt -y update / upgrade操作,可能會導致內核的升級,新內核與智算組件相關驅動不兼容,為保證環境的正確運行,主要分為以下三個情況進行判斷并解決:
情況1:錯誤操作導致內核升級:刪除新內核,以舊內核重新啟動操作系統,不需對組件驅動進行任何操作;
情況2:原組件與新內核不兼容:環境無法正常使用,則需要查看內核版本,篩選出不兼容的組件,并根據新內核的版本對組件進行重裝;
情況3:原組件與新內核兼容:環境可以正常使用,則不需要對原組件進行更新和重裝;
由于apt -y update / upgrade升級內核后需重啟系統才能使用新內核,若非錯誤操作導致內核升級的情況,可先命令行輸入reboot,重啟系統。
4.1 驗證驅動兼容性
主要組件包括Nvidia Gpu driver、CUDA與cudnn、OFED、nvidia-fabricmanager。
檢查內核版本
查看可用的內核版本 :您可以使用以下命令列出當前已安裝的內核版本:
dpkg --list | grep linux-image
查看正在使用的內核,是否為新內核,若不是新內核則reboot重啟系統后默認使用新內核
uname -r
驗證Nvidia Gpu driver
顯示gpu相關信息
nvidia-smi
執行該命令后,會詳細展示顯卡的運行狀態,包括GPU的驅動程序版本、溫度、顯存使用情況等。
驗證CUDA和cudnn
檢查 CUDA 是否正常工作:運行以下命令驗證 CUDA 是否正常工作:
nvcc --version
若顯示正常的CUDA版本,則正常
檢查 CuDNN 是否正常工作:運行以下命令驗證 CuDNN 是否正常工作:
cat /proc/version | grep CuDNN
如果輸出中包含 CuDNN 的版本信息,并且沒有出現錯誤消息,則正常
驗證OFED
ibstat # ib卡State為 active 并且 Link Layer 為: InfiniBand 則正常
ibv_devinfo #檢查端口的模式是否為 InfiniBand
驗證nvidia-fabricmanager
systemctl status nvidia-fabricmanager #打印正常運行
nvidia-smi topo -m #可以看到相關信息
若上述組件驗證皆正常,應進一步測試
(1)機器學習框架以確保一切正常。(運行一些簡單的示例代碼,檢查模型訓練和推斷是否仍然正常工作)
(2)查看網絡連接以及與其它節點的通信是否正常。
4.2 錯誤操作導致內核升級的情況
解決方法:切換回舊內核,以舊內核重新啟動操作系統,不需對組件驅動進行任何操作;
首先查看當前使用的內核版本,顯示為新內核5.4.0-159-generic
uname -r
#本文新內核為5.4.0-159-generic,舊內核為:5.4.0-80-generic
查看服務器啟動內核的順序
cat /boot/grub/grub.cfg | grep menu
修改默認內核版本
sudo gedit /etc/default/grub
改為GRUB_DEFAULT="一級目錄>舊內核版本”,如圖
更新grub設置
sudo update-grub
重啟電腦
reboot
查看重啟后是否切換回舊內核
uname -r
(可選)刪除新內核(默認基于舊內核啟動了,用戶可選擇刪或不刪)
sudo apt remove linux-image-<kernel_version>
其中 <kernel_version>是要刪除的內核版本號。
上述完成了內核的切換,繼續使用舊內核,則可以正常使用相關組件。
4.3 原組件與新內核不兼容的情況
解決方法:篩選出不兼容的組件,并根據新內核的版本對組件的驅動進行重裝;
(1) 首先需要查看NVIDIA GPU驅動、CUDA和cuDNN支持的linux內核版本,并根據新內核的版本重裝不兼容的組件;
NVIDIA GPU驅動支持的Linux內核版本
NVIDIA的官方文檔中列出了不同GPU驅動版本支持的Linux內核版本,NVIDIA GPU驅動支持的Linux內核版本文檔://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#runfile-nvidia-driver
CUDA支持的Linux內核版本
CUDA的支持文檔中包含有關不同CUDA版本支持的Linux內核版本的信息,CUDA支持的Linux內核版本文檔://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
cuDNN支持的Linux內核版本
cuDNN的支持文檔通常包含與不同版本的cuDNN庫兼容的Linux內核版本,cuDNN支持的Linux內核版本文檔://docs.nvidia.com/deeplearning/cudnn/support-matrix/index.html
(2) 下載對應組件,各組件下載鏈接見上文,《一、本文使用的軟件下載鏈接匯總》。
(3)安裝對應組件,各組件安裝方法見上文,《三、安裝過程》。
其中在3.3小節, 安裝MLNX_OFED時,需注意:
如果內核升級,不是默認內核,ofed的安裝很可能要加--add-kernel-support參數。ofed的自帶了預編譯的包和源碼,當內核兼容時會使用預編譯的包;當不兼容時,則需要加--add-kernel-support參數,從源碼編譯。當然此時需要有gcc編譯工具等。
#gcc等編譯工具的安裝
apt -y install build-essential #更新必要依賴(包含gcc)
將安裝指令./mlnxofedinstall --all -q指令改為下述指令
./mlnxofedinstall --add-kernel-support --all -q --force
(4)完成各組件驅動的安裝后,參考4.1小節驗證驅動與新內核的兼容性,并運行示例代碼,檢查模型訓練和推斷是否正常,并查看網絡連接以及與其它節點的通信是否正常。確保各組件能夠在新內核的環境下正常使用。
五、 內核升級指南
本章介紹用戶升級內核的重要性、方法及注意事項;
5.1 內核作用及升級內核的重要性:
Linux 內核的主要作用:
● 硬件管理: 內核負責與計算機硬件進行交互,管理各種硬件設備(如處理器、內存、硬盤、網絡適配器等)。它確保這些硬件能夠協同工作,以完成各種任務。
● 系統調度: 內核負責管理運行在計算機上的各個進程(程序的執行實例)。它決定哪個進程在什么時間運行,如何分配處理器時間片,以實現高效的多任務處理。
● 內存管理: 內核控制著計算機內存的分配和釋放,以確保不同的程序和進程能夠安全地共享系統內存資源。
● 文件系統管理: 內核管理文件系統,使得應用程序可以讀取、寫入和操作文件。它處理文件和目錄的創建、刪除、移動等操作。
● 設備驅動程序: 內核包含各種設備驅動程序,使操作系統能夠與硬件設備進行通信。這些驅動程序允許操作系統識別和與設備交互,從而實現硬件的正常工作。
● 安全性和權限管理: 內核負責管理用戶和程序的訪問權限,以確保系統的安全性。它通過訪問控制列表和權限機制來限制不同用戶和進程對系統資源的訪問。
● 系統調用: 內核提供系統調用接口,允許應用程序請求操作系統執行特定的任務,如文件操作、網絡通信等。
升級內核是保持系統最新和高效的關鍵,升級內核有助于保持系統與時俱進,獲得更好的性能、安全性和穩定性。
但是,升級內核需要謹慎,不當的升級可能會導致不穩定性或與現有軟件不兼容的問題。
升級內核重要性:
● 每個新內核版本都會帶來對硬件和軟件的優化。通過升級內核,用戶可以獲得更好的性能和響應速度,從而提升整體系統體驗。
● 內核更新通常包括對已知漏洞和安全問題的修復。保持內核更新意味著您的系統能夠抵御當前和未來的安全威脅。
● 新的內核版本通常會增加對新硬件的支持。這對于那些計劃使用最新硬件的用戶來說尤為重要。
5.2 用戶升級內核前的準備工作
在生產環境中,建議在進行升級之前進行測試和備份,以確保系統的穩定性和可用性,注意以下幾點:
● 備份重要數據:防止意外數據丟失的預防措施。
● 確保網絡連接:下載所需文件和更新。
● 確認當前系統信息:了解當前內核版本和系統配置。
5.3 用戶升級內核方法
使用包管理器APT(Advanced Package Tool)進行內核升級是最簡單的方法。進行任何系統更改之前,務必備份重要數據和配置文件,以防意外發生。
查看當前內核版本:
uname -r
升級步驟如下:
(1)更新軟件包列表,確保軟件包列表是最新的:
sudo apt update -y
(2)升級現有軟件包:
sudo apt upgrade -y
(3)搜索可用的內核版本:
apt list | grep linux-image #查看可用版本
apt list --installed | grep linux-image #查看已安裝版本
(4)安裝新內核:
sudo apt install linux-image-<version>
#例如sudo apt install linux-image-5.4.0-159-generic,確保<version>替換為選擇的內核版本號
(5)更新引導加載程序:
sudo update-grub
#內核升級后需要更新引導加載程序,以便在啟動時可以選擇新的內核版本。
(6)重新啟動系統: 內核升級完成后,重新啟動系統,以使更改生效。
reboot
(7)驗證新內核版本
uname -r
5.4 用戶升級內核后的注意事項
注意事項:
● 驗證內核版本:在重啟后,使用 uname -r 命令來確保您已經成功切換到了新的內核版本。
● 檢查硬件兼容性:新內核可能會影響硬件兼容性。確保您的硬件(如GPU、網卡等)與新內核兼容。如果您遇到問題,請查看硬件制造商的支持文檔。
● 備份數據:在進行內核升級前,始終備份重要數據。雖然內核升級通常不應影響數據,但出現問題時,數據丟失可能是一種風險。
● 舊內核保留:通常,舊內核版本不會立即被刪除,它們會保留在系統中。這可以用來回滾到舊內核,如果新內核出現問題。
● 測試系統:在升級后,測試系統以確保所有功能正常工作,特別是與硬件相關的功能。
● 查閱文檔:在執行內核升級之前,查閱官方文檔和Ubuntu社區以獲取與您特定情況相關的信息和指導。
一些建議:
● 備份配置文件:在升級內核之前,確保備份系統的重要配置文件,例如/etc目錄下的文件。這可以幫助您在出現問題時快速還原系統配置。
● 監控性能:在升級后,監控系統性能,特別是在處理高負載任務時。新內核可能會影響性能,因此及時發現和解決性能問題是重要的。
● 檢查第三方驅動程序:如果您使用第三方硬件驅動程序(如NVIDIA的閉源驅動程序),請確保這些驅動程序與新內核版本兼容。您可能需要更新這些驅動程序以確保它們與新內核一起正常工作。
● 查看系統日志:定期查看系統日志文件(通常位于/var/log目錄下)以獲取關于系統健康狀況的信息。如果出現與內核相關的錯誤消息,您可以進一步研究和解決問題。
● 安全性更新:內核升級通常包括修復安全漏洞的更新。因此,定期升級內核是維護系統安全性的重要一部分。
最重要的是,內核升級應該謹慎進行,特別是在生產環境中。在升級之前,確保您了解新內核版本的特性、改進和潛在問題,并在非關鍵系統上進行測試,以減小潛在的風險。在升級內核時,持續監控系統,并準備好應對可能出現的問題。
5.5 回滾到先前版本
方法一:回滾到舊版本內核的步驟如下:
(1)啟動時選擇舊內核: 在系統啟動時,通常會顯示一個引導菜單,選擇要啟動的內核版本。這通常是在 GRUB 引導菜單中完成的。在這個菜單中,選擇先前的穩定內核版本,而不是新內核。
(2)進入系統: 選擇舊內核后,讓系統繼續啟動。
(3)卸載新內核: 一旦進入系統并確保舊內核能夠正常工作,可以卸載新內核。使用以下命令卸載新內核:
查看已安裝的內核版本
dpkg --list | grep linux-image
刪除新內核
sudo apt remove linux-image-<kernel_version>
其中 <kernel_version>是要刪除的內核版本號。
例如 sudo apt remove linux-image-5.4.0-159-generic
(4)更新引導程序: 刪除新內核后,更新引導程序以反映這些更改。運行以下命令來更新 GRUB 配置:
sudo updata-grub
(5)重新啟動系統: 完成以上步驟后,重新啟動系統以確保引導程序已更新并且系統可以正常引導到舊內核。
reboot
(6)驗證內核版本: 運行"umane -r"命令驗證系統是否已回滾到先前的穩定內核版本:
方法二:參考4.2小節內容