cudasetdevice()必须在任何cuda上下文创建前调用,否则无效;cuda_visible_devices是设备重映射而非过滤;pytorch与tensorflow需硬隔离或内存增长配置;nccl通信依赖硬件拓扑与环境变量对齐。

GPU设备索引不生效:为什么cudaSetDevice()调用后仍跑在0号卡
多GPU环境下,cudaSetDevice()必须在任何CUDA上下文创建前调用,否则无效。常见错误是先调用了torch.randn(100).cuda()或tf.random.normal([100]).gpu(),这时默认上下文已绑定到device 0,后续cudaSetDevice(1)完全不起作用。
- PyTorch中应显式指定
device='cuda:1',而非依赖全局设备切换 - TensorFlow 2.x需在
tf.config.set_visible_devices()后,再用with tf.device('/GPU:1'):包裹计算逻辑 - CUDA C/C++程序务必把
cudaSetDevice(1)放在cudaMalloc、cudaLaunchKernel等任何API之前
环境变量冲突:为什么CUDA_VISIBLE_DEVICES=1后nvidia-smi只看到一张卡
CUDA_VISIBLE_DEVICES不是“选择哪张卡”,而是“重映射可见设备编号”。设为1时,程序内cudaGetDeviceCount()返回1,且cudaSetDevice(0)实际对应物理卡1——它把物理ID做了偏移,不是过滤。
- 若想让程序只看到物理卡1且把它当作
device 0,用CUDA_VISIBLE_DEVICES=1是对的;但若想同时用卡1和卡2,得写CUDA_VISIBLE_DEVICES=1,2 - 该变量对
nvidia-smi本身无影响,它始终显示所有物理卡;但对Python进程内的torch.cuda.device_count()有决定性影响 - 与
os.environ['CUDA_VISIBLE_DEVICES']设置顺序有关:必须在import torch前设置,否则被忽略
跨框架混用GPU:PyTorch和TensorFlow共存时显存打架怎么办
两个框架各自初始化独立CUDA上下文,默认都会抢占所有可见GPU的全部显存(即使只用其中一张)。这不是“显存共享失败”,而是“各自独占策略冲突”。
- TensorFlow需提前调用
tf.config.experimental.set_memory_growth(gpu, True),否则一启动就锁死整卡显存 - PyTorch无法动态释放显存,但可通过
torch.cuda.empty_cache()清空缓存——仅对当前device有效,且不归还给系统,只供本进程复用 - 最稳方案:用
CUDA_VISIBLE_DEVICES做硬隔离,比如PyTorch进程设为=0,TensorFlow设为=1,彻底避免交叠
NCCL通信报错:NCCL_VERSION和NCCL_SOCKET_TIMEOUT怎么配才不挂
多GPU训练中NCCL报错常不是代码问题,而是环境变量没对齐。尤其混合使用不同CUDA版本的PyTorch和系统驱动时,NCCL底层会静默降级或超时失败。
-
NCCL_VERSION一般不用手动设,但若用conda装的PyTorch,确保libnccl.so路径在LD_LIBRARY_PATH里,且版本≥PyTorch编译时链接的版本 -
NCCL_SOCKET_TIMEOUT=120可缓解节点间网络抖动导致的NCCL_WAIT卡死,但治标不治本;更关键是检查NCCL_IB_DISABLE=1是否误开(禁用InfiniBand后强制走慢速以太网) - 多机训练时,
NCCL_IB_DISABLE=0且确认RDMA配置正确,比调超时参数更重要
真正麻烦的是显卡间P2P访问未启用——nvidia-smi topo -m里如果GPU-GPU连接显示PHB或PCI而非PIX或NV2,说明没有直连,AllReduce性能会断崖下跌。这个硬件拓扑问题,软件怎么调参数都救不回来。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











