目录

  1. 引言
  2. 主流图像分类模型
  3. 模型架构对比
  4. 精度 - 速度权衡
  5. 不同 GPU 型号性能对比
  6. 选型建议
  7. 实战:模型对比 Benchmark
  8. 总结与建议

引言

在实际 AI 项目中,选择合适的模型往往比优化单个模型更重要。不同的图像分类模型在精度、速度、资源消耗上有显著差异。

图像分类模型性能对比是模型选型的关键依据:

  • ResNet、EfficientNet、ViT 哪个更适合? 取决于应用场景
  • 精度和速度如何权衡? 帕累托最优曲线帮助决策
  • 不同 GPU 上性能差异多大? 架构特性影响显著
  • 如何快速评估多个模型? 标准化 benchmark 流程

这些问题都指向一个核心主题:图像分类模型性能对比

模型选型的重要性

┌─────────────────────────────────────────────────┐
│          模型选型的影响                          │
├─────────────────────────────────────────────────┤
│                                                 │
│  性能影响:                                      │
│  ├── 推理延迟:10ms vs 100ms (10x 差异)         │
│  ├── 吞吐量:100 QPS vs 1000 QPS (10x 差异)     │
│  ├── 显存占用:100MB vs 1GB (10x 差异)          │
│  └── 功耗:10W vs 100W (10x 差异)               │
│                                                 │
│  成本影响:                                      │
│  ├── 服务器数量:1 台 vs 10 台                   │
│  ├── 云服务费用:$1000/月 vs $10000/月          │
│  ├── 开发时间:1 周 vs 1 月                      │
│  └── 维护成本:低 vs 高                         │
│                                                 │
│  业务影响:                                      │
│  ├── 用户体验:流畅 vs 卡顿                    │
│  ├── 准确率:95% vs 99%                        │
│  └── 上市时间:提前 vs 延迟                    │
│                                                 │
└─────────────────────────────────────────────────┘

测试范围

┌─────────────────────────────────────────────────┐
│          本文测试的模型                          │
├─────────────────────────────────────────────────┤
│                                                 │
│  CNN 架构:                                      │
│  ├── ResNet 系列:ResNet18/34/50/101/152       │
│  ├── EfficientNet 系列:B0-B7                  │
│  ├── MobileNet 系列:V2/V3                     │
│  └── DenseNet 系列:121/169/201                │
│                                                 │
│  Transformer 架构:                              │
│  ├── ViT 系列:ViT-B/16, ViT-L/16              │
│  ├── DeiT 系列:DeiT-S/Ti                      │
│  └── Swin Transformer: Tiny/Small/Base         │
│                                                 │
│  混合架构:                                      │
│  ├── ConvNeXt: Tiny/Small/Base/Large           │
│  └── CoAtNet: 0-4                              │
│                                                 │
└─────────────────────────────────────────────────┘

主流图像分类模型

各模型特点分析

ResNet(残差网络)

  • 优势:经典稳定、部署简单、社区支持完善

  • 劣势:相对较老的架构,在效率上不如新模型

  • 适用场景:对延迟敏感的实时分类、传统服务器环境、需要稳定部署的场景

EfficientNet(高效网络)

  • 优势:参数效率极高,在相同计算预算下性能最优

  • 技术特点:采用复合缩放策略(深度、宽度、分辨率协同缩放)

  • 变体系列:B0-B7八个版本,参数量从5.3M到66M

  • 适用场景:移动端/边缘设备、资源受限环境、需要平衡精度与速度的场景

Vision Transformer(ViT)

  • 优势:在大规模数据集上表现优异,擅长捕捉全局依赖关系

  • 技术特点:基于自注意力机制,将图像分割为patch处理

  • 适用场景:高精度需求(如医疗影像分析)、数据充足且计算资源丰富、需要跨任务迁移的通用视觉系统

ResNet 系列

┌────────────────────────────────────────────────────────────────────┐
│                    ResNet 系列模型                                  │
├──────────────┬─────────────┬─────────────┬─────────────┬──────────┤
│   模型        │   参数量     │   FLOPs     │   Top-1     │   特点    │
│              │   (M)       │   (G)       │   Accuracy  │          │
├──────────────┼─────────────┼─────────────┼─────────────┼──────────┤
│ ResNet18     │   11.7      │   1.8       │   69.8%     │   最轻量  │
│ ResNet34     │   21.8      │   3.7       │   73.3%     │   平衡    │
│ ResNet50     │   25.6      │   4.1       │   76.0%     │   经典    │
│ ResNet101    │   44.5      │   7.8       │   77.4%     │   高精度  │
│ ResNet152    │   60.2      │   11.5      │   78.3%     │   最深    │
└──────────────┴─────────────┴─────────────┴─────────────┴──────────┘

