断言错误:Torch未启用CUDA编译。

13

https://pytorch.org/网站获取的信息:

在MacOS上安装PyTorch需要按照以下步骤进行:

conda install pytorch torchvision -c pytorch
# MacOS Binaries dont support CUDA, install from source if CUDA is needed

为什么要安装未启用CUDA的pytorch?
我询问的原因是我收到了错误信息:
--------------------------------------------------------------------------- AssertionError Traceback (most recent call last) in () 78 # predicted = outputs.data.max(1)[1] 79 ---> 80 output = model(torch.tensor([[1,1]]).float().cuda()) 81 predicted = output.data.max(1)[1] 82 ~/anaconda3/lib/python3.6/site-packages/torch/cuda/init.py in _lazy_init() 159 raise RuntimeError( 160 "Cannot re-initialize CUDA in forked subprocess. " + msg) --> 161 _check_driver() 162 torch._C._cuda_init() 163 _cudart = _load_cudart() ~/anaconda3/lib/python3.6/site-packages/torch/cuda/init.py in _check_driver() 73 def _check_driver(): 74 if not hasattr(torch._C, '_cuda_isDriverSufficient'): ---> 75 raise AssertionError("Torch not compiled with CUDA enabled") 76 if not torch._C._cuda_isDriverSufficient(): 77 if torch._C._cuda_getDriverVersion() == 0: AssertionError: Torch not compiled with CUDA enabled
尝试执行代码时出现此错误。
x = torch.tensor([[0,0] , [0,1] , [1,0]]).float()
print(x)

y = torch.tensor([0,1,1]).long()
print(y)

my_train = data_utils.TensorDataset(x, y)
my_train_loader = data_utils.DataLoader(my_train, batch_size=2, shuffle=True)

# Device configuration
device = 'cpu'
print(device)

# Hyper-parameters 
input_size = 2
hidden_size = 100
num_classes = 2


learning_rate = 0.001

train_dataset = my_train

train_loader = my_train_loader

pred = []


for i in range(0 , model_iters) : 
    # Fully connected neural network with one hidden layer
    class NeuralNet(nn.Module):
        def __init__(self, input_size, hidden_size, num_classes):
            super(NeuralNet, self).__init__()
            self.fc1 = nn.Linear(input_size, hidden_size) 
            self.relu = nn.ReLU()
            self.fc2 = nn.Linear(hidden_size, num_classes)  

        def forward(self, x):
            out = self.fc1(x)
            out = self.relu(out)
            out = self.fc2(out)
            return out

    model = NeuralNet(input_size, hidden_size, num_classes).to(device)

    # Loss and optimizer
    criterion = nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)  

    # Train the model
    total_step = len(train_loader)
    for epoch in range(num_epochs):
        for i, (images, labels) in enumerate(train_loader):  
            # Move tensors to the configured device
            images = images.reshape(-1, 2).to(device)
            labels = labels.to(device)

            # Forward pass
            outputs = model(images)
            loss = criterion(outputs, labels)

            # Backward and optimize
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
{:.4f}'.format(epoch+1, num_epochs, i+1, total_step, loss.item()))

    output = model(torch.tensor([[1,1]]).float().cuda())

为了解决这个错误,我需要从源代码安装已经安装了cuda的pytorch吗?

3
为什么要安装未启用CUDA的PyTorch?如果您没有支持CUDA的GPU,可能会需要。您是否使用Mac平台?如果是,您确定已在Mac上安装了支持CUDA的GPU吗?如果您按照您所指示的方式(通过conda)安装,则似乎您的PyTorch未启用CUDA,这与断言错误一致。此外,令人困惑的是,您在PyTorch脚本中指定了device='cpu',但同时又指定了output=model(torch.tensor([[1,1]]).float().cuda()) - Robert Crovella
@RobertCrovella 谢谢Robert。我错误地认为运行pyTorch代码需要CUDA,而且我也没有意识到CUDA不是PyTorch的一部分。为了编写可在CPU和GPU之间交叉兼容的代码,我需要包括/排除.cuda()吗? - blue-sky
3
@blue-sky。移除任何cuda()并使用device来实现这种兼容性。 - Hossein
3
具体来说,您需要使用.to(device)而不是.cuda()。根据'device'的值,GPU可以被使用。通常这样做的方式是:device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') - Bram Vanroy
2个回答

11

总结并扩展以下评论:

  • CUDA是一项Nvidia专有(似乎未经许可)技术,允许GPU处理器上的通用计算。
  • 很少有Macbook Pro拥有Nvidia CUDA-capable GPU。请在这里查看您的MBP是否有Nvidia GPU。 然后,请查看这里的表格,以查看该GPU是否支持CUDA。
  • iMac、iMac Pro和Mac Pro也是同样的情况。
  • 因此,在MacOS上默认情况下安装PyTorch时不支持CUDA。

这个PyTorch github问题提到很少有Mac拥有Nvidia处理器:https://github.com/pytorch/pytorch/issues/30664

如果您的Mac确实具有CUDA-capable GPU,则需要使用正确的命令行选项从源代码重新编译pytorch才能在MacOS上使用CUDA命令。


6
这句话的意思是:“你需要使用正确的命令行选项从源代码重新编译PyTorch。” - Alberto Sinigaglia

0

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