3、软件栈安装:NVIDIA驱动、CUDA Toolkit、Mellanox OFED驱动、nvidia-fabricmanager的安装与验证
好,咱们进入实战环节。这一章要搞定的是整个GPU Direct RDMA的软件地基。说白了,就是把你手头的硬件——GPU、网卡、NVSwitch——给“喂”上正确的驱动和库。我见过太多项目,硬件配得挺豪华,结果软件栈没对齐,性能直接腰斩。嗯,咱们一步步来。
3.1 整体安装顺序与版本匹配原则
安装顺序有讲究。我个人习惯是:先装NVIDIA驱动,再装CUDA Toolkit,然后是Mellanox OFED,最后是nvidia-fabricmanager。为什么是这个顺序?因为后面的组件往往依赖前面的基础库。
版本匹配是重中之重。你想想看,驱动版本决定了CUDA Runtime能支持的最高版本,而OFED驱动又需要和内核版本、CUDA版本对齐。我曾经在一个集群上,因为驱动版本低了两个小版本,导致GPUDirect RDMA的P2P带宽死活跑不满。查了三天,最后发现是驱动不支持某个关键特性。
- NVIDIA驱动版本 ≥ CUDA Toolkit所需的最低驱动版本
- Mellanox OFED版本需与内核版本兼容(建议用官方兼容性矩阵核对)
- nvidia-fabricmanager版本必须与驱动版本严格一致(小版本号也要对上)
- 所有组件建议使用同一大版本下的最新稳定版
3.2 NVIDIA驱动安装
驱动安装有两种主流方式:runfile安装和包管理器安装。我个人更推荐runfile方式,因为它更可控,不会自动给你装一些乱七八糟的依赖。
先确认你的GPU型号和当前内核版本:
# 查看GPU信息
lspci | grep -i nvidia
# 查看当前内核版本
uname -r
# 查看当前是否已有NVIDIA驱动
nvidia-smi
如果系统里已经有旧驱动,先清理干净:
# 停止X服务(如果有图形界面)
sudo systemctl stop gdm3 # 或 lightdm
# 卸载旧驱动
sudo apt-get purge nvidia-* # Ubuntu/Debian
sudo yum remove nvidia-* # CentOS/RHEL
# 禁用nouveau开源驱动
echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
echo "options nouveau modeset=0" | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf
sudo update-initramfs -u
然后下载对应版本的驱动runfile,执行安装:
# 给runfile加执行权限
chmod +x NVIDIA-Linux-x86_64-*.run
# 执行安装(建议加--no-opengl-files参数,避免与桌面环境冲突)
sudo ./NVIDIA-Linux-x86_64-*.run --no-opengl-files
sudo modprobe nvidia。
验证驱动是否安装成功:
nvidia-smi
你应该能看到GPU列表、驱动版本、CUDA版本等信息。如果报错,多半是内核模块没加载成功,检查一下dmesg | grep nvidia的输出。
3.3 CUDA Toolkit安装
CUDA Toolkit包含了编译器、库文件和开发工具。安装方式同样有runfile和包管理器两种。我建议用runfile安装,因为可以自定义安装路径,方便多版本共存。
下载对应版本的CUDA Toolkit runfile:
# 以CUDA 12.1为例
wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run
# 执行安装
sudo sh cuda_12.1.0_530.30.02_linux.run
安装过程中,不要勾选Driver选项(因为我们已经单独装了驱动),只选择Toolkit和Documentation即可。
安装完成后,配置环境变量:
# 在~/.bashrc或~/.zshrc中添加
export PATH=/usr/local/cuda-12.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH
# 立即生效
source ~/.bashrc
验证CUDA Toolkit:
nvcc --version
你应该能看到CUDA编译器的版本信息。另外,可以编译一个简单的测试程序:
cd /usr/local/cuda-12.1/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery
如果输出中显示“PASS”,说明CUDA Toolkit安装正确。
3.4 Mellanox OFED驱动安装
Mellanox OFED(OpenFabrics Enterprise Distribution)是ConnectX系列网卡的官方驱动栈。它包含了内核模块、用户态库和管理工具。GPU Direct RDMA的核心——GPUDirect RDMA和GDRCopy——都依赖它。
先确认网卡型号:
lspci | grep Mellanox
# 或者
ibstat
下载对应内核版本的OFED驱动:
# 从Mellanox官网下载,或使用以下命令
wget https://www.mellanox.com/downloads/ofed/MLNX_OFED-5.8-1.0.1.1/MLNX_OFED_LINUX-5.8-1.0.1.1-ubuntu22.04-x86_64.tgz
# 解压
tar xzf MLNX_OFED_LINUX-5.8-1.0.1.1-ubuntu22.04-x86_64.tgz
cd MLNX_OFED_LINUX-5.8-1.0.1.1-ubuntu22.04-x86_64
执行安装脚本:
# 以root权限执行
sudo ./mlnxofedinstall --force
# 安装完成后,重启openibd服务
sudo /etc/init.d/openibd restart
libibverbs、librdmacm等。建议先安装所有依赖:sudo apt-get install -y libibverbs-dev librdmacm-dev(Ubuntu)或sudo yum install -y libibverbs-devel librdmacm-devel(CentOS)。
验证OFED安装:
# 查看网卡状态
ibstatus
# 查看OFED版本
ofed_info -s
# 测试RDMA通信(需要两台机器)
ib_write_bw -d mlx5_0 --report_gbits
如果ibstatus显示端口状态为“Active”,说明网卡驱动正常。我曾经遇到过一个问题:安装完OFED后,ibstatus显示端口是“Down”。后来发现是网线没插好,或者交换机端口没启用。嗯,这种低级错误最容易让人抓狂。
3.5 nvidia-fabricmanager安装
nvidia-fabricmanager是NVIDIA为NVSwitch/NVLink设计的守护进程。它负责管理GPU之间的拓扑和带宽分配。如果你用的是DGX系列或者带有NVSwitch的服务器,这个组件必不可少。
安装方式很简单,但版本必须和驱动严格一致:
# 添加NVIDIA官方仓库(以Ubuntu为例)
sudo apt-get install -y nvidia-fabricmanager-535 # 535对应驱动版本
# 启动服务
sudo systemctl enable nvidia-fabricmanager
sudo systemctl start nvidia-fabricmanager
验证fabricmanager状态:
sudo systemctl status nvidia-fabricmanager
# 查看NVSwitch状态
nvidia-smi nvlink -s
如果服务正常运行,nvidia-smi nvlink -s应该能显示所有NVLink链路的状态。如果显示“Disabled”或“Error”,多半是fabricmanager没启动,或者版本不匹配。
3.6 整体验证:GPU Direct RDMA连通性测试
所有组件安装完成后,我们需要做一个端到端的验证。这里用NVIDIA官方的gdr_copy工具来测试GPUDirect RDMA是否正常工作。
首先,安装GDRCopy(如果OFED安装时没带):
# 从NVIDIA GitHub下载
git clone https://github.com/NVIDIA/gdrcopy.git
cd gdrcopy
make
sudo make install
然后运行测试:
# 测试GPU到网卡的P2P拷贝
./gdr_copy -d 0 -s 1024
# 或者用ib_write_gdr测试RDMA写操作
ib_write_gdr -d mlx5_0 -g 0 --use_cuda
如果测试通过,你会看到类似“PASS”或“Bandwidth: XX Gbps”的输出。如果失败,常见原因有:
- 驱动版本不匹配(检查nvidia-smi和ofed_info)
- fabricmanager未启动(检查systemctl status)
- 网卡固件版本过低(用
mlxconfig检查) - BIOS中未开启Resizable BAR或Above 4G Decoding
嗯,到这里,软件栈就全部就绪了。下一章我们会深入配置GPU Direct RDMA的具体参数,包括注册内存、设置GDRCopy等。到时候你会看到,这些安装步骤有多重要——基础打不好,后面全是坑。