特点:
- 残差连接 (Residual Connection) 解决梯度消失
- Bottleneck 设计减少参数量
- 结构简单,易于部署
- 业界最广泛使用的 CNN 架构

EfficientNet 系列

┌────────────────────────────────────────────────────────────────────┐
│                EfficientNet 系列模型                                │
├──────────────┬─────────────┬─────────────┬─────────────┬──────────┤
│   模型        │   参数量     │   FLOPs     │   Top-1     │   特点    │
│              │   (M)       │   (G)       │   Accuracy  │          │
├──────────────┼─────────────┼─────────────┼─────────────┼──────────┤
│ EfficientNet-B0 │   5.3    │   0.39      │   77.1%     │   基准    │
│ EfficientNet-B1 │   7.8    │   0.7       │   79.1%     │           │
│ EfficientNet-B2 │   9.2    │   1.0       │   79.8%     │           │
│ EfficientNet-B3 │   12     │   1.8       │   81.6%     │           │
│ EfficientNet-B4 │   19     │   4.2       │   82.9%     │           │
│ EfficientNet-B5 │   30     │   10.0      │   83.6%     │           │
│ EfficientNet-B6 │   43     │   19.0      │   84.0%     │           │
│ EfficientNet-B7 │   66     │   37.0      │   84.4%     │   最大    │
└──────────────┴─────────────┴─────────────┴─────────────┴──────────┘

特点:
- 复合缩放 (Compound Scaling) 统一调整深度/宽度/分辨率
- MBConv 模块:深度可分离卷积 + 注意力
- 同等精度下参数量最少
- 训练时间较长

Vision Transformer (ViT)

┌────────────────────────────────────────────────────────────────────┐
│                Vision Transformer 系列                              │
├──────────────┬─────────────┬─────────────┬─────────────┬──────────┤
│   模型        │   参数量     │   FLOPs     │   Top-1     │   特点    │
│              │   (M)       │   (G)       │   Accuracy  │          │
├──────────────┼─────────────┼─────────────┼─────────────┼──────────┤
│ ViT-Ti/16    │   5.7       │   1.2       │   72.2%     │   最小    │
│ ViT-S/16     │   22        │   4.6       │   79.8%     │           │
│ ViT-B/16     │   86        │   17.6      │   81.8%     │   标准    │
│ ViT-L/16     │   307       │   61.6      │   82.9%     │   大      │
│ ViT-H/16     │   632       │   126.0     │   83.4%     │   最大    │
└──────────────┴─────────────┴─────────────┴─────────────┴──────────┘

特点:
- 纯 Transformer 架构,无卷积
- Patch Embedding 将图像分块
- 自注意力机制捕捉全局关系
- 需要大规模预训练
- 推理速度较慢 (尤其小 batch)

Swin Transformer

┌────────────────────────────────────────────────────────────────────┐
│                Swin Transformer 系列                                │
├──────────────┬─────────────┬─────────────┬─────────────┬──────────┤
│   模型        │   参数量     │   FLOPs     │   Top-1     │   特点    │
│              │   (M)       │   (G)       │   Accuracy  │          │
├──────────────┼─────────────┼─────────────┼─────────────┼──────────┤
│ Swin-Tiny    │   29        │   4.5       │   81.3%     │   轻量    │
│ Swin-Small   │   50        │   8.7       │   83.0%     │           │
│ Swin-Base    │   88        │   15.4      │   83.5%     │   标准    │
│ Swin-Large   │   197       │   34.5      │   84.3%     │   大      │
└──────────────┴─────────────┴─────────────┴─────────────┴──────────┘

特点:
- 层次化 Transformer 架构
- 移位窗口 (Shifted Window) 局部注意力
- 线性计算复杂度 (vs ViT 的平方)
- 适合密集预测任务 (检测/分割)

ConvNeXt

