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);
  • 包含训练、统计、保存最优模型全套功能,直接用于项目。

@浙大疏锦行

相关推荐
2501_945423541 小时前
C++跨平台开发实战
开发语言·c++·算法
英俊潇洒美少年1 小时前
函数组件(Hooks)的 **10 大优点**
开发语言·javascript·react.js
Oueii1 小时前
分布式系统监控工具
开发语言·c++·算法
小陈工2 小时前
2026年3月24日技术资讯洞察:边缘AI商业化,Java26正式发布与开源大模型成本革命
java·运维·开发语言·人工智能·python·容器·开源
qq_416018722 小时前
Python多线程与多进程:如何选择?(GIL全局解释器锁详解)
jvm·数据库·python
m0_662577972 小时前
用Python生成艺术:分形与算法绘图
jvm·数据库·python
方安乐2 小时前
Javascript工具库:classnames
开发语言·javascript·ecmascript
xushichao19892 小时前
C++中的中介者模式
开发语言·c++·算法
Hello.Reader2 小时前
从零开始安装 Qt完整新手教程(1)
开发语言·qt