微型测试模型

社区文章 发布于2024年10月2日

我最近在 ImageNet-1k 上训练了一组微型测试模型(https://huggingface.co/collections/timm/timm-tiny-test-models-66f18bd70518277591a86cef),涵盖了几种最流行的架构家族。

在旧 CPU(但快速的互联网连接)上,下载所有 13 个预训练权重并运行每个模型的单步推理大约需要 10 秒。这将允许快速验证模型功能,从预训练权重下载到全尺寸模型的每个 API 功能。它们与全尺寸模型的不同之处在于,它们具有较低的默认分辨率,通常每个阶段一个块,宽度非常窄。

这都很好,但除了测试之外,有人会对这些模型感兴趣吗?嗯,这就是您的用武之地。这些是一些在 ImageNet-1k 上训练得相当好的最小模型。它们使用了一种最近从 MobileNet-v4(Conv-Small)改编的训练方法,这是一种从小型模型中挤压准确率的好方法。Top-1 准确率绝不令人印象深刻,但这些模型在小型数据集上进行微调时表现良好,我想它们在一些资源受限(嵌入式)应用程序中或作为强化学习视觉策略的一部分,也可能表现得相当好。

如果您在测试之外找到任何好的应用,请告诉我。以下是模型结果的摘要,它们在 160x160 下进行原生训练,大多数模型通过利用训练-测试差异在 192x192 下略有提升。

ImageNet 准确率

模型 图像尺寸 top1 top5 参数数量 norm
test_vit3.r160_in1k 192 58.116 81.876 0.93 LN
test_vit3.r160_in1k 160 56.894 80.748 0.93 LN
test_convnext3.r160_in1k 192 54.558 79.356 0.47 LN
test_convnext2.r160_in1k 192 53.62 78.636 0.48 LN
test_convnext2.r160_in1k 160 53.51 78.526 0.48 LN
test_convnext3.r160_in1k 160 53.328 78.318 0.47 LN
test_convnext.r160_in1k 192 48.532 74.944 0.27 LN
test_nfnet.r160_in1k 192 48.298 73.446 0.38 WS
test_convnext.r160_in1k 160 47.764 74.152 0.27 LN
test_nfnet.r160_in1k 160 47.616 72.898 0.38 WS
test_efficientnet.r160_in1k 192 47.164 71.706 0.36 BN
test_efficientnet_evos.r160_in1k 192 46.924 71.53 0.36 EVOS
test_byobnet.r160_in1k 192 46.688 71.668 0.46 BN
test_efficientnet_evos.r160_in1k 160 46.498 71.006 0.36 EVOS
test_efficientnet.r160_in1k 160 46.454 71.014 0.36 BN
test_byobnet.r160_in1k 160 45.852 70.996 0.46 BN
test_efficientnet_ln.r160_in1k 192 44.538 69.974 0.36 LN
test_efficientnet_gn.r160_in1k 192 44.448 69.75 0.36 GN
test_efficientnet_ln.r160_in1k 160 43.916 69.404 0.36 LN
test_efficientnet_gn.r160_in1k 160 43.88 69.162 0.36 GN
test_vit2.r160_in1k 192 43.454 69.798 0.46 LN
test_resnet.r160_in1k 192 42.376 68.744 0.47 BN
test_vit2.r160_in1k 160 42.232 68.982 0.46 LN
test_vit.r160_in1k 192 41.984 68.64 0.37 LN
test_resnet.r160_in1k 160 41.578 67.956 0.47 BN
test_vit.r160_in1k 160 40.946 67.362 0.37 LN

吞吐量 @ 160x160 w/ torch.compile, mode='max-autotune', PyTorch 2.4.1, RTX4090

模型 infer_samples_per_sec train_samples_per_sec
test_vit 300560.67 87518.73
test_vit2 254514.84 70132.93
test_convnext 216367.11 50905.24
test_convnext3 200783.46 49074.48
test_byobnet 199426.55 49487.12
test_convnext2 196727.0 48119.64
test_efficientnet 181404.48 43546.96
test_efficientnet_ln 173432.33 33280.66
test_efficientnet_evos 169177.92 39684.92
test_vit3 163786.54 44318.45
test_efficientnet_gn 158421.02 44226.92
test_resnet 153289.49 28341.52
test_nfnet 80837.46 16907.38

吞吐量 @ 160x160 w/ torch.compile, mode='reduce-overhead', PyTorch 2.4.1, RTX4090

模型 infer_samples_per_sec train_samples_per_sec
test_vit 274007.61 86652.08
test_vit2 231651.39 68993.91
test_byobnet 197767.6 48633.6
test_convnext 184134.55 46879.08
test_efficientnet 170239.18 42812.1
test_efficientnet_ln 166604.2 31946.88
test_efficientnet_evos 163667.41 42222.59
test_vit3 161792.13 45354.67
test_convnext2 160601.75 43187.22
test_convnext3 160494.65 44304.95
test_efficientnet_gn 155447.85 42003.28
test_resnet 150790.14 27286.95
test_nfnet 78314.21 15282.57

吞吐量 @ 160x160 w/ torch.compile, mode='default', PyTorch 2.4.1, RTX4090

python benchmark.py --amp --model 'test_*' --fast-norm --torchcompile 的输出

模型 infer_samples_per_sec train_samples_per_sec
test_efficientnet 192256.16 30972.05
test_efficientnet_ln 186221.3 28402.3
test_efficientnet_evos 180578.68 32651.59
test_convnext3 179679.28 34998.59
test_byobnet 177707.5 32309.83
test_efficientnet_gn 169962.75 31801.23
test_convnext2 166527.39 37168.73
test_resnet 157618.18 25159.21
test_vit 146050.34 38321.33
test_convnext 138397.51 27930.18
test_vit2 116394.63 26856.88
test_vit3 89157.52 21656.06
test_nfnet 71030.73 14720.19

详情

上述模型名称提供了一些关于它们是什么的线索,但我确实探索了一些“独特”的架构变体,值得为任何可能尝试它们的人提及。

test_byobnet

一个 ByobNet(EfficientNet / ResNet / DarkNet 块的混合)

  • 阶段块 = 1 * EdgeResidual (FusedMBConv), 1 * DarkBlock, 1 * ResNeXt Basic (group_size=32), 1 * ResNeXt Bottle (group_size=64)
  • 通道数 = 32, 64, 128, 256
  • se_ratio = .25(在所有块中都有效)
  • act_layer = ReLU
  • norm_layer = BatchNorm

test_convnext

一个 ConvNeXt

  • 阶段深度 = 1, 2, 4, 2
  • 通道数 = 24, 32, 48, 64
  • DW kernel_size = 7, 7, 7, 7
  • act_layer = GELU (tanh 近似)
  • norm_layer = LayerNorm

test_convnext2

一个 ConvNeXt

  • 阶段深度 = 1, 1, 1, 1
  • 通道数 = 32, 64, 96, 128
  • DW kernel_size = 7, 7, 7, 7
  • act_layer = GELU (tanh 近似)
  • norm_layer = LayerNorm

test_convnext3

一个带 SiLU 和可变核大小的 ConvNeXt

  • 阶段深度 = 1, 1, 1, 1
  • 通道数 = 32, 64, 96, 128
  • DW kernel_size = 7, 5, 5, 3
  • act_layer = SiLU
  • norm_layer = LayerNorm

test_efficientnet

一个带 V2 块混合的 EfficientNet

  • 阶段块 = 1 * ConvBnAct, 2 * EdgeResidual (FusedMBConv), 2 * InvertedResidual (MBConv) w/ SE
  • 通道数 = 16, 24, 32, 48, 64
  • kernel_size = 所有均为 3x3
  • 扩展 = 所有均为 4x
  • stem_size = 24
  • act_layer = SiLU
  • norm_layer = BatchNorm

test_efficientnet_gn

一个带 V2 块混合和 GroupNorm(group_size=8)的 EfficientNet

  • 同上,但 norm_layer=GroupNorm

test_efficientnet_ln

一个带 V2 块混合和 LayerNorm 的 EfficientNet

  • 同上,但 norm_layer=LayerNorm

test_efficientnet_evos

一个带 V2 块混合和 EvoNorm-S 的 EfficientNet

  • 同上,但使用 EvoNormS 进行范数 + 激活

test_nfnet

一个无范数网络

  • 4 阶段,每个阶段 1 个块
  • 通道数 = 32, 64, 96, 128
  • group_size = 8
  • bottle_ratio = 0.25
  • se_ratio = 0.25
  • act_layer = SiLU
  • norm_layer = 无范数,Scaled Weight Standardization 是卷积的一部分

test_resnet

一个带混合块的 ResNet

  • 阶段块 = 1 * BasicBlock, 1 * BasicBlock, 1 * BottleNeck, 1 * BasicBlock
  • 通道数 = 32, 48, 48, 96
  • 深层 3x3 stem(即 ResNet-D)
  • 下采样中的平均池化(即 ResNet-D)
  • stem_width = 16
  • act_layer = ReLU
  • norm_layer = BatchNorm

test_vit

一个带分类 token 的普通 ViT

  • patch_size = 16
  • embed_dim = 64
  • num_heads = 2
  • mlp_ratio = 3
  • 深度 = 6
  • act_layer = GELU
  • norm_layer = LayerNorm

test_vit2

一个带全局平均池化、1 个 reg token、层缩放(如 timm SBB ViT https://huggingface.co/collections/timm/searching-for-better-vit-baselines-663eb74f64f847d2f35a9c19)的 ViT

  • patch_size = 16
  • embed_dim = 64
  • num_heads = 2
  • mlp_ratio = 3
  • 深度 = 8
  • act_layer = GELU
  • norm_layer = LayerNorm

test_vit3

一个带注意力池化、1 个 reg token、层缩放的 ViT。

  • patch_size = 16
  • embed_dim = 96
  • num_heads = 3
  • mlp_ratio = 2
  • 深度 = 9
  • act_layer = GELU
  • norm_layer = LayerNorm

社区

注册登录 发表评论