┌────────────────────────────────────────────────────────────────────┐
│                    ConvNeXt 系列                                    │
├──────────────┬─────────────┬─────────────┬─────────────┬──────────┤
│   模型        │   参数量     │   FLOPs     │   Top-1     │   特点    │
│              │   (M)       │   (G)       │   Accuracy  │          │
├──────────────┼─────────────┼─────────────┼─────────────┼──────────┤
│ ConvNeXt-T   │   29        │   4.5       │   82.1%     │   轻量    │
│ ConvNeXt-S   │   50        │   8.7       │   83.1%     │           │
│ ConvNeXt-B   │   89        │   15.4      │   83.8%     │   标准    │
│ ConvNeXt-L   │   198       │   34.4      │   84.3%     │   大      │
└──────────────┴─────────────┴─────────────┴─────────────┴──────────┘

特点:
- "现代化"的 CNN 架构
- 借鉴 Transformer 设计 (大 kernel、LayerNorm 等)
- 纯卷积,推理速度快
- 训练稳定,易于部署

模型架构对比

架构演进

┌─────────────────────────────────────────────────────────────────────┐
│                     图像分类架构演进                                 │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  2015: ResNet                                                       │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  卷积 + 残差连接 → 解决深层网络训练难题                      │   │
│  │  影响:奠定了现代 CNN 基础                                    │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                        ↓                                            │
│  2017: MobileNet / ShuffleNet                                      │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  深度可分离卷积 → 移动端高效推理                            │   │
│  │  影响:开启了轻量级网络研究                                 │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                        ↓                                            │
│  2019: EfficientNet                                                │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  复合缩放 + NAS → 精度效率最优                               │   │
│  │  影响:重新定义效率基准                                     │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                        ↓                                            │
│  2020: Vision Transformer                                          │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  纯 Transformer → 全局注意力                                 │   │
│  │  影响:Transformer 进入视觉领域                              │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                        ↓                                            │
│  2021: Swin Transformer                                            │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  移位窗口 → 层次化特征                                       │   │
│  │  影响:Transformer 适合密集预测                              │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                        ↓                                            │
│  2022: ConvNeXt                                                    │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  CNN 现代化 → 融合两者优势                                    │   │
│  │  影响:CNN 仍然有竞争力                                       │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

架构特性对比

┌────────────────────────────────────────────────────────────────────┐
│                    架构特性对比                                     │
├──────────────┬─────────────┬─────────────┬─────────────┬──────────┤
│   特性        │   CNN        │   ViT        │   Swin      │  ConvNeXt│
│              │  (ResNet)   │             │             │          │
├──────────────┼─────────────┼─────────────┼─────────────┼──────────┤
│  归纳偏置    │   强         │   弱         │   中         │   强     │
│  (局部性)    │  (卷积)     │  (无)        │  (窗口)      │  (卷积)  │
├──────────────┼─────────────┼─────────────┼─────────────┼──────────┤
│  感受野      │   局部→全局  │   全局        │   局部→全局  │  局部    │
│              │  (渐进)     │  (自注意力)  │  (窗口移位)  │  (大 k)  │
├──────────────┼─────────────┼─────────────┼─────────────┼──────────┤
│  计算复杂度  │   O(n)       │   O(n²)      │   O(n)       │  O(n)   │
├──────────────┼─────────────┼─────────────┼─────────────┼──────────┤
│  数据需求    │   中等       │   大         │   大         │  中等    │
├──────────────┼─────────────┼─────────────┼─────────────┼──────────┤
│  训练稳定性  │   好         │   一般       │   好         │  好      │
├──────────────┼─────────────┼─────────────┼─────────────┼──────────┤
│  部署友好    │   优秀       │   一般       │   一般       │  优秀    │
├──────────────┼─────────────┼─────────────┼─────────────┼──────────┤
│  小样本表现  │   好         │   差         │   中         │  好      │
└──────────────┴─────────────┴─────────────┴─────────────┴──────────┘

精度 - 速度权衡

帕累托前沿分析

#!/usr/bin/env python3
# pareto_analysis.py - 精度 - 速度帕累托分析

import matplotlib.pyplot as plt
import numpy as np

# 模型数据 (示例)
models = {
    'ResNet18': {'acc': 69.8, 'latency': 1.2, 'params': 11.7},
    'ResNet34': {'acc': 73.3, 'latency': 1.8, 'params': 21.8},
    'ResNet50': {'acc': 76.0, 'latency': 2.5, 'params': 25.6},
    'ResNet101': {'acc': 77.4, 'latency': 4.2, 'params': 44.5},
    'EfficientNet-B0': {'acc': 77.1, 'latency': 1.5, 'params': 5.3},
    'EfficientNet-B3': {'acc': 81.6, 'latency': 3.8, 'params': 12},
    'EfficientNet-B5': {'acc': 83.6, 'latency': 8.5, 'params': 30},
    'ViT-S/16': {'acc': 79.8, 'latency': 3.2, 'params': 22},
    'ViT-B/16': {'acc': 81.8, 'latency': 6.5, 'params': 86},
    'Swin-Tiny': {'acc': 81.3, 'latency': 2.8, 'params': 29},
    'Swin-Base': {'acc': 83.5, 'latency': 7.2, 'params': 88},
    'ConvNeXt-T': {'acc': 82.1, 'latency': 2.6, 'params': 29},
    'ConvNeXt-B': {'acc': 83.8, 'latency': 6.8, 'params': 89},
}

