安装前准备工作
- 确认GPU型号和操作系统版本,本示例中GPU型号为V100,操作系统为Centos 7.5.1804
- 准备GPU驱动和CUDA 11.1软件包
在nvidia官网进行驱动包下载
- GPU驱动下载链接:https://www.nvidia.cn/Download/index.aspx?lang=cn
linux系统均选择 Linux 64-bit
CUDA Toolkit选择最新版本
- CUDA下载链接:
https://developer.nvidia.com/cuda-downloads
老版本的CUDA下载链接:
https://developer.nvidia.com/cuda-toolkit-archive
本示例中使用CUDA 11.1.1。
检查服务器GPU识别情况
安装GPU驱动之前需要在操作系统下查看GPU卡是否能够完全识别,如不能识别需要进行重新插拔、对调测试等步骤进行硬件排查。
注:要确保可以查看到所有的GPU
lspci | grep -i nvidia
- 老版本软件包卸载
- 若安装过其他版本的GPU驱动或CUDA,请先卸载。
GPU驱动卸载方法:
#/usr/bin/nvidia-uninstall
CUDA卸载方法:
#/usr/local/cuda/bin/cuda-uninstaller
或(老版本卸载方法)
#/usr/local/cuda/bin/uninstall_cuda_X.Y.pl
- 安装gcc、g++编译器
GPU驱动安装时需要gcc编译器。
cuda安装samples测试程序进行make时需要g++,但安装cuda软件包时不需要。
#检查版本
gcc -v
g++ -v
#软件包安装
#yum install gcc
#yum install gcc-c++
- 禁用系统自带的nouveau模块
检查nouveau模块是否加载,已加载则先禁用
#lsmod | grep nouveau
#没有blacklist-nouveau.conf文件则创建
#vim /usr/lib/modprobe.d/blacklist-nouveau.conf blacklist nouveau
options nouveau modeset=0
执行如下命令使内核生效(需要重启服务器后才可真正禁用nouveau)
#dracut -force
重启操作系统
- 修改系统运行级别为文本模式
GPU驱动安装必须在文本模式下进行
#systemctl set-default multi-user.target
- 重启系统,然后检查禁用nouveau模块配置与文本模式是否生效。
GPU驱动安装
- root用户下进行GPU驱动
#chmod +x NVIDIA-Linux-x86_64-450.80.02.run
#./NVIDIA-Linux-x86_64-450.80.02.run --no-opengl-files --ui=none --no-questions --accept-license
- 配置GPU驱动内存常驻模式
GPU驱动模式设置为常驻内存:
#nvidia-persistenced
设置开机自启动
vim /etc/rc.d/rc.local
在文件中添加一行
nvidia-persistenced
赋予/etc/rc.d/rc.local文件可执行权限
#chmod +x /etc/rc.d/rc.local
#若无/etc/rc.d/rc.local,也可修改
vim /etc/rc.local
chmod +x /etc/rc.local
- nvidia-smi
安装完GPU驱动后,可以使用nvidia-smi命令进行GPU状态查看及相关配置。
CUDA安装
- 安装CUDA
安装CUDA时需注意,如果之前安装过GPU驱动,安装CUDA时就不要再选择GPU驱动安装了。
chmod +x cuda_11.1.1_455.32.00_linux.run
./cuda_11.1.1_455.32.00_linux.run --no-opengl-libs
新版本CUDA安装界面:
注意Driver选项,表示是否安装GPU驱动,如果之前已经安装了GPU驱动,这里不要再勾选。
安装完成,如果安装失败,查看上述提示日志信息。
- 配置环境变量
添加到/etc/profile文件中,对所有用户生效
#vim /etc/profile
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
#source /etc/profile
测试cuda安装是否正确,环境变量是否识别成功
#nvcc -V
CUDA samples程序测试
- BandwidthTest
BandwidthTest测试GPU卡与主机server、GPU与GPU卡之间的显存带宽,测试结果中Host to Device Bandwidth和Device to Host Bandwidth分别为主机server至GPU卡和GPU卡至主机server的显存带宽,Device to Device Bandwidth测试的是GPU卡之间的显存带宽。
编译、测试
#cd /usr/local/cuda/samples/1_Utilities/bandwidthTest/
#make
#./bandwidthTest
测试结果参考
Host to Device Bandwidth和Device to Host Bandwidth两项数值在6.6GB/s-7.1GB/s之间
Device to Device Bandwidth测试显存带宽,该值根据GPU显存硬件配置而异,下表列出个GPU理论显存带宽,实测值在理论值70%以上即认定状态正常。
GPU型号 |
显存带宽理论值 |
---|---|
P100-PCIE-12GB |
548GB/s |
P100-PCIE-16GB/P100-SXM2-16GB |
732GB/s |
P40 |
346GB/s |
P4 |
192GB/s |
V100-PCIE/SXM2全系列 |
900GB/s |
- P2pBandwidthLatencyTest
P2pBandwidthLatencyTest测试结果为GPU卡之间的带宽,在进行带宽取值时,一般取enable对应的值即矩阵值=1时对应的结果。举例说明如下:
D\D对应的每行、每列表示GPU0、GPU1、GPU2。则GPU0与GPU1是P2P的,即代表为1,GPU0与GPU2不是P2P的,即代表为0。
编译、测试
#cd /usr/local/cuda/samples/1_Utilities/p2pBandwidthLatencyTest/
#make
#./p2pBandwidthLatencyTest
输出关注部分(以机器实际测试结果为准,下图为示意图。数据分析及合格标准见下方表格)
以Bidirectional P2P=Enabled的带宽数据和P2P=Enabled的延迟数据为准
分别查看互联拓扑、双向带宽、延迟时间。
测试结果参考:
互联矩阵中,有1标记即表示GPU间有P2P访问支持功能,0即无
根据GPU硬件版本不同,带宽和延迟存在差异,按照GPU型号数据总结如下:
GPU型号(带宽实测均值) |
矩阵值1 |
矩阵值0 |
---|---|---|
P100-SXM2(NVLINK1.0) |
35-38GB/s |
17-20GB/s |
PCIE GPU |
22-26GB/s |
17-20GB/s |
V100-SXM2(NVLINK2.0) |
90-96GB/s和45-48GB/s |
15-20GB/s |
GPU型号(延迟实测均值) |
矩阵值1 |
矩阵值0 |
---|---|---|
P100-SXM2(NVLINK1.0) |
≤10us |
≤20us |
PCIE GPU |
≤10us |
≤20us |
V100-SXM2(NVLINK2.0) |
≤10us |
≤20us |
- BatchCuBlas
BatchCuBlas为GPU浮点运算能力测试、加压。测试包括sgemm(测试单精度浮点计算能力)和dgemm(双精度)两部分,关注GFLOPS测试值。测试值达到理论值90%以上认定状态正常。
编译、测试
在测试命令中m、n、k值可调整,一般GPU缓存大小16G时可选8192,是个经验值。32G的测试如果8192可以测试出来正常数值也可以不改。
在测试命令中,使用--device=1参数指定测试ID号为1的GPU卡,默认测试ID号为0的GPU卡。
#cd /usr/local/cuda/samples/7_CUDALibraries/batchCUBLAS/
#make
#./batchCUBLAS -m8192 -n8192 -k8192 ##默认测试ID号为0的GPU卡
#./batchCUBLAS -m8192 -n8192 -k8192 --device=1 ##指定测试ID号为1的GPU卡
测试结果中,我们只关注Running N=10 with streams部分,分为单精度和双精度测试。