rebuild
This commit is contained in:
142
model/benchmark.py
Normal file
142
model/benchmark.py
Normal file
@ -0,0 +1,142 @@
|
||||
import torch
|
||||
import torch.nn as nn
|
||||
import time
|
||||
import numpy as np
|
||||
from resnet_attention import resnet18_cbam, resnet34_cbam, resnet50_cbam
|
||||
|
||||
# 设置随机种子以确保结果可复现
|
||||
torch.manual_seed(42)
|
||||
np.random.seed(42)
|
||||
|
||||
# 设备配置
|
||||
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
|
||||
print(f"测试设备: {device}")
|
||||
|
||||
# 测试参数
|
||||
batch_sizes = [1, 4, 8, 16]
|
||||
image_sizes = [224, 384, 512]
|
||||
num_runs = 100 # 每个配置运行的次数
|
||||
warmup_runs = 20 # 预热运行次数,排除启动开销
|
||||
|
||||
# 模型配置
|
||||
model_configs = {
|
||||
"resnet18": {
|
||||
"base_model": lambda: resnet18_cbam(use_cbam=False),
|
||||
"attention_model": lambda: resnet18_cbam(use_cbam=True)
|
||||
},
|
||||
"resnet34": {
|
||||
"base_model": lambda: resnet34_cbam(use_cbam=False),
|
||||
"attention_model": lambda: resnet34_cbam(use_cbam=True)
|
||||
},
|
||||
"resnet50": {
|
||||
"base_model": lambda: resnet50_cbam(use_cbam=False),
|
||||
"attention_model": lambda: resnet50_cbam(use_cbam=True)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# 基准测试函数
|
||||
def benchmark_model(model, input_size, batch_size, num_runs, warmup_runs):
|
||||
"""
|
||||
测试模型的推理性能
|
||||
|
||||
参数:
|
||||
- model: 待测试的模型
|
||||
- input_size: 输入图像尺寸
|
||||
- batch_size: 批次大小
|
||||
- num_runs: 测试运行次数
|
||||
- warmup_runs: 预热运行次数
|
||||
|
||||
返回:
|
||||
- 平均推理时间(毫秒)
|
||||
- 吞吐量(样本/秒)
|
||||
"""
|
||||
# 设置为评估模式
|
||||
model.eval()
|
||||
model.to(device)
|
||||
|
||||
# 创建随机输入
|
||||
input_tensor = torch.randn(batch_size, 3, input_size, input_size, device=device)
|
||||
|
||||
# 预热
|
||||
with torch.no_grad():
|
||||
for _ in range(warmup_runs):
|
||||
_ = model(input_tensor)
|
||||
if device.type == 'cuda':
|
||||
torch.cuda.synchronize() # 同步GPU操作
|
||||
|
||||
# 测量推理时间
|
||||
start_time = time.time()
|
||||
with torch.no_grad():
|
||||
for _ in range(num_runs):
|
||||
_ = model(input_tensor)
|
||||
if device.type == 'cuda':
|
||||
torch.cuda.synchronize() # 同步GPU操作
|
||||
end_time = time.time()
|
||||
|
||||
# 计算指标
|
||||
total_time = end_time - start_time
|
||||
avg_time_per_batch = total_time / num_runs * 1000 # 毫秒
|
||||
throughput = batch_size * num_runs / total_time # 样本/秒
|
||||
|
||||
return avg_time_per_batch, throughput
|
||||
|
||||
|
||||
# 运行测试
|
||||
results = {}
|
||||
|
||||
for model_name, config in model_configs.items():
|
||||
results[model_name] = {}
|
||||
|
||||
# 创建模型
|
||||
base_model = config["base_model"]()
|
||||
attention_model = config["attention_model"]()
|
||||
|
||||
# 计算参数量
|
||||
base_params = sum(p.numel() for p in base_model.parameters() if p.requires_grad)
|
||||
attention_params = sum(p.numel() for p in attention_model.parameters() if p.requires_grad)
|
||||
param_increase = (attention_params - base_params) / base_params * 100
|
||||
|
||||
print(f"\n测试模型: {model_name}")
|
||||
print(f" 基础参数量: {base_params / 1e6:.2f}M")
|
||||
print(f" 带注意力参数量: {attention_params / 1e6:.2f}M")
|
||||
print(f" 参数量增加: {param_increase:.2f}%")
|
||||
|
||||
for batch_size in batch_sizes:
|
||||
for image_size in image_sizes:
|
||||
key = f"batch_{batch_size}_size_{image_size}"
|
||||
results[model_name][key] = {}
|
||||
|
||||
# 测试基础模型
|
||||
base_time, base_throughput = benchmark_model(
|
||||
base_model, image_size, batch_size, num_runs, warmup_runs
|
||||
)
|
||||
|
||||
# 测试注意力模型
|
||||
attention_time, attention_throughput = benchmark_model(
|
||||
attention_model, image_size, batch_size, num_runs, warmup_runs
|
||||
)
|
||||
|
||||
# 计算增加的百分比
|
||||
time_increase = (attention_time - base_time) / base_time * 100
|
||||
throughput_decrease = (base_throughput - attention_throughput) / base_throughput * 100
|
||||
|
||||
results[model_name][key]["base_time"] = base_time
|
||||
results[model_name][key]["attention_time"] = attention_time
|
||||
results[model_name][key]["time_increase"] = time_increase
|
||||
results[model_name][key]["base_throughput"] = base_throughput
|
||||
results[model_name][key]["attention_throughput"] = attention_throughput
|
||||
results[model_name][key]["throughput_decrease"] = throughput_decrease
|
||||
|
||||
print(f" 配置: 批次大小={batch_size}, 图像尺寸={image_size}x{image_size}")
|
||||
print(f" 基础模型: 平均时间={base_time:.2f}ms, 吞吐量={base_throughput:.2f}样本/秒")
|
||||
print(f" 注意力模型: 平均时间={attention_time:.2f}ms, 吞吐量={attention_throughput:.2f}样本/秒")
|
||||
print(f" 时间增加: {time_increase:.2f}%, 吞吐量下降: {throughput_decrease:.2f}%")
|
||||
|
||||
# 保存结果
|
||||
import json
|
||||
|
||||
with open('benchmark_results.json', 'w') as f:
|
||||
json.dump(results, f, indent=2)
|
||||
|
||||
print("\n测试完成,结果已保存到 benchmark_results.json")
|
Reference in New Issue
Block a user