如何在 MacOSX 上使用适用于 YOLOv7 的 M1 芯片解决“断言错误:Torch 未在启用 CUDA 的情况下编译”的问题

问题描述 投票:0回答:2

我正在尝试在配备 M1 芯片的 Macbook 上使用我自己的数据集训练 YOLOv7。我知道 CUDA 可与 NVIDA 配合使用,但不适用于 macOS。我尝试通过重新安装与arm兼容的anaconda3和miniforge3来解决这个问题,但我仍然收到此断言错误。

!python train.py --workers 1 --batch-size 1 --epochs 200 --img 640 640 --data data/custom_data.yaml --hyp data/hyp.scratch.custom.yaml --cfg cfg/training/custom_yolov7.yaml --name yolov7-output --weights yolov7.pt
YOLOR 🚀 v0.1-121-g2fdc7f1 torch 1.13.1 CPU

Namespace(weights='yolov7.pt', cfg='cfg/training/custom_yolov7.yaml', data='data/custom_data.yaml', hyp='data/hyp.scratch.custom.yaml', epochs=200, batch_size=1, img_size=[640, 640], rect=False, resume=False, nosave=False, notest=False, noautoanchor=False, evolve=False, bucket='', cache_images=False, image_weights=False, device='', multi_scale=False, single_cls=False, adam=False, sync_bn=False, local_rank=-1, workers=1, project='runs/train', entity=None, name='yolov7-output', exist_ok=False, quad=False, linear_lr=False, label_smoothing=0.0, upload_dataset=False, bbox_interval=-1, save_period=-1, artifact_alias='latest', freeze=[0], v5_metric=False, world_size=1, global_rank=-1, save_dir='runs/train/yolov7-output11', total_batch_size=1)
tensorboard: Start with 'tensorboard --logdir runs/train', view at http://localhost:6006/
hyperparameters: lr0=0.01, lrf=0.1, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=0.05, cls=0.3, cls_pw=1.0, obj=0.7, obj_pw=1.0, iou_t=0.2, anchor_t=4.0, fl_gamma=0.0, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.2, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, mosaic=1.0, mixup=0.0, copy_paste=0.0, paste_in=0.0, loss_ota=1
wandb: Install Weights & Biases for YOLOR logging with 'pip install wandb' (recommended)

                 from  n    params  module                                  arguments                     
  0                -1  1       928  models.common.Conv                      [3, 32, 3, 1]                 
  1                -1  1     18560  models.common.Conv                      [32, 64, 3, 2]                
  2                -1  1     36992  models.common.Conv                      [64, 64, 3, 1]                
  3                -1  1     73984  models.common.Conv                      [64, 128, 3, 2]               
  4                -1  1      8320  models.common.Conv                      [128, 64, 1, 1]               
  5                -2  1      8320  models.common.Conv                      [128, 64, 1, 1]               
  6                -1  1     36992  models.common.Conv                      [64, 64, 3, 1]                
  7                -1  1     36992  models.common.Conv                      [64, 64, 3, 1]                
  8                -1  1     36992  models.common.Conv                      [64, 64, 3, 1]                
  9                -1  1     36992  models.common.Conv                      [64, 64, 3, 1]                
 10  [-1, -3, -5, -6]  1         0  models.common.Concat                    [1]                           
 11                -1  1     66048  models.common.Conv                      [256, 256, 1, 1]              
 12                -1  1         0  models.common.MP                        []                            
 13                -1  1     33024  models.common.Conv                      [256, 128, 1, 1]              
 14                -3  1     33024  models.common.Conv                      [256, 128, 1, 1]              
 15                -1  1    147712  models.common.Conv                      [128, 128, 3, 2]              
 16          [-1, -3]  1         0  models.common.Concat                    [1]                           
...
    matching_bs[i] = torch.tensor([], device='cuda:0', dtype=torch.int64)
  File "/Users/yeti/opt/anaconda3/envs/yolo/lib/python3.10/site-packages/torch/cuda/__init__.py", line 221, in _lazy_init
    raise AssertionError("Torch not compiled with CUDA enabled")
AssertionError: Torch not compiled with CUDA enabled

模型训练了 30 个 epoch,但随后会抛出此断言错误。你建议我做什么?

python macos torch yolo
2个回答
0
投票

https://github.com/WongKinYiu/yolov7/issues/414

这解决了我的问题

“您好,我现在可以使用 CPU 运行了,我将 loss.py 中的第 786 行到 791 行从 device='cuda:0' 更改为 device='cpu'”


0
投票

我们需要删除所有 cuda 依赖项。这就是解决我的问题的方法:

就上下文而言,我在 MacOS 上使用以下版本的 torch

火炬==2.1.0

  1. 首先,您必须将所有文件中的

    .cuda()
    替换为
    .to(device)
    (您可以使用 IDE 的替换功能 来完成此操作)。

  2. 然后,打开 build.py 并将

    model.to(torch.device(cfg.MODEL.DEVICE))
    更改为
    model.to(torch.device('cpu'))

  3. 通过在您的IDE中搜索进行交叉检查,以确保您已删除所有

    .cuda()
    操作。

结论是,你需要让你的Mac知道它需要使用它的CPU而不是寻找cuda

此时,错误应该已经解决,但如果仍然没有解决,请尝试在终端中手动设置变量 CUDA_VISIBLE_DEVICES 的值:

导出 CUDA_VISIBLE_DEVICES=""

我希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.