• PyTorch中的CPU和GPU代码实现详解


    PyTorch中的CPU和GPU代码实现详解

    在深度学习的开发过程中,计算资源的高效利用是至关重要的。PyTorch作为一种流行的深度学习框架,支持使用CPUGPU进行模型训练和推理。相较于CPU,GPU由于其强大的并行计算能力,能够显著加速深度学习任务。然而,将PyTorch代码从CPU版本迁移到GPU版本需要进行一些额外的代码修改。本文将详细介绍如何在PyTorch中编写支持CPU和GPU的代码,以及需要特别注意的事项。

    1. 安装PyTorch

    首先,确保你已经安装了支持GPU的PyTorch版本。如果还没有安装,可以参考以下命令进行安装:

    # For CUDA 11.1
    pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu111
    

    2. 编写支持CPU和GPU的PyTorch代码

    2.1 模型定义

    定义模型的代码在CPU和GPU版本中基本一致。但是,我们需要确保模型可以在GPU上运行。

    import torch
    import torch.nn as nn
    import torch.optim as optim
    
    class SimpleNN(nn.Module):
        def __init__(self):
            super(SimpleNN, self).__init__()
            self.fc = nn.Linear(784, 10)
    
        def forward(self, x):
            return self.fc(x)
    
    model = SimpleNN()
    

    2.2 数据加载

    数据加载部分对于CPU和GPU是相同的。使用DataLoader类加载数据:

    from torchvision import datasets, transforms
    
    transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
    
    trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
    trainloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True)
    

    2.3 将模型和数据移动到GPU

    在PyTorch中,模型和数据需要显式地移动到GPU上。使用.to(device)方法将模型和数据移动到指定设备(CPU或GPU)上。

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    
    model.to(device)
    

    2.4 训练循环

    在训练循环中,我们需要确保输入数据和标签也被移动到GPU上。

    criterion = nn.CrossEntropyLoss()
    optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
    
    for epoch in range(5):
        running_loss = 0.0
        for inputs, labels in trainloader:
            inputs, labels = inputs.to(device), labels.to(device)
    
            optimizer.zero_grad()
    
            outputs = model(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
    
            running_loss += loss.item()
        print(f"Epoch {epoch+1}, Loss: {running_loss/len(trainloader)}")
    

    3. 关键步骤详解

    3.1 定义设备

    使用torch.device定义设备,根据当前环境选择使用CPU或GPU。

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    

    3.2 模型和数据移动到GPU

    将模型和数据显式地移动到GPU上。这一步是关键,没有这一步,模型和数据仍然会在CPU上进行计算。

    model.to(device)
    inputs, labels = inputs.to(device), labels.to(device)
    

    3.3 优化器和损失函数

    优化器和损失函数在CPU和GPU版本中不需要特殊处理,它们会自动适应模型所在的设备。

    4. 完整代码示例

    以下是完整的代码示例,包括从数据加载到训练循环的所有步骤。

    import torch
    import torch.nn as nn
    import torch.optim as optim
    from torchvision import datasets, transforms
    
    # 定义设备
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    
    # 定义模型
    class SimpleNN(nn.Module):
        def __init__(self):
            super(SimpleNN, self).__init__()
            self.fc = nn.Linear(784, 10)
    
        def forward(self, x):
            return self.fc(x)
    
    model = SimpleNN().to(device)
    
    # 数据加载
    transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
    trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
    trainloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True)
    
    # 定义损失函数和优化器
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
    
    # 训练循环
    for epoch in range(5):
        running_loss = 0.0
        for inputs, labels in trainloader:
            inputs, labels = inputs.to(device), labels.to(device)
    
            optimizer.zero_grad()
    
            outputs = model(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
    
            running_loss += loss.item()
        print(f"Epoch {epoch+1}, Loss: {running_loss/len(trainloader)}")
    

    5. 结论

    通过本文的详细讲解,我们了解了如何在PyTorch中编写支持CPU和GPU的代码。重点在于将模型和数据显式地移动到GPU上,并确保训练循环中的每一步都在正确的设备上进行计算。掌握这些技巧后,你可以充分利用GPU的强大计算能力,加速深度学习模型的训练和推理过程。

  • 相关阅读:
    Python量化投资——投资组合的评价和可视化(下):使用Matplotlib生成专业的投资回测数据可视化仪表盘【源码+详解】
    Python导出word文档
    el -table 多层级嵌套
    30张图 讲清楚Redis Cluster
    自动化测试数据生成:Asp.Net Core单元测试利器AutoFixture详解
    Android入门第17天-Android里的ProgressBar的使用
    Netty面试经典问题
    Outlook:总是提示输入用户密码
    VirtualBox启动问题记录
    分享8款人声分离的软件,总有一款你喜欢的
  • 原文地址:https://blog.csdn.net/qlkaicx/article/details/140363142