{"notes":[{"id":"classic-cnns/wbmm","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"WBMM","subtitle":"ウィンドウは大きいほど速い","author":"Z. Yuan","paperDate":"2026-07-02","publishedOn":"2026-10-09","paperTitle":"WBMM: Windowed Batch Matrix Multiplication for Efficient Large Receptive Field Convolution","paperUrl":"https://arxiv.org/abs/2607.02097","bibliography":{"title":"WBMM: Windowed Batch Matrix Multiplication for Efficient Large Receptive Field Convolution","authors":["Wan Song","Wei Zhou","Rui Wang","Jun Yu","Toru Kurihara","Jiajia Xu","Shu Zhan"],"url":"https://arxiv.org/abs/2607.02097","pdfUrl":"https://arxiv.org/pdf/2607.02097v2","codeUrl":"https://github.com/wansong-s/WBMM","preprint":{"id":"2607.02097","submittedOn":"2026-07-02","url":"https://arxiv.org/abs/2607.02097"},"publication":{"venue":"ICML","year":2026,"kind":"conference","url":"https://proceedings.mlr.press/v306/song26ae.html"},"citation":"@misc{classiccnnswbmm2026,\n  title = {{WBMM: Windowed Batch Matrix Multiplication for Efficient Large Receptive Field Convolution}},\n  author = {Wan Song and Wei Zhou and Rui Wang and Jun Yu and Toru Kurihara and Jiajia Xu and Shu Zhan},\n  year = {2026},\n  eprint = {2607.02097},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2607.02097}\n}\n","citationPath":"/content/papers/citations/classic-cnns/wbmm.5eb4a1ff4a34.bib"},"thumbnail":{"src":"/content/papers/assets/5c20ec217f297d24ad8ce71ca79936d0599f7b460167e3bb89f52515ff1347ee.png","width":1017,"height":360},"locale":"ja","path":"/content/papers/ja/classic-cnns/wbmm.92fe2df7848a.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"畳み込みはデータを待っている","text":"畳み込みはデータを待っている","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"畳み込みを行列乗算で書く","text":"畳み込みを行列乗算で書く","depth":3},{"id":"大きなウィンドウほど速い","text":"大きなウィンドウほど速い","depth":3},{"id":"ウィンドウ間の情報交換を補う","text":"ウィンドウ間の情報交換を補う","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"imagenet","text":"ImageNet","depth":3},{"id":"物体検出とセグメンテーション","text":"物体検出とセグメンテーション","depth":3},{"id":"ほかのハードウェア","text":"ほかのハードウェア","depth":3},{"id":"制約","text":"制約","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"reparameterization/replknet","relation":"referenced","topic":""},{"id":"classic-cnns/slak","relation":"referenced","topic":""},{"id":"reparameterization/unireplknet","relation":"referenced","topic":""}]},{"id":"reparameterization/replknet","category":"reparameterization","legacyPath":"reparameterization/2203-replknet","legacySlug":"2203-replknet","legacyPaths":[],"title":"RepLKNet","subtitle":"巨大なカーネル","author":"Z. Yuan","paperDate":"2022-03-13","publishedOn":"2024-07-21","paperTitle":"Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs","paperUrl":"https://arxiv.org/abs/2203.06717","bibliography":{"title":"Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs","authors":["Xiaohan Ding","Xiangyu Zhang","Yizhuang Zhou","Jungong Han","Guiguang Ding","Jian Sun"],"url":"https://arxiv.org/abs/2203.06717","pdfUrl":"https://arxiv.org/pdf/2203.06717","codeUrl":null,"preprint":{"id":"2203.06717","submittedOn":"2022-03-13","url":"https://arxiv.org/abs/2203.06717"},"publication":{"venue":"CVPR","year":2022,"kind":"conference","url":"https://arxiv.org/abs/2203.06717"},"citation":"@misc{reparameterizationreplknet2022,\n  title = {{Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs}},\n  author = {Xiaohan Ding and Xiangyu Zhang and Yizhuang Zhou and Jungong Han and Guiguang Ding and Jian Sun},\n  year = {2022},\n  eprint = {2203.06717},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2203.06717}\n}\n","citationPath":"/content/papers/citations/reparameterization/replknet.c7cc2407aa19.bib"},"thumbnail":{"src":"/content/papers/assets/b85fa678b6e815b9d112b67d68443295a98c80478664ec8053c2e832d89574ca.jpg","width":1140,"height":972},"locale":"ja","path":"/content/papers/ja/reparameterization/replknet.c895ec076bd6.md","headings":[{"id":"問題設定","text":"問題設定","depth":2},{"id":"大きなカーネルの使い方","text":"大きなカーネルの使い方","depth":2},{"id":"大きな-depthwise-カーネルも効率化できる","text":"大きな depthwise カーネルも効率化できる","depth":3},{"id":"大きなカーネルは残差接続に依存している","text":"大きなカーネルは残差接続に依存している","depth":3},{"id":"大きなカーネルには再パラメータ化が必要","text":"大きなカーネルには再パラメータ化が必要","depth":3},{"id":"大きなカーネルは下流タスクの性能を大きく向上させる","text":"大きなカーネルは下流タスクの性能を大きく向上させる","depth":3},{"id":"大きなカーネルは小さな特徴マップにも効果的","text":"大きなカーネルは小さな特徴マップにも効果的","depth":3},{"id":"提案手法","text":"提案手法","depth":2},{"id":"ネットワークアーキテクチャ","text":"ネットワークアーキテクチャ","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"大きなカーネルの評価","text":"大きなカーネルの評価","depth":3},{"id":"imagenet-上の性能","text":"ImageNet 上の性能","depth":3},{"id":"大きなカーネル-cnn-は深い小さなカーネルモデルよりも大きな-erf-を持つ","text":"大きなカーネル CNN は深い小さなカーネルモデルよりも大きな ERF を持つ","depth":3},{"id":"形状バイアス","text":"形状バイアス","depth":3},{"id":"制限","text":"制限","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{"問題定義":"問題設定","深層の大きなカーネルは依然として効率的":"大きな-depthwise-カーネルも効率化できる","問題解決":"提案手法","討論":"考察"},"guide":null,"relatedReading":[{"id":"classic-cnns/convnext","relation":"comparison","topic":"大きなカーネルと簡潔な畳み込み骨格"}]},{"id":"classic-cnns/slak","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"SLaK","subtitle":"カーネルPro Max","author":"Z. Yuan","paperDate":"2022-07-07","publishedOn":"2025-03-09","world":"external/slak","paperTitle":"More ConvNets in the 2020s: Scaling up Kernels Beyond 51x51 using Sparsity","paperUrl":"https://arxiv.org/abs/2207.03620","bibliography":{"title":"More ConvNets in the 2020s: Scaling up Kernels Beyond 51x51 using Sparsity","authors":["Shiwei Liu","Tianlong Chen","Xiaohan Chen","Xuxi Chen","Qiao Xiao","Boqian Wu","Tommi Kärkkäinen","Mykola Pechenizkiy","Decebal Mocanu","Zhangyang Wang"],"url":"https://arxiv.org/abs/2207.03620","pdfUrl":"https://arxiv.org/pdf/2207.03620v3","codeUrl":null,"preprint":{"id":"2207.03620","submittedOn":"2022-07-07","url":"https://arxiv.org/abs/2207.03620"},"publication":{"venue":"ICLR","year":2023,"kind":"conference","url":"https://iclr.cc/virtual/2023/poster/11529"},"citation":"@misc{classiccnnsslak2022,\n  title = {{More ConvNets in the 2020s: Scaling up Kernels Beyond 51x51 using Sparsity}},\n  author = {Shiwei Liu and Tianlong Chen and Xiaohan Chen and Xuxi Chen and Qiao Xiao and Boqian Wu and Tommi Kärkkäinen and Mykola Pechenizkiy and Decebal Mocanu and Zhangyang Wang},\n  year = {2022},\n  eprint = {2207.03620},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2207.03620}\n}\n","citationPath":"/content/papers/citations/classic-cnns/slak.e167e693df01.bib"},"thumbnail":{"src":"/content/papers/assets/b5b8ba279efe42831c7ec4e60395d0559da26774c8519a438783f49f4b814a85.png","width":1640,"height":660},"locale":"ja","path":"/content/papers/ja/classic-cnns/slak.2268b5d78db5.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"31の先へ","text":"31の先へ","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"ステップ12本の細長いカーネルに分解する","text":"ステップ1：2本の細長いカーネルに分解する","depth":3},{"id":"ステップ2もう少しスパースにもう少し広く","text":"ステップ2：もう少しスパースに、もう少し広く","depth":3},{"id":"slakの構成","text":"SLaKの構成","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"imagenet","text":"ImageNet","depth":3},{"id":"下流タスク","text":"下流タスク","depth":3},{"id":"実際に動かしてみると","text":"実際に動かしてみると","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/convnext","relation":"referenced","topic":""},{"id":"reparameterization/replknet","relation":"referenced","topic":""},{"id":"classic-cnns/resnext","relation":"referenced","topic":""}]},{"id":"reparameterization/unireplknet","category":"reparameterization","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"UniRepLKNet","subtitle":"大きなカーネルで領域を越える","author":"Z. Yuan","paperDate":"2023-11-27","publishedOn":"2025-12-14","world":"external/unireplknet","paperTitle":"UniRepLKNet: A Universal Perception Large-Kernel ConvNet for Audio, Video, Point Cloud, Time-Series and Image Recognition","paperUrl":"https://arxiv.org/abs/2311.15599","bibliography":{"title":"UniRepLKNet: A Universal Perception Large-Kernel ConvNet for Audio, Video, Point Cloud, Time-Series and Image Recognition","authors":["Xiaohan Ding","Yiyuan Zhang","Yixiao Ge","Sijie Zhao","Lin Song","Xiangyu Yue","Ying Shan"],"url":"https://arxiv.org/abs/2311.15599","pdfUrl":"https://arxiv.org/pdf/2311.15599v2","codeUrl":"https://github.com/AILab-CVC/UniRepLKNet","preprint":{"id":"2311.15599","submittedOn":"2023-11-27","url":"https://arxiv.org/abs/2311.15599"},"publication":{"venue":"CVPR","year":2024,"kind":"conference","url":"https://openaccess.thecvf.com/content/CVPR2024/html/Ding_UniRepLKNet_A_Universal_Perception_Large-Kernel_ConvNet_for_Audio_Video_Point_CVPR_2024_paper.html"},"citation":"@misc{reparameterizationunireplknet2023,\n  title = {{UniRepLKNet: A Universal Perception Large-Kernel ConvNet for Audio, Video, Point Cloud, Time-Series and Image Recognition}},\n  author = {Xiaohan Ding and Yiyuan Zhang and Yixiao Ge and Sijie Zhao and Lin Song and Xiangyu Yue and Ying Shan},\n  year = {2023},\n  eprint = {2311.15599},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2311.15599}\n}\n","citationPath":"/content/papers/citations/reparameterization/unireplknet.df5ca5b9a0be.bib"},"thumbnail":{"src":"/content/papers/assets/8dc0f2f7d7d64f92bea8485e2e00428225297bb13404dee50fe50f28385d34c8.png","width":1680,"height":384},"locale":"ja","path":"/content/papers/ja/reparameterization/unireplknet.3a5454a3701e.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"33の1層が3つの役割を担う","text":"3×3の1層が3つの役割を担う","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"基準となる構造","text":"基準となる構造","depth":3},{"id":"指針1安価な構造で深くする","text":"指針1：安価な構造で深くする","depth":3},{"id":"指針2小さなdilated畳み込みで再パラメータ化する","text":"指針2：小さなdilated畳み込みで再パラメータ化する","depth":3},{"id":"指針3カーネルサイズは下流タスクで決める","text":"指針3：カーネルサイズは下流タスクで決める","depth":3},{"id":"指針4深くするときは小さなカーネルを足す","text":"指針4：深くするときは小さなカーネルを足す","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"画像","text":"画像","depth":3},{"id":"ほかのモダリティ","text":"ほかのモダリティ","depth":3},{"id":"代償","text":"代償","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"reparameterization/replknet","relation":"referenced","topic":""},{"id":"classic-cnns/slak","relation":"referenced","topic":""},{"id":"lightweight/senet","relation":"referenced","topic":""}]}],"text":"畳み込みカーネルは大きくなり続けています。ConvNeXtは7×7、RepLKNetは31×31、SLaKは51×51まで広げ、UniRepLKNetは13×13を選び直しました。精度は上がっても、速度の問題は残ったままです。\n\ndepthwise畳み込みのFLOPsは少ないのに、カーネルを広げると急激に遅くなります。著者の測定では、標準のdepthwise畳み込みを5×5から13×13へ広げるとスループットが71〜78%、27×27なら92〜94%下がります。バッチや特徴マップの大きさにかかわらず、同じ傾向です。\n\nRepLKNetとUniRepLKNetは専用CUDA演算子を用意しており、この論文ではLKA（Large Kernel Acceleration）と呼びます。小さな特徴マップでは有効でも、大きくなると逆に遅くなります。224×224、バッチ128では、LKAの7×7は高速化なしの5×5より80%、13×13は89%遅くなります。検出、セグメンテーション、超解像は、大きな特徴マップが必要なタスクです。\n\n合肥工業大学、Lingyang Industrial Internet、高知工科大学の研究者は、データの読み込み方を最適化する代わりに、畳み込みを行列乗算で計算する方向へ進みました。\n\n\n> [!TIP]\n> \n> 大きなカーネルをたどる道は、こちらのノートを参照してください。\n> \n> - **[[22.03] RepLKNet：巨大なカーネル](/blog/papers/reparameterization/replknet)**\n> - **[[22.07] SLaK：カーネルPro Max](/blog/papers/classic-cnns/slak)**\n> - **[[23.11] UniRepLKNet：大きなカーネルで領域を越える](/blog/papers/reparameterization/unireplknet)**\n\n\n## 問題の定義\n\n### 畳み込みはデータを待っている\n\n[![原論文Figure 2の4パネル。(a) 5×5 depthwise畳み込みは赤い出力yへ周囲5行の各5マスから値を集め、離れた5行から25値を取ると記される。(b) WBMMの4×4ウィンドウでは8×8特徴マップをW0〜W3の4つの色付き非重複領域に分け、各領域から連続した16値を読む。(c) depthwiseのメモリアクセスは第1〜第5行の赤枠にfetch #1〜#5とあり、独立した5回の読み込み、幅に等しいstride、複数cache lineにまたがるworking set、1バイト当たりO(1)演算でmemory-boundと記される。(d) WBMMは4行の各4値を青枠で取り、window_partitionとreshapeで連続した16マスへ並べ、fetch #1だけで読む。連続アドレス、L1 cacheに収まるウィンドウ、1バイト当たりO(w²)演算でcompute-boundと記される。](/content/papers/assets/a830da4662436ed9b9ed1985cd4a866d805da44ae503db57f3af5ed78d1f3f63.png)](/content/papers/assets/a830da4662436ed9b9ed1985cd4a866d805da44ae503db57f3af5ed78d1f3f63.png)\n\n*Songらの原論文Figure 2。[**PDF 2ページ**](https://arxiv.org/pdf/2607.02097v2#page=2)より。原図のキャプションは省略。*\n\n原因はメモリアクセスです。特徴マップはメモリ上で行ごとに並びますが、各出力は上下$k$行からそれぞれ$k$値を集めます。同じ行内の$k$値は隣接していても、次の行へ進むには画像幅ぶん飛ぶ必要があり、全体は連続していません。\n\nカーネルが大きいほどまたぐ行が増え、キャッシュに収まりにくくなります。1値を読んでも積和演算は1回だけで、GPUの演算能力を使えず、ほとんどの時間をデータ待ちに費やします。\n\n## 問題の解決\n\n### 畳み込みを行列乗算で書く\n\n[![原論文Figure 1。左(a)はdepthwise畳み込みで、大きな入力格子Xの赤い位置(i, j)の周囲7×7を橙色で囲み、7×7カーネルWで49近傍を集め、y[i, j]を出力する。右(b)はWBMMで、Xを4色の7×7ウィンドウに分ける。上の相対位置表RはC × (2·7 − 1)² = C × 169で、index矢印を通してC × 49 × 49行列Mを作る。入力ウィンドウとMをBatched MatMulの緑矢印で掛け、同じ4区画の出力Yを得る。](/content/papers/assets/5c20ec217f297d24ad8ce71ca79936d0599f7b460167e3bb89f52515ff1347ee.png)](/content/papers/assets/5c20ec217f297d24ad8ce71ca79936d0599f7b460167e3bb89f52515ff1347ee.png)\n\n*Songらの原論文Figure 1。[**PDF 1ページ**](https://arxiv.org/pdf/2607.02097v2#page=1)より。原図のキャプションは省略。*\n\nWBMM（Windowed Batch Matrix Multiplication）は3段階です。\n\n1. **ウィンドウに分ける**：特徴マップを重複しない$w\\times w$へ分割します。たとえば7×7なら49値へ平坦化し、メモリ上で連続した領域へ並べます。\n2. **表から重みを作る**：各チャネルに$(2w-1)^2$サイズの相対位置表$R$を持ちます。7×7ウィンドウなら13×13 = 169パラメータです。位置$i$から$j$への重みを相対位置だけで引き、49×49行列$M$を組みます。\n3. **バッチ行列乗算**：同じチャネルの全ウィンドウが$M$を共有するので、チャネルをバッチ次元とし、1回の`bmm`で計算します。\n\n重みを相対位置だけで決めるのは、畳み込みそのものの定義です。定理3.2は、有界な特徴マップ上のdepthwise畳み込みを、相対位置で重みを決める行列乗算として正確に書けると証明します。各ウィンドウへ適用すると、WBMMは外側をすべて0とする13×13 depthwise畳み込みに等しくなります。実装して、ウィンドウごとの13×13畳み込みと比べます。\n\n```python\nimport torch\nimport torch.nn.functional as F\n\ntorch.manual_seed(0)\nC, H, W, w = 4, 14, 14, 7                       # 4チャネル、14×14特徴マップ、7×7ウィンドウ\nd = w * w                                        # 各ウィンドウ49位置\nR = torch.randn(C, (2 * w - 1) ** 2)             # 相対位置表：各チャネル13×13 = 169パラメータ\n\n# 相対位置index：ウィンドウ内の位置iからjを見るときに参照するマス\npos = torch.stack(torch.meshgrid(torch.arange(w), torch.arange(w), indexing=\"ij\")).flatten(1)  # 2 × 49\nrel = pos[:, None, :] - pos[:, :, None] + (w - 1)                                                # 2 × 49 × 49\nindex = rel[0] * (2 * w - 1) + rel[1]\n\nM = R[:, index]                                  # C × 49 × 49：表から重み行列を作る\n\n# 重複しないウィンドウへ分け、(C, ウィンドウ数, 49)に並べる\nx = torch.randn(1, C, H, W)\nnh, nw = H // w, W // w\nwindows = x.view(C, nh, w, nw, w).permute(0, 1, 3, 2, 4).reshape(C, nh * nw, d)\ny = torch.bmm(windows, M.transpose(1, 2))         # 各チャネルの全ウィンドウを1回のバッチ行列乗算で計算\ny = y.view(C, nh, nw, w, w).permute(0, 1, 3, 2, 4).reshape(1, C, H, W)\n\n# 比較：13×13 depthwise畳み込みをウィンドウごとに計算し、外側を0で埋める\nkernel = R.view(C, 1, 2 * w - 1, 2 * w - 1)\nref = torch.zeros_like(x)\nfor i in range(nh):\n    for j in range(nw):\n        patch = x[..., i * w:(i + 1) * w, j * w:(j + 1) * w]\n        ref[..., i * w:(i + 1) * w, j * w:(j + 1) * w] = F.conv2d(patch, kernel, padding=w - 1, groups=C)\n\nprint(\"重み行列：\", tuple(M.shape), \"、\", R.shape[1], \"パラメータの表から構成\")\nprint(\"ウィンドウ内13×13 depthwise畳み込みとの最大差：\", f\"{(y - ref).abs().max():.1e}\")\n```\n\n```text\n重み行列： (4, 49, 49) 、 169 パラメータの表から構成\nウィンドウ内13×13 depthwise畳み込みとの最大差： 2.9e-06\n```\n\n結果は同じで、差は浮動小数点誤差だけです。違うのはメモリ上の動作です。畳み込みは散らばる近傍を集めますが、WBMMは連続したウィンドウ全体を読み、GPUが得意な行列乗算へ渡します。\n\n### 大きなウィンドウほど速い\n\n直感に反する性質が生まれます。depthwise畳み込みはカーネルが大きいほど遅いのに、WBMMはウィンドウが大きいほど速くなります。\n\n$w\\times w$ウィンドウは$w^2$値を読み、行列乗算は$w^4$回の積和を行います。1値当たり$w^2$演算なので、大きいほど計算と読み込みの比が増え、GPUの仕事が増えます。$M$は$w^4$要素あっても、バッチ全体の全ウィンドウで共有し、1回の読み込みを分担できます。\n\n14×14では出力ごとに196回の積和を行い、5×5 depthwiseの約8倍、見る範囲は7.8倍です。演算子の実験はA800、FP32、256チャネルで、14×14 WBMMと標準5×5 depthwiseを比べます。\n\n| バッチ | 14×14特徴マップ | 28×28 | 56×56 | 112×112 | 224×224 |\n| ---: | ---: | ---: | ---: | ---: | ---: |\n| 4 | 0.45× | 0.37× | 1.41× | 1.64× | 2.02× |\n| 16 | 0.62× | 1.56× | 1.80× | 2.00× | 2.07× |\n| 64 | 1.86× | 1.85× | 2.01× | 2.01× | 2.03× |\n| 128 | 3.17× | 2.00× | 2.06× | 1.97× | 2.01× |\n| 256 | 3.72× | 2.02× | 2.02× | 1.95× | — |\n\n*表：原論文Table 1より。WBMMの5×5 depthwise畳み込みに対する速度倍率。*\n\n十分大きな特徴マップとバッチでは約2倍速くなります。両方小さいと逆に遅く、バッチ4、28×28では0.37倍です。\n\nSwinのウィンドウ注意とも違います。注意は各サンプル・各ウィンドウで入力依存行列とsoftmaxを計算しますが、WBMMの$M$は入力に依存せず、バッチ全体で共有し、推論時には事前計算して保存できます。\n\n### ウィンドウ間の情報交換を補う\n\n重複しないので情報はウィンドウの外へ出られません。著者はWBMMブロックの間に通常の3×3 depthwise畳み込みを挟み、隣接ウィンドウ間をつなぎます。\n\nセグメンテーションなどマルチスケールが必要なタスクには、階層的なウィンドウ再パラメータ化も使います。学習時に14×14の大ウィンドウと7×7の4小ウィンドウを、それぞれの相対位置表で並列に使います。推論前に小ウィンドウ行列を大行列の対角ブロックへ足して1つにし、追加コストをなくします。小カーネルを大カーネルへ融合するUniRepLKNetと同じ発想です。\n\nモデル全体はUniRepLKNetを基準に、大きなカーネルをWBMMへ替え、各ステージのWBMMと3×3ブロックの並びを調整します。\n\n## 考察\n\n### ImageNet\n\n| モデル | epoch当たりの学習時間 | 学習メモリ | top-1 |\n| --- | ---: | ---: | ---: |\n| WBMM-T | **6:18** | **15.0 GB** | 83.2% |\n| UniRepLKNet-T（LKAあり） | 9:03 | 16.6 GB | 83.2% |\n| UniRepLKNet-T（LKAなし） | 11:03 | 16.6 GB | 83.2% |\n| WBMM-S | **8:35** | **20.4 GB** | 83.9% |\n| UniRepLKNet-S（LKAあり） | 12:10 | 22.3 GB | 83.9% |\n\n*表：原論文Table 5の一部の行を抜粋。A800 8枚。*\n\n精度は同じで、学習は1.4倍以上速く、LKAなしなら差はさらに広がります。4サイズの加速は1.31〜1.88倍で、要旨の数値です。\n\nただし比較対象は、小さなdilated畳み込みの再パラメータ化分岐を複数持つUniRepLKNet全体です。付録には、ほかを固定して空間演算子だけを変えた、より公平な表があります。\n\n| 空間演算子 | epoch当たり | top-1 | ADE20K mIoU | 推論（枚／秒） |\n| --- | ---: | ---: | ---: | ---: |\n| WBMM（7×7ウィンドウ） | **6:20** | 83.0% | 48.3 | **1833** |\n| WBMM（14×14階層型） | 6:31 | 83.2% | **48.8** | 1842 |\n| 13×13 depthwise ＋ LKA | 6:43 | 83.1% | 48.3 | 1662 |\n| 13×13 depthwise（LKAなし） | 9:11 | 83.1% | 48.3 | 1305 |\n| 13×13 depthwise ＋ 再パラメータ化 ＋ LKA | 10:21 | 83.2% | 48.7 | 1662 |\n| 元のSLaK | 22:03 | 83.3% | 47.4 | 549 |\n| 7×7ウィンドウ注意 | 8:38 | 83.3% | 48.1 | 1245 |\n\n*表：原論文Table 8の一部の行を抜粋。すべてTinyサイズで同じ構造。*\n\n通常の13×13 depthwise＋LKAに対し、WBMMは学習が6%、推論が10%速いだけです。前の表の1.4倍の多くは、UniRepLKNetの複数分岐を除き10:21から6:20へ縮めた効果です。LKAなしとの比較なら1.4倍以上になります。\n\n本当の価値は、専用CUDA演算子を一切書かず、LKA並みかそれ以上の速度を得られる点です。\n\n### 物体検出とセグメンテーション\n\n| 方法 | ADE20K mIoU（シングルスケール） | COCO box AP | COCO mask AP |\n| --- | ---: | ---: | ---: |\n| UniRepLKNet-T | 48.6 | 51.8 | 44.9 |\n| WBMM-T（7×7） | 48.3 | 51.6 | 44.8 |\n| WBMM-T（階層型） | **48.8** | **51.9** | **45.1** |\n\n*表：原論文Table 6とTable 7より。ADE20KはUperNet、COCOはCascade Mask R-CNN。*\n\n7×7だけなら0.1〜0.3低く、階層的再パラメータ化を加えて初めて0.1〜0.2高くなり、パラメータも3M〜4M増えます。検出とセグメンテーションはほぼ互角で、利点は速度です。\n\n### ほかのハードウェア\n\n他装置でも測定しています。A800ではLKA付きUniRepLKNetの1.01〜1.28倍です。LKAを使えないIntel i7-13700K CPUではBLASで1.03〜1.48倍、Jetson Orin NanoではGPUのFP16で1.19〜3.12倍、CPUのINT8で1.33〜2.44倍です。どのハードウェアでも行列乗算は最適化されており、エッジ装置で特に有効です。\n\n### 制約\n\n著者は付録で制約を挙げます。$M$のサイズはウィンドウ辺長の4乗で増え、14×14・256チャネルの1層で約37.5 MB、28×28を超えると収まらなくなります。サイズはタスクに合わせて選ぶ必要があり、ADE20Kでは純粋な14×14が7×7より悪くなります。重みは入力非依存なので、内容に応じた調整が必要なタスクでは不十分かもしれません。\n\n## 結論\n\nWBMMはモデルの見る対象を変えません。各ウィンドウ内では13×13 depthwise畳み込みそのもので、変えるのはメモリ上の並べ方と演算子です。バッチ行列乗算へ替えると、データ待ちから計算主体へ移り、大きなウィンドウほど速くなります。\n\n表は比較対象を見分ける必要があります。要旨の1.31〜1.88倍はUniRepLKNet全体との比較で、演算子だけならLKA付きdepthwiseに対する学習高速化は6%です。省けるのは専用CUDA演算子です。\n\n高解像度で大きなカーネルの速度に困っているなら、試す価値があります。PyTorchの`bmm`だけでよく、上のデモ前半が中心ロジックのすべてです。CUDA拡張をコンパイルする必要もありません。\n","imageSizes":{"/content/papers/assets/a830da4662436ed9b9ed1985cd4a866d805da44ae503db57f3af5ed78d1f3f63.png":{"width":1032,"height":864},"/content/papers/assets/5c20ec217f297d24ad8ce71ca79936d0599f7b460167e3bb89f52515ff1347ee.png":{"width":1017,"height":360}}}
