微型测试模型
我最近在 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