【问题标题】:Pytorch says that CUDA is not availablePytorch 说 CUDA 不可用
【发布时间】:2020-10-03 03:36:40
【问题描述】:

我正在尝试在我拥有的笔记本电脑上运行 Pytorch。这是一个较旧的型号,但它确实有一个 Nvidia 显卡。我意识到这可能不足以进行真正的机器学习,但我正在尝试这样做,以便了解安装 CUDA 的过程。

我已按照 Ubuntu 18.04 的 installation guide 上的步骤进行操作(我的特定发行版是 Xubuntu)。

我的显卡是GeForce 845M,通过lspci | grep nvidia验证:

01:00.0 3D controller: NVIDIA Corporation GM107M [GeForce 845M] (rev a2)
01:00.1 Audio device: NVIDIA Corporation Device 0fbc (rev a1)

我也安装了 gcc 7.5,由gcc --version 验证

gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

我安装了正确的标头,并通过尝试使用sudo apt-get install linux-headers-$(uname -r) 安装它们来验证:

Reading package lists... Done
Building dependency tree       
Reading state information... Done
linux-headers-4.15.0-106-generic is already the newest version (4.15.0-106.107).

然后我按照安装说明使用 10.1 版的本地 .deb。

Npw,当我运行 nvidia-smi 时,我得到:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.87.00    Driver Version: 418.87.00    CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce 845M        On   | 00000000:01:00.0 Off |                  N/A |
| N/A   40C    P0    N/A /  N/A |     88MiB /  2004MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0       982      G   /usr/lib/xorg/Xorg                            87MiB |
+-----------------------------------------------------------------------------+

然后我运行nvcc -V 我得到:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
Cuda compilation tools, release 10.1, V10.1.243

然后我从section 6.1 执行了安装后指令,因此echo $PATH 看起来像这样:

/home/isaek/anaconda3/envs/stylegan2_pytorch/bin:/home/isaek/anaconda3/bin:/home/isaek/anaconda3/condabin:/usr/local/cuda-10.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

echo $LD_LIBRARY_PATH 看起来像这样:

/usr/local/cuda-10.1/lib64

我的/etc/udev/rules.d/40-vm-hotadd.rules 文件如下所示:

# On Hyper-V and Xen Virtual Machines we want to add memory and cpus as soon as they appear
ATTR{[dmi/id]sys_vendor}=="Microsoft Corporation", ATTR{[dmi/id]product_name}=="Virtual Machine", GOTO="vm_hotadd_apply"
ATTR{[dmi/id]sys_vendor}=="Xen", GOTO="vm_hotadd_apply"
GOTO="vm_hotadd_end"

LABEL="vm_hotadd_apply"

# Memory hotadd request

# CPU hotadd request
SUBSYSTEM=="cpu", ACTION=="add", DEVPATH=="/devices/system/cpu/cpu[0-9]*", TEST=="online", ATTR{online}="1"

LABEL="vm_hotadd_end"

在所有这些之后,我什至编译并运行了示例。 ./deviceQuery 返回:

./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "GeForce 845M"
  CUDA Driver Version / Runtime Version          10.1 / 10.1
  CUDA Capability Major/Minor version number:    5.0
  Total amount of global memory:                 2004 MBytes (2101870592 bytes)
  ( 4) Multiprocessors, (128) CUDA Cores/MP:     512 CUDA Cores
  GPU Max Clock rate:                            863 MHz (0.86 GHz)
  Memory Clock rate:                             1001 Mhz
  Memory Bus Width:                              64-bit
  L2 Cache Size:                                 1048576 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
  Maximum Layered 1D Texture Size, (num) layers  1D=(16384), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(16384, 16384), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  2048
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device supports Compute Preemption:            No
  Supports Cooperative Kernel Launch:            No
  Supports MultiDevice Co-op Kernel Launch:      No
  Device PCI Domain ID / Bus ID / location ID:   0 / 1 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.1, CUDA Runtime Version = 10.1, NumDevs = 1