def plot_pareto_frontier():
    """绘制帕累托前沿"""
    
    fig, ax = plt.subplots(figsize=(12, 8))
    
    # 提取数据
    names = list(models.keys())
    accs = [models[n]['acc'] for n in names]
    latencies = [models[n]['latency'] for n in names]
    params = [models[n]['params'] for n in names]
    
    # 散点图 (大小表示参数量)
    scatter = ax.scatter(latencies, accs, s=np.array(params)*3, 
                        alpha=0.6, c=params, cmap='viridis')
    
    # 标注模型名称
    for i, name in enumerate(names):
        ax.annotate(name, (latencies[i], accs[i]), 
                   xytext=(5, 5), textcoords='offset points',
                   fontsize=8, alpha=0.8)
    
    # 帕累托前沿 (简化版)
    # 按延迟排序,找到精度递增的点
    sorted_indices = np.argsort(latencies)
    pareto_accs = []
    pareto_latencies = []
    max_acc = 0
    
    for idx in sorted_indices:
        if accs[idx] > max_acc:
            max_acc = accs[idx]
            pareto_latencies.append(latencies[idx])
            pareto_accs.append(accs[idx])
    
    ax.plot(pareto_latencies, pareto_accs, 'r--', linewidth=2, label='Pareto Frontier')
    
    # 配置
    ax.set_xlabel('Latency (ms)', fontsize=12)
    ax.set_ylabel('Top-1 Accuracy (%)', fontsize=12)
    ax.set_title('Accuracy-Speed Trade-off (ImageNet)', fontsize=14)
    ax.grid(True, alpha=0.3)
    ax.legend()
    
    # 颜色条
    cbar = plt.colorbar(scatter)
    cbar.set_label('Parameters (M)', fontsize=10)
    
    plt.tight_layout()
    plt.savefig('pareto_frontier.png', dpi=150)
    print("帕累托前沿图已保存:pareto_frontier.png")

if __name__ == "__main__":
    plot_pareto_frontier()

不同场景的最优选择

┌─────────────────────────────────────────────────┐
│          不同场景的模型推荐                      │
├─────────────────────────────────────────────────┤
│                                                 │
│  移动端/边缘设备:                               │
│  ├── 约束:延迟<50ms, 显存<100MB               │
│  ├── 推荐:MobileNetV3, EfficientNet-B0        │
│  └── 备选:ResNet18, ShuffleNetV2              │
│                                                 │
│  实时视频分析:                                  │
│  ├── 约束:延迟<10ms, 吞吐量>100 FPS           │
│  ├── 推荐:ResNet18/34, EfficientNet-B1        │
│  └── 备选:ConvNeXt-T, MobileNetV3             │
│                                                 │
│  云端推理服务:                                  │
│  ├── 约束:延迟<20ms, 高精度                   │
│  ├── 推荐:EfficientNet-B3/B4, ResNet50        │
│  └── 备选:ConvNeXt-S, Swin-Tiny               │
│                                                 │
│  高精度离线处理:                                │
│  ├── 约束:精度优先,延迟次要                  │
│  ├── 推荐:EfficientNet-B5/B6, Swin-Base       │
│  └── 备选:ResNet101/152, ConvNeXt-L           │
│                                                 │
│  大规模预训练/微调:                             │
│  ├── 约束:迁移学习能力强                      │
│  ├── 推荐:ViT-B/16, Swin-Base                 │
│  └── 备选:EfficientNet-B4, ConvNeXt-B         │
│                                                 │
└─────────────────────────────────────────────────┘

不同 GPU 型号性能对比

测试配置

#!/usr/bin/env python3
# gpu_comparison_benchmark.py - 不同 GPU 性能对比

import torch
import time
import numpy as np
from torchvision import models
from collections import defaultdict

MODEL_NAMES = [
    'resnet18', 'resnet34', 'resnet50',
    'efficientnet_b0', 'efficientnet_b3',
    'vit_b_16', 'swin_t', 'convnext_t'
]

