我挖掘了两个隐藏概念:GPU设备索引和CUDA设备索引,大家明白了这两个概念的区别,我相信大家对PyTorch的喜欢会更加多一点,因为了解越多,兴趣越浓,喜欢变多。
C:\Users\488xxx66>nvidia-smi -L
GPU 0: NVIDIA GeForce RTX 4090 Laptop GPU
GPU 1: NVIDIA GeForce RTX 4070 Laptop GPU
GPU 2: NVIDIA GeForce RTX 4060 Laptop GPU
import torch
gpu_num = torch.cuda.device_count()
for i in range(0, gpu_num):
print("CUDA设备索引{}对应的GPU名字是:".format(i), torch.cuda.get_device_name(0))
输出结果为:
CUDA设备索引0对应的GPU名字是: NVIDIA GeForce RTX 4060 Laptop GPU
CUDA设备索引1对应的GPU名字是: NVIDIA GeForce RTX 4070 Laptop GPU
CUDA设备索引2对应的GPU名字是: NVIDIA GeForce RTX 4090 Laptop GPU
可以看出nvidia-smi命令中的GPU编号与PyTorch代码中的CUDA编号正好相反。
nvidia-smi下的GPU编号默认使用 PCI_BUS_ID,而 PyTorch 代码默认情况下设备排序是 FASTEST_FIRST
要使 PyTorch 代码中的 GPU 编号与 nvidia_smi 保持一致,需要设置CUDA的环境变量CUDA_DEVICE_ORDER,我们可以在PyTorch代码中添加如下命令:
import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"