Result = PASS

和./bandwidthTest 返回:

[CUDA Bandwidth Test] - Starting...
Running on...

 Device 0: GeForce 845M
 Quick Mode

 Host to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)    Bandwidth(GB/s)
   32000000         11.7

 Device to Host Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)    Bandwidth(GB/s)
   32000000         11.8

 Device to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)    Bandwidth(GB/s)
   32000000         14.5

Result = PASS

NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

但在这一切之后,这个 Python sn-p(在安装了所有依赖项的 conda 环境中):

import torch
torch.cuda.is_available()

返回False

有人知道如何解决这个问题吗?我尝试像这样将/usr/local/cuda-10.1/bin 添加到etc/environment:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
PATH=$PATH:/usr/local/cuda-10.1/bin

然后重新启动终端,但这并没有解决问题。我真的不知道还能尝试什么。

编辑 - @kHarshit 的 collect_env 的结果

Collecting environment information...
PyTorch version: 1.5.0
Is debug build: No
CUDA used to build PyTorch: 10.2

OS: Ubuntu 18.04.4 LTS
GCC version: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
CMake version: Could not collect

Python version: 3.6
Is CUDA available: No
CUDA runtime version: 10.1.243
GPU models and configuration: GPU 0: GeForce 845M
Nvidia driver version: 418.87.00
cuDNN version: Could not collect

Versions of relevant libraries:
[pip] numpy==1.18.5
[pip] pytorch-ranger==0.1.1
[pip] stylegan2-pytorch==0.12.0
[pip] torch==1.5.0
[pip] torch-optimizer==0.0.1a12
[pip] torchvision==0.6.0
[pip] vector-quantize-pytorch==0.0.2
[conda] numpy                     1.18.5                   pypi_0    pypi
[conda] pytorch-ranger            0.1.1                    pypi_0    pypi
[conda] stylegan2-pytorch         0.12.0                   pypi_0    pypi
[conda] torch                     1.5.0                    pypi_0    pypi
[conda] torch-optimizer           0.0.1a12                 pypi_0    pypi
[conda] torchvision               0.6.0                    pypi_0    pypi
[conda] vector-quantize-pytorch   0.0.2                    pypi_0    pypi

【问题讨论】:

  • 你能发布collect_env脚本的结果吗?
  • Pytorch 在通过 pip 或 conda 安装时不使用系统 cuda,它带有自己的 cuda 运行时副本,只要显卡的计算能力 >= 5.0 并且图形驱动程序支持所需的 cuda 版本。您是否使用conda install pytorch torchvision cudatoolkit=10.1 -c pytorch 安装?可能是您安装了 pytorch 的 CPU 版本。
  • @jodag 我认为这已经解决了!您介意在答案中详细说明这到底是做什么的吗?我会在发布后立即接受。
  • 用户可能还会发现这个问题(和答案)很有用stackoverflow.com/questions/67122586/…
  • @jodag nvidia-cuda-toolkit(由 Canonical PPA 提供)和 NVIDIA 都有效。诀窍是创建一个新环境或强制重新安装pytorch。

标签: linux pytorch ubuntu-18.04


【解决方案1】:

PyTorch 不使用系统的 CUDA 库。当您使用 pip 或 conda 使用预编译的二进制文件安装 PyTorch 时,它附带了本地安装的指定版本的 CUDA 库的副本。事实上,您甚至不需要在系统上安装 CUDA 即可使用支持 CUDA 的 PyTorch。

有两种情况可能会导致您的问题。

  1. 您安装了仅 CPU 版本的 PyTorch。在这种情况下,PyTorch 没有使用 CUDA 支持进行编译,因此它不支持 CUDA。

  2. 您安装了 CUDA 10.2 版本的 PyTorch。在这种情况下,问题在于您的显卡当前使用的是 418.87 驱动程序,该驱动程序仅支持 CUDA 10.1。在这种情况下,两个潜在的修复方法是安装更新的驱动程序(根据Table 2,版本 >= 440.33)或安装针对 CUDA 10.1 编译的 PyTorch 版本。

