???ニュース: UniRepLKNet の拡張ジャーナル バージョンが arxiv でリリースされました。
ConvNet は複数のモダリティを統合し、モダリティ固有のモデルよりも優れたパフォーマンスを発揮します。このペーパーでは、画像やその他のモダリティと驚くほどうまく機能する大規模カーネル CNN を構築するためのアーキテクチャ ガイドラインを要約します。これは、2 つの影響力のある分野、 Structural Re-param (RepVGG、Ding et al. 2021 以降) と超大規模カーネル ConvNet (RepLKNet、Ding et al. 2022 以降) の両方に対する最新の貢献です。 ImageNet-22K 事前トレーニングのみの場合、ImageNet の精度は 88.0%、COCO AP は 56.4、ADE20K mIoU は 55.6 です。 ConvNeXt v2 や InterImage などの最近のモデルよりも実際の速度とパフォーマンスが高くなります。統一されたアーキテクチャと非常にシンプルなモダリティ固有の前処理により、音声認識と、最も驚くべきことに地球の気温と風速の予測(挑戦的な大規模な時系列予測タスク) で最先端のパフォーマンスを達成し、既存の世界的な予測システム。
より具体的には、次の 2 つの側面から貢献します。
UniRepLKNet は、元のドメインでの ConvNet の「復活」を意味するだけでなく、新しい領域を「征服」する大規模カーネル ConvNet の潜在力を示し、さまざまなモダリティやタスクにわたるさらなる適応性と広範な有用性を強調しています。
ImageNet、COCO、および ADE20K チェックポイントはリリースされています (下記の ハグフェイス リポジトリを参照)。ただし、ImageNet-22K の事前トレーニング済み UniRepLKNet-S と、UniRepLKNet-XL を備えた UperNet は失われており、再作成しています。
最新ニュース: 2023 年 12 月 1 日にこのコミットに起因するバグが修正されました。現在は修正されています。 2023 年 12 月 1 日以降に unireplknet.py を使用した場合は、コードを確認してください。
unireplknet.py
には MMDetection および MMSegmentation 関連のコードが含まれているため、MMDetection または MMSegmentation に直接コピーして貼り付けることができます (例: こことここ)。 MMDetection または MMSegmentation で使用したくない場合は、これらのコード行を安全に削除できます。timm.create_model
使用してモデルを構築することもできます。たとえば、 model = timm.create_model('unireplknet_l', num_classes=num_classes_of_your_task, in_22k_pretrained=True)
、ここで定義された関数unireplknet_l
を呼び出します。これにより、UniRepLKNet-L が構築され、チェックポイントが自動的にダウンロードされ、重みがロードされます。 # The simplest way to use our model in your project is to copy-paste unireplknet.py into your working directory and create models. For example
from unireplknet import *
model = timm.create_model('unireplknet_l', num_classes=num_classes_of_your_task, in_22k_pretrained=True)
reparameterize_unireplknet()
を提供します。これにより、Dialted Reparam ブロック、バッチ ノルム レイヤー、GRN のバイアス項の並列分岐が等価的に削除されます。パイプライン全体の疑似コードは次のようになります。 training_model = unireplknet_l (..., deploy = False )
train ( training_model )
trained_results = evaluate ( training_model )
training_model . reparameterize_unireplknet ()
inference_results = evaluate ( training_model )
# you will see inference_results are identical to trained_results
save ( training_model , 'converted_weights.pth' )
# use the converted model
deploy_model = unireplknet_l (..., deploy = True )
load_weights ( deploy_model , 'converted_weights.pth' )
deploy_results = evaluate ( deploy_model )
# you will see deploy_results == inference_results == trained_results
some_unireplknet_model.reparameterize_unireplknet()
を呼び出すことはtimm.utils.reparameterize_model(some_unireplknet_model)
を呼び出すことと同じです。したがって、timm のコードベース (たとえば、timm の評価コード) でコードを使用する場合は、コマンドに--reparam
を追加するだけで、 timm.utils.reparameterize_model
が呼び出されます (ここを参照)。 チェックポイントをダウンロードする 5 つの方法を提供しました。
pip install huggingface_hub
次に、Python コードで次のように huggingface_hub を使用します。たとえば、次のようになります。
from huggingface_hub import hf_hub_download
repo_id = 'DingXiaoH/UniRepLKNet'
cache_file = hf_hub_download ( repo_id = repo_id , filename = FILE_NAME )
checkpoint = torch . load ( cache_file , map_location = 'cpu' )
model . load_state_dict ( checkpoint )
ハグフェイス リポジトリまたは FILE_NAME のコード (例: unireplknet_xl_in22k_pretrain.pth
) を参照してください。
ハグフェイス CLI を使用します。チュートリアルを確認してください。
提供された関数を呼び出すときにin_1k_pretrained=True
、 in_22k_pretrained=True
、またはin_22k_to_1k=True
を渡すことで、チェックポイントを自動的にダウンロードします。ここのコードを参照してください。
名前 | 解決 | ACC@1 | #params | フロップス | 重み |
---|---|---|---|---|---|
UniRepLKNet-A | 224x224 | 77.0 | 4.4M | 0.6G | 確認 |
UniRepLKNet-F | 224x224 | 78.6 | 6.2M | 0.9G | 確認 |
UniRepLKNet-P | 224x224 | 80.2 | 1070万 | 1.6G | 確認 |
UniRepLKNet-N | 224x224 | 81.6 | 18.3M | 2.8G | 確認 |
UniRepLKNet-T | 224x224 | 83.2 | 31M | 4.9G | 確認 |
UniRepLKNet-S | 224x224 | 83.9 | 56M | 9.1G | 確認 |
名前 | 解決 | #params | フロップス | 確認 |
---|---|---|---|---|
UniRepLKNet-S | 224x224 | 56M | 26.7G | 確認 |
UniRepLKNet-B | 224x224 | 98M | 47.2G | 確認 |
UniRepLKNet-L | 192x192 | 218M | 105.4G | 確認 |
UniRepLKNet-XL | 192x192 | 386M | 187G | 確認 |
名前 | 解決 | ACC@1 | #params | フロップス | 確認 |
---|---|---|---|---|---|
UniRepLKNet-S | 384x384 | 86.4 | 56M | 26.7G | 確認 |
UniRepLKNet-B | 384x384 | 87.4 | 98M | 47.2G | 確認 |
UniRepLKNet-L | 384x384 | 87.9 | 218M | 105.4G | 確認 |
UniRepLKNet-XL | 384x384 | 88.0 | 386M | 187G | 確認 |
コード、ドキュメント、構成ファイルがリリースされました。こちらの検出ガイドをご覧ください。
ハグ顔のチェックポイントはすでに公開されています。 https://huggingface.co/DingXiaoH/UniRepLKNet/tree/main から今すぐダウンロードできます。
または、次のように Google ドライブからこれらのチェックポイントをダウンロードすることもできます。
名前 | 解決 | ボックスマップ | マスクマップ | #params | フロップス | 重み |
---|---|---|---|---|---|---|
UniRepLKNet-T | 1280x800 | 51.7 | 44.9 | 89M | 749G | 確認 |
UniRepLKNet-S | 1280x800 | 53.0 | 45.9 | 113M | 835G | 確認 |
UniRepLKNet-S_22K | 1280x800 | 54.3 | 47.1 | 113M | 835G | 確認 |
UniRepLKNet-B_22K | 1280x800 | 54.8 | 47.4 | 155M | 978G | 確認 |
UniRepLKNet-L_22K | 1280x800 | 55.8 | 48.4 | 276M | 1385G | 確認 |
UniRepLKNet-XL_22K | 1280×800 | 56.4 | 49.0 | 443M | 1952G | 確認 |
コード、ドキュメント、構成ファイルがリリースされました。ここでセグメンテーションガイドを参照してください。
ハグ顔のチェックポイントはすでに公開されています。 https://huggingface.co/DingXiaoH/UniRepLKNet/tree/main から今すぐダウンロードできます。
または、次のように Google ドライブからこれらのチェックポイントをダウンロードすることもできます。
名前 | 解決 | mIoU (ss/ms) | #params | フロップス | 重み |
---|---|---|---|---|---|
UniRepLKNet-T | 512x512 | 48.6/49.1 | 61M | 946G | 確認 |
UniRepLKNet-S | 512x512 | 50.5/51.0 | 86M | 1036G | 確認 |
UniRepLKNet-S_22K | 512x512 | 51.9/52.7 | 86M | 1036G | 確認 |
UniRepLKNet-S_22K | 640×640 | 52.3/52.7 | 86M | 1618G | 確認 |
UniRepLKNet-B_22K | 640×640 | 53.5/53.9 | 130M | 1850G | 確認 |
UniRepLKNet-L_22K | 640×640 | 54.5/55.0 | 254M | 2507G | 確認 |
UniRepLKNet-XL_22K | 640×640 | 55.2/55.6 | 425M | 3420G | 確認 |
評価コマンドの例を示します。
シングル GPU
python main.py --model unireplknet_b --eval true
--resume unireplknet_b_in22k_to_in1k_384_acc87.40.pth
--input_size 384
--data_path /path/to/imagenet-1k
マルチGPU
python -m torch.distributed.launch --nproc_per_node=8 main.py
--model unireplknet_b --eval true
--resume unireplknet_b_in22k_to_in1k_384_acc87.40.pth
--input_size 384
--data_path /path/to/imagenet-1k
ImageNet-1K または 22K での UniRepLKNet のトレーニングまたは微調整については、このガイドを参照してください。
詳細なドキュメントについては、次のドキュメントを参照してください。
PyTorchでは、ネイティブの torch.nn.Conv2d よりも効率的な大規模カーネル conv 実装を使用しています。これは、iGEMM アルゴリズムと Cutlass という軽量ツールに基づいて実装されています。インストールは非常に簡単で、費用は 1 分もかかりません。この実装をインストールしない場合でも、どこでもモデルを使用できますが、速度は少し遅くなります。
unzip cutlass.zip
、ディレクトリに入ります。このリポジトリで提供されているこのバージョンの Cutlass は、大規模なカーネル実装および複数の Python バージョンで正常に動作します。代わりに、MegEngine チームによって保守されている Cutlass ブランチ (https://github.com/MegEngine/cutlass のクローン) を使用することもできますが、Python のバージョンにはより注意する必要がある場合があります (この問題を参照)。cd examples/19_large_depthwise_conv2d_torch_extension
./setup.py install --user
。エラーが発生した場合は、 CUDA_HOME
確認してください。python depthwise_conv2d_implicit_gemm.py
PATH_TO_CUTLASS_DIRECTORY/examples/19_large_depthwise_conv2d_torch_extension
をPYTHONPATH
に追加して、どこにでもfrom depthwise_conv2d_implicit_gemm import DepthWiseConv2dImplicitGEMM
できるようにします。その後、 nn.Conv2d
の代わりにDepthWiseConv2dImplicitGEMM
を使用できます。幅広い GPU および PyTorch/CUDA バージョンで動作するはずです。まず試して、エラーが発生した場合にのみ環境を確認することをお勧めします。最新のテストでは両方を使用しました
Python のバージョンforward_fp32.cu(212): error: more than one instance of constructor "cutlass::Tensor4DCoord::Tensor4DCoord" ...
またはcutlass/include/cutlass/fast_math.h(741): error: no suitable conversion function from "__half" to "float" exists
)。 Python をアップグレードまたはダウングレードしてください。経験を共有してくれた @sleeplesssai と @ewrfcas に心から感謝します。
プルリクエスト (例: より良い実装や他の実装、他のフレームワークでの実装など) は歓迎されます。
コードと論文が研究に役立つ場合は、引用してください。
@article{zhang2024scaling,
title={Scaling Up Your Kernels: Large Kernel Design in ConvNets towards Universal Representations},
author={Zhang, Yiyuan and Ding, Xiaohan and Yue, Xiangyu},
journal={arXiv preprint arXiv:2410.08049},
year={2024}
}
@inproceedings{ding2024unireplknet,
title={UniRepLKNet: A Universal Perception Large-Kernel ConvNet for Audio Video Point Cloud Time-Series and Image Recognition},
author={Ding, Xiaohan and Zhang, Yiyuan and Ge, Yixiao and Zhao, Sijie and Song, Lin and Yue, Xiangyu and Shan, Ying},
booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
pages={5513--5524},
year={2024}
}
このプロジェクトは、Apache 2.0 ライセンスに基づいてリリースされています。詳細については、LICENSE ファイルを参照してください。