def get_model(name):
    """获取模型"""
    if name.startswith('resnet'):
        return getattr(models, name)(weights=None)
    elif name.startswith('efficientnet'):
        return getattr(models, name)(weights=None)
    elif name == 'vit_b_16':
        return models.vit_b_16(weights=None)
    elif name == 'swin_t':
        return models.swin_t(weights=None)
    elif name == 'convnext_t':
        return models.convnext_t(weights=None)

def benchmark_model(model, device, batch_size=1, iterations=100):
    """基准测试单个模型"""
    
    model = model.to(device)
    model.eval()
    
    # 根据模型类型确定输入大小
    if 'vit' in str(type(model).__name__).lower():
        input_size = (batch_size, 3, 224, 224)
    else:
        input_size = (batch_size, 3, 224, 224)
    
    input_tensor = torch.randn(input_size, device=device)
    
    # 预热
    with torch.inference_mode():
        for _ in range(20):
            _ = model(input_tensor)
    torch.cuda.synchronize()
    
    # 正式测试
    latencies = []
    with torch.inference_mode():
        for _ in range(iterations):
            start = time.perf_counter()
            _ = model(input_tensor)
            torch.cuda.synchronize()
            latencies.append(time.perf_counter() - start)
    
    latencies = np.array(latencies) * 1000  # ms
    
    return {
        'mean_ms': float(np.mean(latencies)),
        'median_ms': float(np.median(latencies)),
        'p95_ms': float(np.percentile(latencies, 95)),
        'p99_ms': float(np.percentile(latencies, 99)),
        'qps': float(1000 / np.mean(latencies))
    }

def main():
    print("="*80)
    print("不同 GPU 型号性能对比")
    print("="*80)
    print()
    
    # 检测可用 GPU
    if not torch.cuda.is_available():
        print("CUDA 不可用")
        return
    
    num_gpus = torch.cuda.device_count()
    print(f"检测到 {num_gpus} 张 GPU:")
    for i in range(num_gpus):
        print(f"  GPU {i}: {torch.cuda.get_device_name(i)}")
    print()
    
    results = defaultdict(dict)
    
    # 在每张 GPU 上测试
    for gpu_id in range(num_gpus):
        device = torch.device(f'cuda:{gpu_id}')
        gpu_name = torch.cuda.get_device_name(gpu_id)
        
        print(f"测试 GPU {gpu_id}: {gpu_name}")
        print("-"*80)
        
        for model_name in MODEL_NAMES:
            try:
                model = get_model(model_name)
                
                # 参数量
                params = sum(p.numel() for p in model.parameters()) / 1e6
                
                # 基准测试
                metrics = benchmark_model(model, device, batch_size=1, iterations=50)
                
                results[gpu_name][model_name] = {
                    'params_m': params,
                    **metrics
                }
                
                print(f"  {model_name:<20} {metrics['median_ms']:>6.2f}ms "
                      f"({metrics['qps']:>6.0f} QPS)")
                
                # 清理显存
                del model
                torch.cuda.empty_cache()
                
            except Exception as e:
                print(f"  {model_name:<20} 错误:{e}")
        
        print()
    
    # 生成对比报告
    print("="*80)
    print("性能对比总结")
    print("="*80)
    
    for gpu_name in results:
        print(f"\n{gpu_name}:")
        print(f"{'模型':<20} {'参数量':<10} {'延迟 (ms)':<12} {'QPS':<10}")
        print("-"*60)
        
        for model_name, metrics in results[gpu_name].items():
            print(f"{model_name:<20} {metrics['params_m']:<10.1f} "
                  f"{metrics['median_ms']:<12.2f} {metrics['qps']:<10.0f}")

if __name__ == "__main__":
    main()

性能对比参考

┌────────────────────────────────────────────────────────────────────┐
│            ResNet50 推理性能对比 (batch=1, FP32)                    │
├──────────────┬─────────────┬─────────────┬─────────────┬──────────┤
│   GPU 型号     │   延迟 (ms)  │   吞吐量    │   显存      │   架构    │
│              │   P50       │   (QPS)     │   (MB)      │          │
├──────────────┼─────────────┼─────────────┼─────────────┼──────────┤
│ H100 SXM     │   0.8       │   1250      │   250       │  Hopper  │
│ H100 PCIe    │   0.9       │   1111      │   250       │  Hopper  │
│ A100 SXM     │   1.2       │   833       │   300       │  Ampere  │
│ A100 PCIe    │   1.3       │   769       │   300       │  Ampere  │
│ A10          │   1.5       │   667       │   300       │  Ampere  │
│ A30          │   1.8       │   556       │   300       │  Ampere  │
│ V100 SXM     │   2.5       │   400       │   350       │  Volta   │
│ RTX 4090     │   1.0       │   1000      │   280       │  Ada     │
│ RTX A6000    │   1.6       │   625       │   320       │  Ampere  │
│ T4           │   3.5       │   286       │   400       │  Turing  │
└──────────────┴─────────────┴─────────────┴─────────────┴──────────┘