要确定安装 PyTorch 时要使用的适当命令,您可以使用 pytorch.org 的“安装 PyTorch”部分中的方便小部件。只需选择合适的操作系统、包管理器和 CUDA 版本,然后运行推荐的命令。

在您的情况下,一种解决方案是使用

conda install pytorch torchvision cudatoolkit=10.1 -c pytorch

向 conda 明确指定您要安装针对 CUDA 10.1 编译的 PyTorch 版本。

有关 PyTorch CUDA 与驱动程序和硬件的兼容性的更多信息,请参阅this answer。


编辑 添加collect_env 的输出后,我们可以看到问题在于您安装了 CUDA 10.2 版本的 PyTorch。基于此,另一种解决方案是更新图形驱动程序,如第 2 项和链接答案中所述。

【讨论】:

  • 此解决方案有效。请注意,如果您之前安装了仅限 cpu 的版本,请确保在安装新的启用 cuda 的包之前删除“cpuonly”包。在我注意到之前,这让我很难受。
  • 运行pip3 install pytorch torchvision cudatoolkit=10.1 -c pytorch 返回ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'pytorch。 pip3 install pytorch torchvision cudatoolkit==10.1 也不行。
  • 找到解决方案:pip install torch==1.7.1+cu101 torchvision==0.8.2+cu101 torchaudio==0.7.2 -f download.pytorch.org/whl/torch_stable.html source
【解决方案2】:

在我的情况下,只是重新启动我的机器使 GPU 再次处于活动状态。我收到的最初消息是 GPU 当前正在被另一个应用程序使用。但是当我查看nvidia-smi 时,我什么也没看到。所以,依赖项没有变化,它又开始工作了。

【讨论】:

    【解决方案3】:

    TL;博士

    1. 安装由 Canonical 或 NVIDIA 第三方 PPA 提供的 NVIDIA Toolkit。
    2. 重新启动您的工作站。
    3. 创建干净 Python 虚拟环境(或重新安装所有 CUDA 依赖包)。

    说明

    首先安装Canonical提供的NVIDIA CUDA Toolkit:

    sudo apt install -y nvidia-cuda-toolkit
    

    或关注NVIDIA developers instructions:

    # ENVARS ADDED **ONLY FOR READABILITY**
    NVIDIA_CUDA_PPA=https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/
    NVIDIA_CUDA_PREFERENCES=https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
    NVIDIA_CUDA_PUBKEY=https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub
    
    # Add NVIDIA Developers 3rd-Party PPA
    sudo wget ${NVIDIA_CUDA_PREFERENCES} -O /etc/apt/preferences.d/nvidia-cuda
    sudo apt-key adv --fetch-keys ${NVIDIA_CUDA_PUBKEY}
    echo "deb ${NVIDIA_CUDA_PPA} /" | sudo tee /etc/apt/sources.list.d/nvidia-cuda.list
    
    # Install development tools
    sudo apt update
    sudo apt install -y cuda
    

    然后重新启动操作系统使用 NVIDIA 驱动程序加载内核

    创建环境使用您最喜欢的经理(conda、venv 等)

    conda create -n stack-overflow pytorch torchvision
    conda activate stack-overflow
    

    或将pytorch和torchvision重新安装到现有的:

    conda activate stack-overflow
    conda install --force-reinstall pytorch torchvision
    

    否则可能无法正确检测到 NVIDIA CUDA C/C++ 绑定。

    最后确保正确检测到CUDA:

    (stack-overflow)$ python3 -c 'import torch; print(torch.cuda.is_available())'
    True
    

    版本

    【讨论】:

      猜你喜欢
      • 2019-04-05
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 2020-02-09
      • 2021-04-02
      • 2021-12-16
      • 2022-10-15
      • 2022-01-04
      相关资源
      最近更新 更多