DAY34 GPU 训练与类的 call 方法

1. CPU 性能查看
  • 核心指标
    • 架构代际:如 Intel 13 代 / 14 代、AMD Zen 3/Zen 4,代际越新通常能效比越高。
    • 核心数 / 线程数:核心数决定并行计算能力,线程数(超线程技术)可提升多任务处理效率。
  • 查看方式
    • Windows:任务管理器 → 性能 → CPU;或使用 wmic cpu get caption,deviceid,maxclockspeed,currentclockspeed,numberofcores,numberoflogicalprocessors 命令。
    • Linux:lscpucat /proc/cpuinfo

2. GPU 性能查看
  • 核心指标
    • 显存:决定可加载的模型与数据规模,单位为 GB(如 8GB/24GB)。
    • 级别:消费级(RTX 4090)、专业级(RTX A6000)、数据中心级(A100/H100)。
    • 架构代际:如 NVIDIA Ampere(30 系)、Ada Lovelace(40 系)、Hopper(H100),代际更新会带来算力与能效提升。
  • 查看方式
    • NVIDIA GPU:nvidia-smi 命令(Linux/Windows),可查看显存占用、温度、功耗等。
    • 图形界面:NVIDIA Control Panel 或 GPU-Z。

3. GPU 训练方法
  • 核心逻辑:将模型与数据移动到 GPU 设备上进行加速计算。

PyTorch 示例

python 复制代码
import torch
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 模型移动到GPU
model = Model().to(device)
# 数据移动到GPU
inputs = inputs.to(device)
labels = labels.to(device)
  • 关键注意:模型与数据必须在同一设备(CPU/GPU)上,否则会报错。

4. 类的 call 方法与前向传播
  • 原理 :在 PyTorch 中,nn.Module 类实现了 __call__ 方法,该方法会自动调用 forward() 函数。

  • 代码表现

    python 复制代码
    class Net(nn.Module):
        def __init__(self):
            super().__init__()
            self.fc1 = nn.Linear(10, 5)
        def forward(self, x):
            # 等价于 self.fc1.__call__(x)
            x = self.fc1(x)
            return x
  • 原因self.fc1nn.Linear 实例,继承自 nn.Module,因此可像函数一样直接调用 self.fc1(x),底层会执行其 forward 逻辑。


💡 实用技巧

训练过程中,可在命令行输入 nvidia-smi 实时查看显存占用、GPU 利用率等信息,帮助排查显存不足或性能瓶颈问题。

python 复制代码
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
import numpy as np

# ===================== 1. 设备配置(自动使用GPU,没有则用CPU)=====================
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"使用设备: {device}")
# 查看GPU信息(如果有)
if torch.cuda.is_available():
    print(f"GPU名称: {torch.cuda.get_device_name(0)}")
    print(f"可用显存: {torch.cuda.get_device_properties(0).total_memory / 1024**3:.1f} GB")

# ===================== 2. 构建简易数据集(仅演示,替换成你的数据)=====================
# 生成随机数据:1000个样本,输入维度20,输出分类10类
x = torch.randn(1000, 20)
y = torch.randint(0, 10, (1000,))
dataset = TensorDataset(x, y)
# 数据加载器
train_loader = DataLoader(dataset, batch_size=32, shuffle=True)

# ===================== 3. 定义模型 =====================
class SimpleNet(nn.Module):
    def __init__(self, input_dim=20, hidden_dim=64, num_classes=10):
        super(SimpleNet, self).__init__()
        self.fc1 = nn.Linear(input_dim, hidden_dim)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(hidden_dim, num_classes)

    # 前向传播(__call__会自动调用这个方法)
    def forward(self, x):
        x = self.fc1(x)
        x = self.relu(x)
        x = self.fc2(x)
        return x

# 初始化模型 + 迁移到GPU/CPU
model = SimpleNet().to(device)

# ===================== 4. 损失函数 + 优化器 =====================
criterion = nn.CrossEntropyLoss()  # 分类任务
optimizer = optim.Adam(model.parameters(), lr=0.001)

# ===================== 5. 训练循环 =====================
def train_epoch(model, loader, criterion, optimizer, device):
    model.train()  # 训练模式
    total_loss = 0.0
    correct = 0
    total = 0

    for inputs, labels in loader:
        # 【关键】数据迁移到设备
        inputs = inputs.to(device)
        labels = labels.to(device)

        # 前向传播
        outputs = model(inputs)
        loss = criterion(outputs, labels)

        # 反向传播 + 优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        # 统计
        total_loss += loss.item()
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

    avg_loss = total_loss / len(loader)
    acc = 100 * correct / total
    return avg_loss, acc

# ===================== 6. 开始训练 =====================
epochs = 10
best_acc = 0.0

for epoch in range(epochs):
    train_loss, train_acc = train_epoch(model, train_loader, criterion, optimizer, device)
    
    # 打印日志
    print(f"Epoch [{epoch+1}/{epochs}] | Loss: {train_loss:.4f} | Acc: {train_acc:.2f}%")

    # 保存准确率最高的模型
    if train_acc > best_acc:
        best_acc = train_acc
        torch.save(model.state_dict(), "best_model.pth")
        print(f"✅ 已保存最优模型,最佳准确率: {best_acc:.2f}%")

print("\n训练完成!")
print(f"最终最佳准确率: {best_acc:.2f}%")

核心 GPU 使用要点(必看)

  1. 统一设备 模型 (model.to(device)) + 数据 (inputs.to(device)) 必须在同一设备,否则报错。
  2. 无需手动改代码有 GPU 自动用 GPU,没有自动用 CPU,跨平台通用。
  3. 查看 GPU 状态 命令行输入:nvidia-smi,实时看显存、利用率。
如何替换成你的任务
  1. 数据集替换成你的图片 / 文本数据;
  2. 模型替换成你的网络结构;
  3. 调整batch_sizelrepochs超参数即可。
总结
  • 模板自动适配 GPU/CPU,零修改直接运行;
  • 核心就两步:模型.to (device)、数据.to (device);
  • 包含训练、统计、保存最优模型全套功能,直接用于项目。

@浙大疏锦行

相关推荐
用户83562907805119 小时前
Python 操作 PDF 附件:添加、查看与管理指南
后端·python
宇宙之一粟1 天前
乐企版式文件生成平台
java·后端·python
学测绘的小杨2 天前
CompassFusion:一个从 GNSS 到 GNSS/INS 组合导航的独立工程包
python
zzzzzz3102 天前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
雪隐2 天前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python
兵慌码乱3 天前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot3 天前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海3 天前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱3 天前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽3 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict