PyTorch模型训练性能基准测试
在实际项目中,了解模型训练性能至关重要。本文将通过具体示例展示如何进行PyTorch模型的性能基准测试。
测试环境配置
import torch
import torch.nn as nn
import time
from torch.utils.data import DataLoader, TensorDataset
# 设置设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f'使用设备: {device}')
模型构建与测试数据准备
# 构建测试模型
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(3, 32, 3, padding=1)
self.conv2 = nn.Conv2d(32, 64, 3, padding=1)
self.pool = nn.MaxPool2d(2, 2)
self.fc1 = nn.Linear(64 * 8 * 8, 512)
self.fc2 = nn.Linear(512, 10)
self.relu = nn.ReLU()
def forward(self, x):
x = self.pool(self.relu(self.conv1(x)))
x = self.pool(self.relu(self.conv2(x)))
x = x.view(-1, 64 * 8 * 8)
x = self.relu(self.fc1(x))
x = self.fc2(x)
return x
# 准备测试数据
batch_size = 64
input_tensor = torch.randn(batch_size, 3, 32, 32)
label_tensor = torch.randint(0, 10, (batch_size,))
# 创建DataLoader
dataset = TensorDataset(input_tensor, label_tensor)
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
性能测试函数
# 训练循环性能测试
model = SimpleCNN().to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()
# 预热
for i, (inputs, labels) in enumerate(dataloader):
if i >= 2: break
inputs, labels = inputs.to(device), labels.to(device)
outputs = model(inputs)
loss = criterion(outputs, labels)
# 实际测试
start_time = time.time()
epoch_times = []
for epoch in range(5): # 测试5个epoch
epoch_start = time.time()
for inputs, labels in dataloader:
inputs, labels = inputs.to(device), labels.to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
epoch_time = time.time() - epoch_start
epoch_times.append(epoch_time)
print(f'Epoch {epoch+1} 耗时: {epoch_time:.2f}s')
avg_time = sum(epoch_times) / len(epoch_times)
total_time = time.time() - start_time
print(f'平均每个epoch耗时: {avg_time:.2f}s')
print(f'总测试时间: {total_time:.2f}s')
测试结果示例(RTX 3080)
- 平均epoch耗时: 1.25s
- 总测试时间: 6.25s
此基准测试可用于不同配置下的性能对比,为模型优化提供量化依据。

讨论