数据中心节点CUDA程序无法识别GPU但nvidia-smi显示正常的问题
问题描述
我是多节点数据中心的新手,遇到如下技术问题:
- 我使用一段CUDA设备检测程序编译生成可执行文件
device_info8。 - 在登录节点运行该程序,输出正常识别1块Tesla V100 GPU:
me@login01 test]$ ./device_info8 Number of devices: 1 Device Number: 0 Device name: Tesla V100-PCIE-16GB Memory Clock Rate (MHz): 856 Memory Bus Width (bits): 4096 Peak Memory Bandwidth (GB/s): 898.0 Total global memory (Gbytes) 15.8 Shared memory per block (Kbytes) 48.0 minor-major: 0-7 Warp-size: 32 Concurrent kernels: yes Concurrent computation/communication: yes
- 通过以下命令登录Node-11节点:
me@login01 test]$ srun -p partition1 --nodelist Node-11 --gres=gpu:all --pty -u bash -i [me@Node-11 test]$
- 在Node-11运行
device_info8时,输出显示无CUDA设备:
[me@Node-11 test]$./device_info8 Number of devices: 0
- 但运行
nvidia-smi明确显示该节点有8块Tesla V100 GPU可用:
[me@Node-11 test]$ nvidia-smi Tue Dec 3 18:16:04 2024 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.67 Driver Version: 418.67 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC || Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. ||===============================+======================+======================|| 0 Tesla V100-PCIE... On | 00000000:2D:00.0 Off | 0 || N/A 28C P0 26W / 250W | 0MiB / 32480MiB | 0% Default |+-------------------------------+----------------------+----------------------+| 1 Tesla V100-PCIE... On | 00000000:31:00.0 Off | 0 || N/A 26C P0 25W / 250W | 0MiB / 32480MiB | 0% Default |+-------------------------------+----------------------+----------------------+| 2 Tesla V100-PCIE... On | 00000000:35:00.0 Off | 0 || N/A 26C P0 25W / 250W | 0MiB / 32480MiB | 0% Default |+-------------------------------+----------------------+----------------------+| 3 Tesla V100-PCIE... On | 00000000:39:00.0 Off | 0 || N/A 27C P0 24W / 250W | 0MiB / 32480MiB | 0% Default |+-------------------------------+----------------------+----------------------+| 4 Tesla V100-PCIE... On | 00000000:A9:00.0 Off | 0 || N/A 26C P0 26W / 250W | 0MiB / 32480MiB | 0% Default |+-------------------------------+----------------------+----------------------+| 5 Tesla V100-PCIE... On | 00000000:AD:00.0 Off | 0 || N/A 29C P0 25W / 250W | 0MiB / 32480MiB | 0% Default |+-------------------------------+----------------------+----------------------+| 6 Tesla V100-PCIE... On | 00000000:B1:00.0 Off | 0 || N/A 27C P0 24W / 250W | 0MiB / 32480MiB | 0% Default |+-------------------------------+----------------------+----------------------+| 7 Tesla V100-PCIE... On | 00000000:B5:00.0 Off | 0 || N/A 28C P0 27W / 250W | 0MiB / 32480MiB | 0% Default |+-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory || GPU PID Type Process name Usage ||=============================================================================|| No running processes found |+-----------------------------------------------------------------------------+
请问出现该现象的原因是什么?我忽略了哪些细节?如何让GPU对该程序可用?
问题分析与解决办法
核心原因
- CUDA环境版本不兼容:登录节点与Node-11的CUDA Toolkit版本不一致。你在登录节点编译的
device_info8依赖的CUDA库,和Node-11上驱动支持的CUDA 10.1不匹配,导致程序无法识别GPU设备。 - SLURM交互式会话未正确初始化GPU环境:用
srun启动交互式bash时,部分CUDA相关环境变量(如LD_LIBRARY_PATH、CUDA_VISIBLE_DEVICES)未被正确加载,程序找不到CUDA运行时库或无法访问GPU资源。 - 跨节点编译的兼容性问题:不同节点的硬件、库路径存在差异,在登录节点编译的程序,到其他节点运行时可能因依赖缺失或版本冲突失效。
解决步骤
1. 在Node-11上重新编译程序
登录Node-11后,加载与驱动匹配的CUDA 10.1模块,重新编译程序:
# 加载对应版本的CUDA模块(命令需根据集群实际配置调整) module load cuda/10.1 # 重新编译检测程序 nvcc device_info8.cu -o device_info8
运行重新编译后的device_info8,即可正常识别GPU。
2. 手动配置环境变量(适用于不想重新编译的场景)
若要直接运行原程序,需手动设置Node-11上的CUDA环境变量:
# 设置CUDA库路径为Node-11上的CUDA 10.1路径(需根据实际路径调整) export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64:$LD_LIBRARY_PATH # 确保CUDA_VISIBLE_DEVICES被正确设置 export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
设置完成后重新运行device_info8。
3. 用srun直接运行程序
避免交互式会话的环境问题,直接通过srun调度运行程序:
me@login01 test]$ srun -p partition1 --nodelist Node-11 --gres=gpu:all ./device_info8
这种方式SLURM会自动初始化GPU资源和对应环境变量,程序可直接访问GPU。
4. 验证CUDA环境一致性
检查登录节点与Node-11的CUDA版本,确保编译环境与运行环境匹配:
# 登录节点执行 nvcc --version # Node-11执行 nvcc --version
后续尽量在目标节点编译CUDA程序,避免跨节点编译的兼容性问题。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

