Pytorch模型GPU训练

来自 千问

要让 PyTorch 模型在 GPU 上高效运行,并不仅仅是改变设备设置,更是一套涉及环境、代码和最佳实践的组合拳。简单来说,这包括三个核心方面:确保环境支持、正确编写代码、以及应用性能优化技巧。

以下是对如何在 GPU 上进行模型训练和测试的全面总结与示例。

🚀 核心要点:如何确保"尽量在 GPU 上跑"?

  1. 环境是基础

    • 驱动与 CUDA:首先,你的电脑需要安装 NVIDIA 显卡驱动和 CUDA Toolkit。这是 GPU 能够被调用的基础环境。
    • PyTorch 版本 :必须安装支持 CUDA 的 PyTorch 版本。可以通过 torch.cuda.is_available() 来快速验证环境是否配置正确。
  2. 代码是关键

    • 统一设备:模型、输入数据、标签这三者必须都在同一个设备(GPU)上。如果模型在 GPU,而标签在 CPU,程序会立即报错。
    • 不要遗漏:除了模型和输入数据,计算损失函数(Loss Function)时用到的**标签(Labels)**也必须移动到 GPU。
  3. 优化是进阶

    • 混合精度 :使用 torch.cuda.amp 可以让计算在 float16 半精度下进行,这能显著减少显存占用,并提升计算速度。
    • 数据加载 :在 DataLoader 中设置 pin_memory=True,可以加速数据从 CPU 内存传输到 GPU 显存的过程。

💻 完整示例代码

这是一个基于 CIFAR-10 数据集的完整训练与测试流程示例,包含了上述所有最佳实践。

python 复制代码
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

# 1. 设置设备
# 自动选择可用的 GPU,如果没有则回退到 CPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"🚀 正在使用设备: {device}")

# 2. 数据准备
# 定义图像预处理流程
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) # 标准化到 [-1, 1]
])

# 加载 CIFAR-10 数据集
train_set = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
test_set = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)

# 创建数据加载器
# pin_memory=True 可以加速 GPU 的数据传输
train_loader = DataLoader(train_set, batch_size=128, shuffle=True, num_workers=2, pin_memory=True)
test_loader = DataLoader(test_set, batch_size=128, shuffle=False, num_workers=2, pin_memory=True)

# 3. 定义模型
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 32, 3, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 3, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2),
        )
        self.classifier = nn.Sequential(
            nn.Flatten(),
            nn.Linear(64 * 8 * 8, 512),
            nn.ReLU(),
            nn.Linear(512, 10)
        )

    def forward(self, x):
        x = self.features(x)
        x = self.classifier(x)
        return x

# 实例化模型并移动到 GPU
model = SimpleCNN().to(device)

# 4. 配置优化器与损失函数
criterion = nn.CrossEntropyLoss() # 损失函数
optimizer = optim.Adam(model.parameters(), lr=0.001) # 优化器

# 5. (关键) 混合精度训练配置
# 这是提升 GPU 训练速度和减少显存占用的关键技术
scaler = torch.cuda.amp.GradScaler(enabled=(device.type == 'cuda'))

# 6. 训练与测试函数
def train(epoch):
    model.train() # 切换到训练模式
    for batch_idx, (data, target) in enumerate(train_loader):
        # 🔥 核心操作:将数据和标签移动到 GPU
        # non_blocking=True 允许异步数据传输,进一步提升效率
        data, target = data.to(device, non_blocking=True), target.to(device, non_blocking=True)

        optimizer.zero_grad()

        # 使用混合精度上下文管理器
        with torch.cuda.amp.autocast(enabled=(device.type == 'cuda')):
            output = model(data)
            loss = criterion(output, target)

        # 反向传播 (使用缩放器处理梯度)
        scaler.scale(loss).backward()
        scaler.step(optimizer)
        scaler.update()

        if batch_idx % 100 == 0:
            print(f"Train Epoch: {epoch} [{batch_idx}/{len(train_loader)}] Loss: {loss.item():.6f}")

def test():
    model.eval() # 切换到评估模式
    correct = 0
    total = 0
    with torch.no_grad(): # 测试时不需要计算梯度
        for data, target in test_loader:
            # 🔥 核心操作:将测试数据和标签也移动到 GPU
            data, target = data.to(device, non_blocking=True), target.to(device, non_blocking=True)
            output = model(data)
            _, predicted = output.max(1)
            total += target.size(0)
            correct += predicted.eq(target).sum().item()

    print(f"Test Accuracy: {100.*correct/total:.2f}%")

# 7. 开始训练
if __name__ == '__main__':
    for epoch in range(1, 6): # 训练 5 个 epoch
        train(epoch)
        test()

    # 8. 保存模型 (推荐只保存模型参数)
    torch.save(model.state_dict(), "cifar10_model.pth")
    print("模型训练完成并已保存!")

📌 总结

通过上述代码,你实现了一个完整的、针对 GPU 优化的训练流程。关键点在于:

  1. 环境验证 :确保 torch.cuda.is_available() 返回 True
  2. 设备一致性:模型、数据、标签三者缺一不可,必须同在 GPU 上。
  3. 性能优化 :利用 pin_memorynon_blockingamp (混合精度) 等技术,让 GPU 的计算能力得到最大程度的发挥,避免数据传输成为瓶颈。
相关推荐
初恋叫萱萱1 小时前
深入解析 Rust + LLM 开发:手把手教你写一个 AI 运维助手
运维·人工智能·rust
AI大模型..2 小时前
Dify 本地部署安装教程(Windows + Docker),大模型入门到精通,收藏这篇就足够了!
人工智能·程序员·开源·llm·github·deepseek·本地化部署
小陈phd4 小时前
多模态大模型学习笔记(七)——多模态数据的表征与对齐
人工智能·算法·机器学习
摆烂小白敲代码4 小时前
腾讯云智能结构化OCR在物流行业的应用
大数据·人工智能·经验分享·ocr·腾讯云
CoderJia程序员甲5 小时前
GitHub 热榜项目 - 日榜(2026-02-24)
人工智能·ai·大模型·github·ai教程
nimadan125 小时前
**AI漫剧软件2025推荐,解锁高性价比创意制作新体验**
人工智能·python
前网易架构师-高司机5 小时前
带标注的安全带和车牌识别数据集,识别率在88.8%,可识别挡风玻璃,是否系安全带,车牌区域,支持yolo,coco json,pascal voc xml格式
人工智能·数据集·交通违法·违法拍摄·安全带
Bal炎魔5 小时前
AI 学习专题一,AI 实现的原理
人工智能·学习
kjmkq5 小时前
办公智能体落地:九科信息让AI深度融入企业日常运营
人工智能
NAGNIP5 小时前
一文搞懂神经元模型是什么!
人工智能·算法