为什么PyTorch找不到支持CUDA的NVIDIA驱动程序?

16

我在我的机器中添加了一张GeForce GTX 1080 Ti显卡(运行Ubuntu 18.04和带有Python 3.7的Anaconda),以便在使用PyTorch时利用GPU。两张显卡都被正确识别:

$ lspci | grep VGA
03:00.0 VGA compatible controller: NVIDIA Corporation GF119 [NVS 310] (reva1)
04:00.0 VGA compatible controller: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] (rev a1)

NVS 310处理我的2个显示器设置,我只想利用1080来运行PyTorch。我还安装了目前存储库中最新的NVIDIA驱动程序,这似乎很好:

$ nvidia-smi 
Sat Jan 19 12:42:18 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.87                 Driver Version: 390.87                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  NVS 310             Off  | 00000000:03:00.0 N/A |                  N/A |
| 30%   60C    P0    N/A /  N/A |    461MiB /   963MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 108...  Off  | 00000000:04:00.0 Off |                  N/A |
|  0%   41C    P8    10W / 250W |      2MiB / 11178MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0                    Not Supported                                       |
+-----------------------------------------------------------------------------+

根据NVIDIA文档,390.xx驱动版本可以运行CUDA 9.1(9.1.85)。由于这也是Ubuntu存储库中的版本,因此我只需使用以下命令安装CUDA Toolkit:

$ sudo apt-get-installed nvidia-cuda-toolkit

再次确认,这似乎没问题:

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Nov__3_21:07:56_CDT_2017
Cuda compilation tools, release 9.1, V9.1.85
and
$ apt-cache policy nvidia-cuda-toolkit
nvidia-cuda-toolkit:
  Installed: 9.1.85-3ubuntu1
  Candidate: 9.1.85-3ubuntu1
  Version table:
 *** 9.1.85-3ubuntu1 500
        500 http://sg.archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages
        100 /var/lib/dpkg/status

最后,我使用conda从头安装了PyTorch。

conda install pytorch torchvision -c pytorch

据我所知,也存在错误:

$ conda list
...
pytorch                   1.0.0           py3.7_cuda9.0.176_cudnn7.4.1_1    pytorch
...

然而,PyTorch似乎无法找到CUDA:

$ python -c 'import torch; print(torch.cuda.is_available())'
False

具体而言,如果我强制将PyTorch中的张量x转换为CUDA格式,使用x.cuda(),则会出现以下错误:

Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from 82 http://...

我在这里缺少什么?我是新手,但我认为我已经检查了Web相当多的内容,以查找任何类似于NVIDIA驱动程序和CUDA工具包版本的注意事项?

编辑:PyTorch的一些更多输出:

print(torch.cuda.device_count())   # --> 0
print(torch.cuda.is_available())   # --> False
print(torch.version.cuda)          # --> 9.0.176

2
我会摆脱NVS 310。然后,我会使用由NVIDIA提供的Linux安装指南中的说明来验证CUDA的安装。构建并运行像vectorAddbandwidthTest这样的示例代码。如果它们不能正确工作,那么你的CUDA安装就有问题了。 - Robert Crovella
我刚刚读到PyTorch二进制文件已经捆绑了所需的CUDA和cuDNN组件。因此,我现在删除了CUDA Toolkit。我实际上从一台安装有NVS 310的机器中取出了1080,它可以正常工作。我认为这对于一些负载均衡会有所帮助。 - Christian
1
@RobertCrovella 我已经测试过只有1080可以使用,而且它可以正常工作。当我只使用这张卡时,我也可以使用更新的驱动程序(415而不是390)。我还尝试了只使用NVS 310和390驱动程序。我知道这张卡的计算能力太低了,但我记得错误信息是相应的,而不仅仅是说找不到驱动程序。然而,这一次,它甚至无法找到/看到驱动程序。所以,是的,我现在就把1080留在那里。谢谢! - Christian
1
你的PyTorch构建是针对CUDA 9.0.176的,而你安装了CUDA 9.1.85。然而,移除CUDA安装并让anaconda为你安装它。 - Luca Di Liello
4个回答

1

我曾在尝试在我们的服务器上使用 PyTorch 进行训练时遇到了同样的问题(该服务器有 4 个 GPU),因此我无法选择删除 GPU。

然而,我使用 Docker 和 docker-compose 运行我的训练。因此,我从 nvidia 找到了这个带有所有必要设置的 PyTorch 镜像。请在拉取镜像之前,确保查看此 页面 以确定哪个镜像标签与您的 nvidia 驱动程序版本兼容(如果您拉取错误的标签,则无法正常工作)。

然后,在您的 docker-compose 文件中,您可以按以下方式指定要使用的 GPU:

version: '3.5'

services:
  training:
    build:
      context: ""
      dockerfile: Dockerfile
    container_name: training
    environment:
      - CUDA_VISIBLE_DEVICES=0,2
    ipc: "host"

请确保将ipc设置为“host”,这将允许您的Docker容器使用主机共享内存,而不是分配给Docker的内存(不足)。


0

您可以将数据和模型加载到GPU上。如果您的本地系统支持GPU,则可以创建数据加载器并将其加载到本地系统中,或者您也可以在kaggle或colab服务器上在线使用它。如果在本地运行,您可以根据系统更改batch_size、num_workers等参数。

from torch.utils.data import DataLoader

def get_default_device():
"""Pick GPU if available, else CPU"""
if torch.cuda.is_available():
    return torch.device('cuda')
else:
    return torch.device('cpu')

def to_device(data, device):
"""Move tensor(s) to chosen device"""
if isinstance(data, (list,tuple)):
    return [to_device(x, device) for x in data]
return data.to(device, non_blocking=True)

class DeviceDataLoader():
"""Wrap a dataloader to move data to a device"""
def __init__(self, dl, device):
    self.dl = dl
    self.device = device
    
def __iter__(self):
    """Yield a batch of data after moving it to device"""
    for b in self.dl: 
        yield to_device(b, self.device)

def __len__(self):
    """Number of batches"""
    return len(self.dl)

0

如前所述,您需要设置CUDA_VISIBLE_DEVICES。

如果您想使用1个GPU,则应为:

CUDA_VISIBLE_DEVICES=1

如果您想要更复杂的设置,可以在以下链接中找到更多详细信息:如何选择要在哪个GPU上运行作业?


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - user11717481

0

由于您有两张显卡,选择一个卡ID CUDA_VISIBLE_DEVICES=GPU_ID 应该可以解决问题,详见说明


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接