8 卡服务器上 nvidia-smi 能看到全部显卡,但训练脚本启动后只认到一张,torch.cuda.device_count() 返回 1。
一开始怀疑是「启动脚本里读到了上层 shell 的旧变量」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。环境变量里写死了 CUDA_VISIBLE_DEVICES=0。还有一种是容器启动只映射了一张卡。
少数情况下是驱动只加载了部分设备,其余卡异常。
第一件事是检查环境变量实际取值
echo $env:CUDA_VISIBLE_DEVICES
接着清空限制后重新统计设备数
$env:CUDA_VISIBLE_DEVICES='0,1,2,3,4,5,6,7'; python -c "import torch;print(torch.cuda.device_count())"
再往下容器场景确认设备映射参数
docker run --gpus all -e CUDA_VISIBLE_DEVICES=0,1 image_name
等前面都确认过,再用系统工具核对全部卡的健康状态
nvidia-smi -L
同样的操作我在测试机上先走了一遍,线上只做验证过的部分。
恢复的判定其实很直接。device_count 返回 8,torchrun 启动时每个进程都绑定到独立显卡,显存占用分布在所有卡上。
补一句。变量一旦在父进程设置过,子进程会继承,改完要在新终端里启动,否则看到的还是旧值。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。