注:测试条件 TensorRT FP16,实际性能受系统配置影响

GPU 架构对性能的影响

┌─────────────────────────────────────────────────┐
│          GPU 架构对推理性能的影响                │
├─────────────────────────────────────────────────┤
│                                                 │
│  Hopper (H100):                                 │
│  ├── Transformer Engine 优化注意力计算          │
│  ├── FP8 支持,4x 吞吐提升                       │
│  ├── 适合:ViT、Swin 等 Transformer 模型         │
│  └── 相对 A100: +30-50% 推理性能                │
│                                                 │
│  Ampere (A100/A10):                             │
│  ├── 第三代 Tensor Core                         │
│  ├── FP16/BF16/INT8 支持                        │
│  ├── 适合:CNN、Transformer 各类模型            │
│  └── 当前主流选择,性价比高                     │
│                                                 │
│  Ada Lovelace (RTX 4090):                       │
│  ├── 第四代 Tensor Core                         │
│  ├── FP8 支持                                   │
│  ├── 适合:消费级高性能推理                     │
│  └── 相对 A100: 相近性能,更低功耗              │
│                                                 │
│  Volta (V100):                                  │
│  ├── 第一代 Tensor Core                         │
│  ├── FP16 支持                                  │
│  ├── 适合:传统 CNN 模型                        │
│  └── 逐渐淘汰,不推荐新部署                     │
│                                                 │
│  Turing (T4):                                   │
│  ├── 第二代 Tensor Core                         │
│  ├── INT8 支持                                  │
│  ├── 适合:轻量级推理、边缘部署                 │
│  └── 低功耗,适合云端推理                       │
│                                                 │
└─────────────────────────────────────────────────┘

选型建议

模型选型决策树

┌─────────────────────────────────────────────────────────────────────┐
│                     模型选型决策树                                   │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│                          开始                                       │
│                           │                                        │
│                           ↓                                        │
│                  ┌─────────────────┐                               │
│                  │ 延迟要求?      │                               │
│                  └────────┬────────┘                               │
│                           │                                        │
│           ┌───────────────┼───────────────┐                       │
│           ↓               ↓               ↓                       │
│      <10ms 实时      10-50ms 交互      >50ms 离线                  │
│           │               │               │                       │
│           ↓               ↓               ↓                       │
│    ┌─────────────┐ ┌─────────────┐ ┌─────────────┐               │
│    │ 精度要求?   │ │ 精度要求?   │ │ 精度要求?   │               │
│    └──────┬──────┘ └──────┬──────┘ └──────┬──────┘               │
│           │               │               │                       │
│     ┌─────┴─────┐   ┌─────┴─────┐   ┌─────┴─────┐               │
│     ↓           ↓   ↓           ↓   ↓           ↓               │
│   高          中  高          中  高          中                  │
│     │           │   │           │   │           │                 │
│     ↓           ↓   ↓           ↓   ↓           ↓                 │
│  Efficient   ResNet Efficient  ConvNeXt Efficient Swin           │
│  Net-B1/B2   18/34 Net-B3/B4  -T/S      -B5/B6  -Base            │
│                                             ConvNeXt              │
│                                             -B/L                  │
│                                                                     │
│  特殊场景:                                                          │
│  ├── 移动端:MobileNetV3, EfficientNet-Lite                       │
│  ├── 小样本:ResNet50 (预训练好)                                   │
│  ├── 迁移学习:ViT-B/16, Swin-Base                                │
│  └── 部署友好:ResNet50, ConvNeXt                                 │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

成本效益分析

#!/usr/bin/env python3
# cost_benefit_analysis.py - 成本效益分析

