pytorch-directml 用yolov5 检测 提示invalid cuda

因为电脑是A卡,所以想用pytorch directml来跑yolov5
以前用笔记本来实验(笔记本是N卡 但是pytorch版本没装CUDA 而是按照pytorch directml的要求装的CPU版本然后装direcml插件,微软教程https://learn.microsoft.com/en-us/windows/ai/directml/gpu-pytorch-windows

到最后一步都是成功的

import torch
tensor1 = torch.tensor([1]).to(dml)
tensor2 = torch.tensor([2]).to(dml)
dml_algebra = tensor1 + tensor2
dml_algebra.item()
3

能成功输出3

但是用yolov5 检测
python detect.py --source ./data/images/bus.jpg --weights yolov5s.pt --device dml
就会报错
不加--device dml 的话用cpu检测就能成功

img

为什么还要cuda? pytorch-directml不是a卡也能用吗

a卡按理来说用没啥问题,但是你源码改了没有?yolov5的device本身并没有dml的选项吧

img


除了这里之外,你其他地方对于device参数都要修改,特别是torch.device(),torch.load()中的map_location参数(我不知道你直接设置为dml是否可以)。而且里面很多都是直接判断的是否为cpu,不为cpu就是cuda的代码,你也得修改为你的dml。
所以要么你找一个别人专门用directml写的yolov5,要么自己去修改里面涉及到的所有device的设置。

根据错误提示,`select_device()` 函数在检测到你请求一个无效的 CUDA 设备 `--device dml` 时触发了断言错误。这表明目前 pytorch-directml 可能不能够在不使用 CUDA 的情况下工作,或者你需要选择正确的设备参数才能工作。

根据 YOLOv5 的文档,如果不指定 `--device` 参数,则默认使用 `--device cpu`。这可能是为什么在不加 `--device dml` 的情况下检测运行成功的原因。

为了解决问题,你可以尝试以下几步:

1. 尝试按照 https://learn.microsoft.com/en-us/windows/ai/directml/gpu-pytorch-windows 的要求:为了使用 PyTorch-DirectML,确保你的 PyTorch 版本未安装 CUDA,并按照 DirectML 插件的指导安装 PyTorch-DirectML,并确保 DirectML 可以正常工作,可以尝试运行其他示例程序。

2. 确认你是否选择了正确的设备。目前,PyTorch 和 PyTorch-DirectML 支持以下设备:

   * "cpu"
   * "cuda"
   * "cuda:X"(X 代表设备号)

  请确保你的设备参数与上述设备参数中的一个匹配。在你的情况下,如果你希望使用 PyTorch-DirectML,在指定 `--device` 参数时应该使用 `--device dml`,而不是使用 `--device cuda`。

3. 如果问题仍然存在,你可以尝试在使用 PyTorch-DirectML 运行 YOLOv5 显式地处理第一张图片之前,显式地初始化 DirectML 设备。具体来说,你可以在 `detect.py` 中的 `main()` 函数的第一行添加以下代码:`torch.backends.directml.enable_directml()`

希望这能够帮助你解决问题!

pytorch-directml的作用就是可以使用A卡,所以肯定是可以使用的,但是需要做一些代码的修改,比如你需要在devices.py中,添加如下字段


if get_optimal_device_name() == "dml"

    import torch_directml

    return torch_directml.device()

让它能够返回A卡的设备名称,不然默认就是加载N卡的一些东西,除此之外可能还需要其它的一些修改,建议你你再找下官方文档和资料看看

可能是由于DirectML并不支持所有的PyTorch操作而引起的,建议使用具有CUDA支持的PyTorch版本来运行YOLOv5,并查看它是否可以正常工作。


在使用yolov5训练时,提示这个错误,查看torch.cuda.is_available()得到的返回值是false

查看nvidia-smi可以看到信息

由于之前使用conda安装的torch1.9.0

这里使用pip重新安装:

pip3 install torch == 1.9.0+cu111 torchvision == 0.10.0+cu111 torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html


应该就好了

源于chatgpt仅供参考


`invalid cuda` 错误通常表示 PyTorch 无法找到 CUDA 库。这可能是因为您的计算机上没有安装 CUDA,或者 PyTorch 的版本与 CUDA 的版本不兼容。

提示中提到了 `pytorch-directml`,这意味着您在使用 PyTorch-DirectML,在 Windows 上运行 PyTorch 模型,而非使用 Nvidia GPU 的 CUDA。因此,如果您使用的是 DirectML,则应该避免 CUDA 相关错误。

以下是一些可能的解决方案:

1. 确保您已经正确地安装和配置了 PyTorch-DirectML。请检查您是否已经按照官方文档中的说明进行设置,并且您正在运行最新版本的 PyTorch-DirectML。

2. 确认您的计算机满足运行 PyTorch-DirectML 所需的系统要求。特别是,确保您的操作系统版本、CPU 和 GPU 支持 PyTorch-DirectML。

3. 如果您仍然有问题,请尝试卸载并重新安装 PyTorch-DirectML。也许安装过程中出现了错误,导致库文件无法正确加载。

4. 您可以在代码中添加以下语句来手动指定 CPU 运行模式,以帮助您避免 CUDA 相关错误:

```python
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'

这将禁用 CUDA 并强制 PyTorch 在 CPU 上运行。注意,这可能会导致模型的运行速度变慢。

如果您仍然无法解决问题,请提供更多详细信息,以便我们能够帮助您找到更好的解决方案。

```

回答部分参考、引用ChatGpt以便为您提供更准确的答案:

根据您提供的信息,您在使用pytorch directml运行yolov5时遇到了问题。您在笔记本电脑上安装了pytorch的CPU版本和directml插件,并且通过将--device dml参数传递给yolov5的检测脚本来指定使用directml进行推理。但是,当您运行检测脚本时,遇到了错误。

首先,让我们回答您的问题:"为什么还要cuda?pytorch-directml不是a卡也能用吗?"

PyTorch-DirectML是一个针对Windows的PyTorch后端,它利用了DirectML API来在支持DirectX的GPU上执行计算。虽然PyTorch-DirectML可以在非NVIDIA GPU(例如AMD或Intel)上运行,但在某些情况下,使用CUDA进行计算可能仍然是更好的选择。

原因有两个:

  1. YOLOv5是使用CUDA进行加速的,因此使用CUDA可以获得更好的性能。CUDA是NVIDIA提供的并行计算平台,适用于NVIDIA GPU。虽然PyTorch-DirectML可以在非NVIDIA GPU上运行,但由于YOLOv5是使用CUDA编写的,因此在非NVIDIA GPU上使用PyTorch-DirectML可能会导致性能下降。
  2. 您提到您的笔记本电脑具有"A卡",这可能是指AMD Radeon GPU。当前的PyTorch-DirectML实现主要专注于与NVIDIA GPU配合使用,因此在AMD GPU上使用PyTorch-DirectML可能会遇到兼容性问题或性能限制。

综上所述,虽然PyTorch-DirectML可以在非NVIDIA GPU上运行,但对于YOLOv5这样的使用CUDA进行加速的模型,使用CUDA进行计算可能会更好。

引用chatpt
pytorch-directml 是一个 PyTorch 扩展,它允许在 DirectML(Direct3D GPU)上运行 PyTorch 代码。然而,并非所有的 PyTorch 操作都能直接在 DirectML 上执行。

对于 YOLOv5 这种深度学习模型,它需要大量的计算资源和内存来训练和推理。虽然 pytorch-directml 可以让你使用 A 卡进行加速,但它可能无法满足 YOLOv5 的计算需求。因此,当你尝试使用 --device dml 参数时,可能会遇到错误。

如果你想在 A 卡上运行 YOLOv5,你可以尝试以下方法:

  1. 确保你的 A 卡支持 DirectX 12,并且已经安装了最新的驱动程序。
  2. 更新你的 PyTorch 版本到最新,以确保它与 DirectML 兼容。
  3. 在运行 detect.py 时,不使用 --device dml 参数,让 PyTorch 自动选择最佳设备(CPU 或 GPU)。
python detect.py --source ./data/images/bus.jpg --weights yolov5s.pt