微型測試模型
我最近在 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