def calculate_tco(model_name, accuracy, latency_ms, qps, gpu_cost=10000, electricity=0.1):
    """
    计算总拥有成本 (TCO)
    
    参数:
        model_name: 模型名称
        accuracy: 精度 (%)
        latency_ms: 延迟 (ms)
        qps: 吞吐量 (QPS per GPU)
        gpu_cost: GPU 成本 ($)
        electricity: 电价 ($/kWh)
    
    返回:
        dict: 成本分析结果
    """
    
    # 假设场景:1000 QPS 服务
    target_qps = 1000
    
    # 需要的 GPU 数量
    num_gpus = max(1, int(target_qps / qps) + 1)
    
    # 硬件成本
    hardware_cost = num_gpus * gpu_cost
    
    # 电力成本 (假设 GPU 功耗 300W,运行 3 年)
    power_kw = num_gpus * 0.3
    electricity_cost_3y = power_kw * 24 * 365 * 3 * electricity
    
    # 总成本 (3 年)
    tco_3y = hardware_cost + electricity_cost_3y
    
    # 每次推理成本
    total_inferences_3y = target_qps * 60 * 60 * 24 * 365 * 3
    cost_per_inference = tco_3y / total_inferences_3y * 1000000  # 每百万次
    
    # 精度 - 成本比
    accuracy_cost_ratio = accuracy / (tco_3y / 1000)
    
    return {
        'model': model_name,
        'accuracy': accuracy,
        'latency_ms': latency_ms,
        'qps_per_gpu': qps,
        'num_gpus': num_gpus,
        'hardware_cost': hardware_cost,
        'electricity_cost_3y': electricity_cost_3y,
        'tco_3y': tco_3y,
        'cost_per_million': cost_per_inference,
        'accuracy_cost_ratio': accuracy_cost_ratio
    }

def main():
    # 示例模型数据
    models = [
        ('ResNet18', 69.8, 1.2, 833),
        ('ResNet50', 76.0, 2.5, 400),
        ('EfficientNet-B3', 81.6, 3.8, 263),
        ('EfficientNet-B5', 83.6, 8.5, 118),
        ('ViT-B/16', 81.8, 6.5, 154),
        ('Swin-Base', 83.5, 7.2, 139),
        ('ConvNeXt-B', 83.8, 6.8, 147),
    ]
    
    print("="*90)
    print("成本效益分析 (目标:1000 QPS, 3 年 TCO)")
    print("="*90)
    print()
    
    print(f"{'模型':<20} {'精度':<8} {'延迟':<8} {'GPU 数':<8} {'硬件成本':<12} {'TCO(3 年)':<12} {'$/M':<10}")
    print("-"*90)
    
    results = []
    for name, acc, latency, qps in models:
        result = calculate_tco(name, acc, latency, qps)
        results.append(result)
        
        print(f"{result['model']:<20} {result['accuracy']:<8.1f} "
              f"{result['latency_ms']:<8.2f} {result['num_gpus']:<8} "
              f"${result['hardware_cost']:<11,} ${result['tco_3y']:<11,.0f} "
              f"${result['cost_per_million']:<9.2f}")
    
    print("-"*90)
    
    # 最优选择
    best_ratio = max(results, key=lambda x: x['accuracy_cost_ratio'])
    best_cost = min(results, key=lambda x: x['cost_per_million'])
    
    print()
    print(f"最佳精度成本比:{best_ratio['model']} (ratio: {best_ratio['accuracy_cost_ratio']:.3f})")
    print(f"最低成本:{best_cost['model']} (${best_cost['cost_per_million']:.2f}/百万次)")

if __name__ == "__main__":
    main()

选型建议总结

总的来说,EfficientNet在大多数场景下提供了最佳的精度-效率平衡,特别适合现代部署需求;ResNet仍然是稳妥可靠的选择,尤其在对稳定性要求高的生产环境;ViT则在大数据、高精度场景中表现卓越,但需要更多的计算资源支持。

┌─────────────────────────────────────────────────┐
│          最终选型建议                            │
├─────────────────────────────────────────────────┤
│                                                 │
│  综合最佳 (精度 + 速度平衡):                     │
│  └── EfficientNet-B3/B4                        │
│      精度 81-83%,延迟适中,部署友好            │
│                                                 │
│  速度优先 (实时应用):                           │
│  └── ResNet18/34 或 MobileNetV3                │
│      延迟<5ms,适合视频流处理                   │
│                                                 │
│  精度优先 (离线分析):                           │
│  └── EfficientNet-B5/B6 或 Swin-Base           │
│      精度 83-84%,可接受较高延迟                │
│                                                 │
│  部署友好 (生产环境):                           │
│  └── ResNet50 或 ConvNeXt-B                    │
│      工具链成熟,优化充分,稳定性好             │
│                                                 │
│  迁移学习 (新任务):                             │
│  └── ViT-B/16 或 Swin-Base                     │
│      预训练模型丰富,迁移能力强                 │
│                                                 │
│  成本敏感 (大规模部署):                         │
│  └── EfficientNet-B3                           │
│      最佳精度成本比,TCO 最低                    │
│                                                 │
└─────────────────────────────────────────────────┘

