智算场景NVIDIA-GPU镜像组件的安装指南
本文介绍智算相关组件的安装方法,其中包含(nvidia driver、ofed、cuda、cudnn)具体的组件版本根据需求设置,本文主要包含三大部分内容:
● 介绍适配nvidia-driver-530驱动的相关组件的安装方法;
● 内核升级指南;
● Ubuntu内核升级后,保证环境正常运行的指南;
该安装指南以 Ubuntu20.04 系统为例,遇到GPU多机互联的使用场景,建议关闭设备的防火墙(systemctl disable 防火墙; systemctl disable 防火墙)。
一、本文使用的软件下载链接汇总
nvidia驱动下载地址:https://download.nvidia.com/XFree86/Linux-x86_64/530.30.02/NVIDIA-Linux-x86_64-530.30.02.run (各版本驱动下载地址为https://download.nvidia.com/XFree86/Linux-x86_64,本文使用530.30.02版本)
CUDA下载地址:
https://developer.nvidia.com/cuda-toolkit-archive(各版本cuda下载地址)
cuDNN下载地址:
https://developer.nvidia.com/rdp/cudnn-archive(需要注册登录后才能下载)
OFED下载地址:
https://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或
https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/
CUDA版本与nvidia driver版本对应表:https://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网站(地址:https://www.nvidia.cn/Download/index.aspx)或用Graphics Drivers PPA安装最新的驱动程序。
方法一:从NVIDIA网站下载驱动并安装
安装驱动前一定要更新软件列表和安装必要软件、依赖
apt -y install build-essential #更新必要依赖
查看GPU型号
lspci | grep -i nvidia
官网下载对应GPU驱动:
下载链接https://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版本对应表:https://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:
https://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 https://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安装简单,下载对应版本压缩包,拷贝文件到指定目录,给予权限就好了。
下载地址:https://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 下载驱动
下载方式一:直接使用链接https://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下载驱动。
下载方式二:访问页面https://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 https://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内核版本文档:https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#runfile-nvidia-driver
CUDA支持的Linux内核版本
CUDA的支持文档中包含有关不同CUDA版本支持的Linux内核版本的信息,CUDA支持的Linux内核版本文档:https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
cuDNN支持的Linux内核版本
cuDNN的支持文档通常包含与不同版本的cuDNN库兼容的Linux内核版本,cuDNN支持的Linux内核版本文档:https://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小节内容