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 启动时每个进程都绑定到独立显卡,显存占用分布在所有卡上。

补一句。变量一旦在父进程设置过,子进程会继承,改完要在新终端里启动,否则看到的还是旧值。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189