实战:模型对比 Benchmark

完整测试脚本

#!/bin/bash
# model_comparison_benchmark.sh - 完整模型对比测试

set -e

echo "=========================================="
echo "  图像分类模型对比 Benchmark"
echo "=========================================="

RESULTS_DIR="results/model_comparison_$(date +%Y%m%d_%H%M%S)"
mkdir -p $RESULTS_DIR

echo "结果目录:$RESULTS_DIR"
echo ""

# 1. 环境信息
echo "=========================================="
echo "[1/5] 环境信息"
echo "=========================================="
python3 -c "
import torch
print(f'PyTorch: {torch.__version__}')
print(f'CUDA: {torch.version.cuda}')
print(f'GPU: {torch.cuda.get_device_name(0) if torch.cuda.is_available() else \"N/A\"}')
" | tee $RESULTS_DIR/env_info.txt

# 2. 运行模型对比
echo ""
echo "=========================================="
echo "[2/5] 模型性能测试"
echo "=========================================="
python3 gpu_comparison_benchmark.py 2>&1 | tee $RESULTS_DIR/performance.txt

# 3. 精度验证 (可选,需要验证集)
echo ""
echo "=========================================="
echo "[3/5] 精度验证"
echo "=========================================="
python3 -c "
# 简化版,实际应使用 ImageNet 验证集
print('精度验证需要 ImageNet 验证集')
print('使用预训练权重进行快速验证...')

from torchvision.models import resnet50, efficientnet_b3, vit_b_16
import torch

models = {
    'ResNet50': resnet50(weights='IMAGENET1K_V2'),
    'EfficientNet-B3': efficientnet_b3(weights='IMAGENET1K_V1'),
    'ViT-B/16': vit_b_16(weights='IMAGENET1K_V1'),
}

for name, model in models.items():
    print(f'{name}: 预训练权重加载成功')
" | tee $RESULTS_DIR/accuracy.txt

# 4. 帕累托分析
echo ""
echo "=========================================="
echo "[4/5] 帕累托分析"
echo "=========================================="
python3 pareto_analysis.py

# 5. 生成报告
echo ""
echo "=========================================="
echo "[5/5] 生成测试报告"
echo "=========================================="

cat << EOF > $RESULTS_DIR/comparison_report.md
# 图像分类模型对比报告

**测试日期:** $(date)
**GPU:** $(nvidia-smi --query-gpu=name --format=csv,noheader)

## 环境信息

\`\`\`
$(cat $RESULTS_DIR/env_info.txt)
\`\`\`

## 性能测试结果

\`\`\`
$(cat $RESULTS_DIR/performance.txt)
\`\`\`

## 精度验证

\`\`\`
$(cat $RESULTS_DIR/accuracy.txt)
\`\`\`

## 帕累托前沿

详见:pareto_frontier.png

## 选型建议

根据精度 - 速度权衡和业务需求选择合适的模型
EOF

echo "报告已生成:$RESULTS_DIR/comparison_report.md"

echo ""
echo "=========================================="
echo "  对比测试完成"
echo "=========================================="
echo ""
echo "结果目录:$RESULTS_DIR"
ls -la $RESULTS_DIR

总结与建议

第三部分总结

🎉 第三部分:经典模型测试 (3 篇) 已全部完成!

文章 主题 状态
Day 11 ResNet50 训练测试
Day 12 ResNet50 推理测试
Day 13 图像分类模型性能对比

核心要点

  1. ✅ ResNet50 训练:混合精度 2-3 倍提升,多卡扩展 85-95%
  2. ✅ ResNet50 推理:TensorRT FP16 2x 加速,INT8 4x 加速
  3. ✅ 模型对比:EfficientNet 综合最佳,ResNet 部署友好

系列进度

总进度:13/32 篇 (41%)

下一步

接下来将进入 第四部分:大语言模型推理(8 篇),学习:

  • LLM 推理引擎概览
  • vLLM、TensorRT-LLM、SGLang 部署
  • llama.cpp CPU/GPU 混合推理
  • LLaMA、DeepSeek、Qwen 模型测试

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