{"notes":[{"id":"classic-cnns/dcnv4","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"DCNv4","subtitle":"重みに上限を設けない","author":"Z. Yuan","paperDate":"2024-01-11","publishedOn":"2025-12-29","paperTitle":"Efficient Deformable ConvNets: Rethinking Dynamic and Sparse Operator for Vision Applications","paperUrl":"https://arxiv.org/abs/2401.06197","bibliography":{"title":"Efficient Deformable ConvNets: Rethinking Dynamic and Sparse Operator for Vision Applications","authors":["Yuwen Xiong","Zhiqi Li","Yuntao Chen","Feng Wang","Xizhou Zhu","Jiapeng Luo","Wenhai Wang","Tong Lu","Hongsheng Li","Yu Qiao","Lewei Lu","Jie Zhou","Jifeng Dai"],"url":"https://arxiv.org/abs/2401.06197","pdfUrl":"https://arxiv.org/pdf/2401.06197v1","codeUrl":"https://github.com/OpenGVLab/DCNv4","preprint":{"id":"2401.06197","submittedOn":"2024-01-11","url":"https://arxiv.org/abs/2401.06197"},"publication":{"venue":"CVPR","year":2024,"kind":"conference","url":"https://openaccess.thecvf.com/content/CVPR2024/html/Xiong_Efficient_Deformable_ConvNets_Rethinking_Dynamic_and_Sparse_Operator_for_Vision_CVPR_2024_paper.html"},"citation":"@misc{classiccnnsdcnv42024,\n  title = {{Efficient Deformable ConvNets: Rethinking Dynamic and Sparse Operator for Vision Applications}},\n  author = {Yuwen Xiong and Zhiqi Li and Yuntao Chen and Feng Wang and Xizhou Zhu and Jiapeng Luo and Wenhai Wang and Tong Lu and Hongsheng Li and Yu Qiao and Lewei Lu and Jie Zhou and Jifeng Dai},\n  year = {2024},\n  eprint = {2401.06197},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2401.06197}\n}\n","citationPath":"/content/papers/citations/classic-cnns/dcnv4.f17f87f8ee11.bib"},"thumbnail":{"src":"/content/papers/assets/fe768f9a1b9df098fd7de1ed2c34ba0713cb83936e024d45ca26e85a2b340ff1.png","width":1020,"height":522},"locale":"ja","path":"/content/papers/ja/classic-cnns/dcnv4.779a963baf25.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"9点しか見ないのになぜ遅いのか","text":"9点しか見ないのになぜ遅いのか","depth":3},{"id":"softmaxは注意から借りたもの","text":"softmaxは注意から借りたもの","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"1softmaxを除く","text":"1．softmaxを除く","depth":3},{"id":"2gpuのデータ転送を減らす","text":"2．GPUのデータ転送を減らす","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"演算子単体","text":"演算子単体","depth":3},{"id":"flashinternimage","text":"FlashInternImage","depth":3},{"id":"別のネットワークへ組み込む","text":"別のネットワークへ組み込む","depth":3},{"id":"代償","text":"代償","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/internimage","relation":"referenced","topic":""},{"id":"classic-cnns/deformable-convnets","relation":"referenced","topic":""}]},{"id":"classic-cnns/internimage","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"InternImage","subtitle":"力業で奇跡は起きる？","author":"Z. Yuan","paperDate":"2022-11-10","publishedOn":"2025-09-04","world":"external/internimage","paperTitle":"InternImage: Exploring Large-Scale Vision Foundation Models with Deformable Convolutions","paperUrl":"https://arxiv.org/abs/2211.05778","bibliography":{"title":"InternImage: Exploring Large-Scale Vision Foundation Models with Deformable Convolutions","authors":["Wenhai Wang","Jifeng Dai","Zhe Chen","Zhenhang Huang","Zhiqi Li","Xizhou Zhu","Xiaowei Hu","Tong Lu","Lewei Lu","Hongsheng Li","Xiaogang Wang","Yu Qiao"],"url":"https://arxiv.org/abs/2211.05778","pdfUrl":"https://arxiv.org/pdf/2211.05778v4","codeUrl":null,"preprint":{"id":"2211.05778","submittedOn":"2022-11-10","url":"https://arxiv.org/abs/2211.05778"},"publication":{"venue":"CVPR","year":2023,"kind":"conference","url":"https://openaccess.thecvf.com/content/CVPR2023/html/Wang_InternImage_Exploring_Large-Scale_Vision_Foundation_Models_With_Deformable_Convolutions_CVPR_2023_paper.html"},"citation":"@misc{classiccnnsinternimage2022,\n  title = {{InternImage: Exploring Large-Scale Vision Foundation Models with Deformable Convolutions}},\n  author = {Wenhai Wang and Jifeng Dai and Zhe Chen and Zhenhang Huang and Zhiqi Li and Xizhou Zhu and Xiaowei Hu and Tong Lu and Lewei Lu and Hongsheng Li and Xiaogang Wang and Yu Qiao},\n  year = {2022},\n  eprint = {2211.05778},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2211.05778}\n}\n","citationPath":"/content/papers/citations/classic-cnns/internimage.4baca0899bc9.bib"},"thumbnail":{"src":"/content/papers/assets/eb597a4ac9a7c2e5e9b05e8ff1c61a951adab71d5cc5a273796762d353a9a0e9.png","width":1012,"height":1179},"locale":"ja","path":"/content/papers/ja/classic-cnns/internimage.d096fceb3441.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"畳み込みはどこで負けているのか","text":"畳み込みはどこで負けているのか","depth":3},{"id":"dcnv2をそのまま使えない理由","text":"DCNv2をそのまま使えない理由","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"dcnv3の三つの変更","text":"DCNv3の三つの変更","depth":3},{"id":"ネットワークに積み上げる","text":"ネットワークに積み上げる","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"imagenet","text":"ImageNet","depth":3},{"id":"検出とセグメンテーション","text":"検出とセグメンテーション","depth":3},{"id":"アブレーションsoftmaxの項目","text":"アブレーション：softmaxの項目","depth":3},{"id":"代償","text":"代償","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/deformable-convnets","relation":"referenced","topic":""},{"id":"reparameterization/replknet","relation":"referenced","topic":""},{"id":"classic-cnns/slak","relation":"referenced","topic":""}]},{"id":"classic-cnns/deformable-convnets","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Deformable ConvNets","subtitle":"八艘飛び","author":"Z. Yuan","paperDate":"2017-03-17","publishedOn":"2024-05-01","world":"external/deformable-convnets","paperTitle":"Deformable Convolutional Networks","paperUrl":"https://arxiv.org/abs/1703.06211","bibliography":{"title":"Deformable Convolutional Networks","authors":["Jifeng Dai","Haozhi Qi","Yuwen Xiong","Yi Li","Guodong Zhang","Han Hu","Yichen Wei"],"url":"https://arxiv.org/abs/1703.06211","pdfUrl":"https://arxiv.org/pdf/1703.06211v3","codeUrl":null,"preprint":{"id":"1703.06211","submittedOn":"2017-03-17","url":"https://arxiv.org/abs/1703.06211"},"publication":{"venue":"ICCV","year":2017,"kind":"conference","url":"https://openaccess.thecvf.com/content_iccv_2017/html/Dai_Deformable_Convolutional_Networks_ICCV_2017_paper.html"},"citation":"@misc{classiccnnsdeformableconvnets2017,\n  title = {{Deformable Convolutional Networks}},\n  author = {Jifeng Dai and Haozhi Qi and Yuwen Xiong and Yi Li and Guodong Zhang and Han Hu and Yichen Wei},\n  year = {2017},\n  eprint = {1703.06211},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1703.06211}\n}\n","citationPath":"/content/papers/citations/classic-cnns/deformable-convnets.f724f3ff1784.bib"},"thumbnail":{"src":"/content/papers/assets/942dcd98b1119ce95e8a9a24b84ed42b780d062caafa004c66f75640c4e2584a.png","width":987,"height":633},"locale":"ja","path":"/content/papers/ja/classic-cnns/deformable-convnets.36d236ad40bc.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"固定された格子","text":"固定された格子","depth":3},{"id":"ネットワークに変形を学ばせる試みはすでにあった","text":"ネットワークに変形を学ばせる試みはすでにあった","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"畳み込みの二つのステップ","text":"畳み込みの二つのステップ","depth":3},{"id":"各点にオフセットを加える","text":"各点にオフセットを加える","depth":3},{"id":"小数の位置からどう値を取るか","text":"小数の位置からどう値を取るか","depth":3},{"id":"オフセットはどこから来るのか","text":"オフセットはどこから来るのか","depth":3},{"id":"二つの特殊な場合","text":"二つの特殊な場合","depth":3},{"id":"変形可能roi-pooling","text":"変形可能RoI pooling","depth":3},{"id":"ネットワークに組み込む","text":"ネットワークに組み込む","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"受容野は本当に物体に合わせて変わる","text":"受容野は本当に物体に合わせて変わる","depth":3},{"id":"何層置き換えるか","text":"何層置き換えるか","depth":3},{"id":"膨張畳み込みと比べる","text":"膨張畳み込みと比べる","depth":3},{"id":"代償","text":"代償","depth":3},{"id":"coco","text":"COCO","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/stn","relation":"referenced","topic":""},{"id":"object-detection/deformable-detr","relation":"referenced","topic":""}]}],"text":"InternImageのアブレーションで、DCNv3の変調重みをsoftmaxからsigmoidへ戻すと、ImageNet精度は83.5%から65.7%へ下がりました。softmaxはDCNv3に欠かせないように見えます。\n\n1年以上後、ほぼ同じ研究者たちがDCNv4を発表しました。最初の変更はsoftmaxを取り除くことで、しかも元より速く収束します。\n\n筆頭著者のYuwen Xiongは2017年の初代deformable convolutionの著者の1人で、責任著者のJifeng Daiは初代の筆頭著者です。今回はトロント大学、上海人工知能研究所、清華大学、SenseTime、香港中文大学などのチームです。softmaxに加え、論文のもう半分では、わずか9点をサンプリングするdeformable convolutionが、なぜ7×7 depthwise畳み込みより遅いのかを問います。\n\n\n> [!TIP]\n> \n> DCNv3とInternImageの設計、初代deformable convolutionについては、先にこちらの2本を読めます。\n> \n> - **[[22.11] InternImage：力業で奇跡は起きる？](/blog/papers/classic-cnns/internimage)**\n> - **[[17.03] Deformable ConvNets：八艘飛び](/blog/papers/classic-cnns/deformable-convnets)**\n\n\n[![原論文Figure 1。(a) 棒グラフの横軸は3種類の入力テンソルサイズ（56×56×128、28×28×256、14×14×512）、縦軸はDCNv3を1とする相対実行時間。各組にはFlashAttention、Window Attention、DWConv、DCNv3、DCNv4の5本があり、DCNv4は最初の2組で最短、3組目でFlashAttentionと同程度。56×56×128ではDCNv3の3.76倍速いと記される。(b) 横軸は学習反復数（0〜15K）、縦軸はImageNet top-1精度。DCNv4が序盤で先行し、DWConvとDense Attentionが中間、DCNv3が序盤は最低。](/content/papers/assets/5a7b5fe22fc3c1bf41919d57fbcca8c73c4d14c00875c73ce999527f2f9ae54e.png)](/content/papers/assets/5a7b5fe22fc3c1bf41919d57fbcca8c73c4d14c00875c73ce999527f2f9ae54e.png)\n\n*Xiongらの原論文Figure 1。[**PDF 1ページ**](https://arxiv.org/pdf/2401.06197v1#page=1)より。原図のキャプションは省略。*\n\n左は速度で、DCNv3を1とし、短いほど高速です。DCNv4は最初の2サイズで最速、14×14×512ではFlashAttentionと同程度です。右は同じネットワークで演算子だけを変えた学習序盤の精度です。DCNv4が先行し、DCNv3は最下位です。\n\n## 問題の定義\n\n### 9点しか見ないのになぜ遅いのか\n\nDCNv3を振り返ります。位置$p_0$で、第$g$チャネルグループの出力は\n\n$$\ny_g(p_0)=\\sum_{k=1}^{K} m_{gk}\\, x_g\\!\\left(p_0+p_k+\\Delta p_{gk}\\right),\n$$\n\nです。$K=9$は3×3グリッドのサンプリング点数、$\\Delta p_{gk}$は学習したオフセット、$m_{gk}$は変調重みで、DCNv3では$K$方向にsoftmaxを適用します。オフセットも重みも入力から計算し、位置ごとに異なります。\n\n9点だけを見る疎な演算子なら、7×7 depthwise畳み込みや密な注意より速そうですが、実際はメモリアクセスが障害になります。\n\n著者はrooflineモデルで分析します。入出力が$H\\times W\\times C$のとき、DCNv3の計算量は$36HWC$ FLOPsです。9つの点でそれぞれ4ピクセルを使う双線形補間を行います。理想的に各値をメモリから1回だけ読むなら、メモリアクセス量は約$3.7HWC$です。\n\nところが並列計算では多数のスレッドが同時にデータを読み、キャッシュヒットを保証できません。最悪の場合、出力位置ごとに補間用36ピクセルと、オフセット・重み27値（9点それぞれオフセット2個、重み1個）を読み直し、結果を1個書き戻します。アクセス量は$64HWC$と、理想の17倍になります。\n\n計算量とメモリアクセス量の比は0.6〜9.7しかなく、rooflineモデルではメモリ帯域に制約される領域です。GPUの演算性能が高くても使い切れません。\n\n### softmaxは注意から借りたもの\n\nもう1つの問題はsoftmaxです。DCNv3は注意機構から借りていますが、注意側には必要な理由があります。\n\nスケーリング付き内積注意は$\\mathrm{softmax}(QK^\\top/\\sqrt{d})V$です。softmaxを除くと$K^\\top V$を先に計算し、$d\\times d$行列を得られます。同じウィンドウ内のすべてのqueryに同じ行列を掛けることになり、注意は単なる線形射影へ退化します。\n\n畳み込みとDCNv3にはこの問題がありません。各位置が独自のサンプリングウィンドウを持ち、中の値も異なります。「key」の概念がないので、正規化も不要です。\n\n検証のため、著者は逆にConvNeXtの7×7 depthwise畳み込みの重みにsoftmaxを加えます。\n\n| モデル | 5 epoch | 10 epoch | 20 epoch | 50 epoch | 300 epoch |\n| --- | ---: | ---: | ---: | ---: | ---: |\n| ConvNeXt | 29.9% | 53.5% | 66.1% | 74.8% | 83.8% |\n| ConvNeXt + softmax | 8.5% | 25.3% | 51.1% | 69.1% | 81.6% |\n\n*表：原論文Table 1より。ImageNet-1K top-1。*\n\nsoftmaxを加えると収束が明らかに遅くなり、学習終了時も2.2ポイント低くなります。\n\nsoftmaxは各重みを0〜1、総和を1に制限するので、出力はサンプリング値の加重平均に限られます。加重平均は必ず最小値と最大値の間に収まり、「引き算」はできません。エッジ検出のような基本的なフィルタは引き算を使います。2種類の重みで「右から左を引く」フィルタを学習させます。\n\n```python\nimport torch\n\ntorch.manual_seed(0)\nx = torch.randn(1000, 3)                     # 1000位置で、それぞれ左・中央・右の3点をサンプリング\ntarget = x[:, 2] - x[:, 0]                   # 学びたいのは「右から左を引く」、最も単純なエッジ検出\n\nfor name, to_weight in [(\"softmaxの重み\", lambda z: z.softmax(0)), (\"制限なしの重み\", lambda z: z)]:\n    z = torch.zeros(3, requires_grad=True)\n    opt = torch.optim.Adam([z], lr=0.1)\n    for _ in range(500):\n        loss = ((x @ to_weight(z) - target) ** 2).mean()\n        opt.zero_grad()\n        loss.backward()\n        opt.step()\n    w = to_weight(z).detach()\n    print(f\"{name}：左 {w[0]:+.2f}  中央 {w[1]:+.2f}  右 {w[2]:+.2f}  誤差 {loss.item():.3f}\")\nprint(f\"目標自体の分散：{target.var():.3f}\")\n```\n\n```text\nsoftmaxの重み：左 +0.00  中央 +0.00  右 +1.00  誤差 0.995\n制限なしの重み：左 -1.00  中央 +0.00  右 +1.00  誤差 0.000\n目標自体の分散：2.008\n```\n\n制限なしの重みはそのまま$(-1, 0, 1)$を学びます。softmaxは負の重みを出せず、最良でも右の点へすべてを割り当てるしかなく、誤差は半分ほど残ります。\n\n[![原論文Figure 2。同じチャネル内の異なるqueryピクセルによる空間集約を4つの図で比較する。左上の凡例では星がqueryピクセル、四角が応答ピクセルで、色の値域は(0, 1)と(−∞, +∞)。(a) AttentionはウィンドウShared/Fixed、重みDynamic、値域Bounded。(b) DCNv3はDedicated/Adaptive、Dynamic、Bounded。(c) ConvolutionはDedicated/Fixed、Static、Unbounded。(d) DCNv4はDedicated/Adaptive、Dynamic、Unbounded。](/content/papers/assets/fe768f9a1b9df098fd7de1ed2c34ba0713cb83936e024d45ca26e85a2b340ff1.png)](/content/papers/assets/fe768f9a1b9df098fd7de1ed2c34ba0713cb83936e024d45ca26e85a2b340ff1.png)\n\n*Xiongらの原論文Figure 2。[**PDF 3ページ**](https://arxiv.org/pdf/2401.06197v1#page=3)より。原図のキャプションは省略。*\n\n図は4つの演算子を並べます。注意の重みは動的ですが、範囲が制限されます。畳み込みは無制限ですが、重みとウィンドウ形状が固定です。DCNv4が目指す右下では、各位置が独自の変形可能なウィンドウを持ち、入力に応じて重みが変わり、しかも上限がありません。\n\n## 問題の解決\n\n### 1．softmaxを除く\n\n式はDCNv3と同じですが、$m_{gk}$をsoftmaxに通さず、線形層で入力から直接予測します。任意の実数を取れます。\n\nsoftmaxを除くと副次的な利点もあります。元はオフセットと重みを2つの線形層で計算していましたが、1つにまとめてkernelの起動と同期を1回減らせます。オフセット計算用のサブネットワークも簡略化します。元のdepthwise 3×3、LayerNorm、GELU、線形層から、中間のLayerNormとGELUを除き、Xceptionのような単純な分離可能畳み込みへ戻します。\n\n### 2．GPUのデータ転送を減らす\n\n[![原論文Figure 3。DCNv3とDCNv4のスレッド分担を左右で比較する。両方とも左にGPUメモリ内のオフセットと重み、右にH・W・Cの立方体状の出力テンソルがある。(a) DCNv3はThread-1〜Thread-6が各1チャネルを担当し、それぞれメモリ読み込みを要求する。(b) DCNv4はThread-1〜Thread-3が同じグループ内の2チャネルずつを担当し、読み込み要求が半減する。右上にはメモリアクセスが2分の1になると記される。](/content/papers/assets/db5cc5d4b75082f8705ba96857cd9bf56bd46cfb53a7946d53500fabcace0dd5.png)](/content/papers/assets/db5cc5d4b75082f8705ba96857cd9bf56bd46cfb53a7946d53500fabcace0dd5.png)\n\n*Xiongらの原論文Figure 3。[**PDF 4ページ**](https://arxiv.org/pdf/2401.06197v1#page=4)より。原図のキャプションは省略。*\n\nDCNv3の元のCUDA実装は$H\\times W\\times C$スレッドを起動し、各スレッドが1位置の1チャネルを担当します。しかし同一グループの$D=C/G$チャネルは、同じ位置で同じオフセットと重みを共有します。$D$個のスレッドが同じデータを読み、双線形補間の係数もそれぞれ計算していました。\n\nDCNv4では1スレッドが同じグループの複数チャネルを担当し、オフセットと重みの読み込み、補間係数の計算をそれぞれ1回にします。図では描きやすさのため2チャネルですが、実装は8チャネルです。\n\n面白いことに、これだけでは逆に遅くなります。スレッド数が減って並列度が落ち、各スレッドの仕事量が8倍になるからです。本当の高速化は次の手順から来ます。チャネルはメモリ上で連続して並ぶchannel-lastなので、隣接する値を1つのベクトル化命令で読み込めます。たとえば32ビット浮動小数点数4つを、個別ではなく128ビットの1回の読み込みにまとめます。書き戻しも同様です。\n\n著者は各手順の効果を分けて測定します。入力56×56×128、バッチ64、4グループ（各32チャネル）で、単位はミリ秒です。\n\n| 実装 | モジュール全体 | CUDA kernel |\n| --- | ---: | ---: |\n| 元のDCNv3 | 3.28 | 1.45 |\n| モジュール設計を簡略化 | 2.12 | 1.45 |\n| 1スレッドで8チャネルを処理 | 2.20 | 1.53 |\n| 補間係数を再利用 | 2.18 | 1.51 |\n| 読み書きをベクトル化 | 1.28 | 0.606 |\n| 半精度へ変更 | **0.873** | **0.404** |\n\n*表：原論文Table 10より。A100。*\n\nモジュール設計の簡略化はkernel外だけを変えるので、kernel時間は同じです。次の2手順でkernelは少し遅くなりますが、ベクトル化すると6割減ります。半精度では1値が2バイトになり、同じ帯域で2倍のデータを運べます。著者によると元のDCNv3は半精度にしても速くならず、新しい実装で初めてこの利点が生きます。\n\n## 考察\n\n### 演算子単体\n\nまず演算子を比べます。入力56×56×128で、FP32とFP16を測定します。\n\n| 演算子 | FP32（ms） | FP16（ms） |\n| --- | ---: | ---: |\n| グローバル注意（PyTorch） | 30.8 | 19.3 |\n| FlashAttention-2 | — | 2.46 |\n| 7×7ウィンドウ注意 | 4.05 | 1.46 |\n| 7×7 DWConv（PyTorch） | 2.02 | 1.98 |\n| 7×7 DWConv（cuDNN） | 0.981 | 0.438 |\n| DCNv3 | 1.45 | 1.52 |\n| DCNv4 | **0.606** | **0.404** |\n\n*表：原論文Table 2の最初の列より。FlashAttention-2にはFP32版がない。*\n\nDCNv4はcuDNNの7×7 depthwise畳み込みより速く、FP32では実行時間が約4割短くなります。DCNv3の行も先ほどの説明を裏付け、FP16にすると少し遅くなっています。\n\n### FlashInternImage\n\nInternImageのDCNv3だけをDCNv4へ置き換えたものを、著者はFlashInternImageと呼びます。スループットをFP32とFP16で測定します。\n\n| モデル | top-1 | スループット（FP32 / FP16、枚／秒） |\n| --- | ---: | ---: |\n| ConvNeXt-T | 82.1% | 2485 / 4305 |\n| InternImage-T | 83.5% | 1409 / 1746 |\n| FlashInternImage-T | **83.6%** | 2316 / 3154 |\n| ConvNeXt-S | 83.1% | 1645 / 2538 |\n| InternImage-S | 84.2% | 1044 / 1321 |\n| FlashInternImage-S | **84.4%** | 1625 / 2396 |\n| ConvNeXt-B | 83.8% | 1241 / 1888 |\n| InternImage-B | 84.9% | 779 / 1030 |\n| FlashInternImage-B | **84.9%** | 1174 / 1816 |\n\n*表：原論文Table 4の一部の行を抜粋。*\n\nInternImageに対し、Tは64〜80%速く、精度もわずかに高くなります。\n\nConvNeXtとの比較は注意が必要です。FP16のFlashInternImage-TはConvNeXt-Tの7割強の速度にとどまり、SとBも約95%と少し遅くなります。DCNv4がInternImageをConvNeXtに近い速度へ引き上げ、ConvNeXtより1.1〜1.5ポイント高い精度を得た、という表現が公平です。\n\n下流タスクも同じ傾向です。COCOでMask R-CNNを12 epoch学習すると、FlashInternImage-Tのbox APは48.0、InternImage-Tは47.2で、FPSは54 / 69から72 / 102へ上がります。ADE20KのUperNetではシングルスケールmIoUが47.9から49.3へ上がります。\n\n### 別のネットワークへ組み込む\n\n著者はDCNv4を部品として別の構造へそのまま差し込み、設定とハイパーパラメータを固定した実験も行います。\n\n- **ConvNeXt-B**：7×7 depthwise畳み込みを置き換えると、ImageNetは83.8%から84.0%、スループットは20%（FP32）、33%（FP16）増加します。\n- **ViT-B**：注意を置き換えると81.8%から81.9%へ上がり、FlashAttention-2を使う元の版よりスループットが24%、17%増加します。\n- **潜在拡散モデルのU-Net**：注意モジュールと通常の3×3畳み込みを置き換えると、ImageNet 256×256のクラス条件付き生成でFIDが2.94から2.44、パラメータ数が860Mから566Mへ減ります。\n\n各構造は元の演算子に合わせて調整されていたのに、DCNv4へそのまま替えても精度は同等か少し良くなり、速度も上がります。生成については、構造とハイパーパラメータがDCNv4に最適とは限らず、まだ調整の余地があると著者は述べています。\n\n### 代償\n\nDCNv4は依然として独自のCUDA演算子です。公式repoのissueでは、コンパイル失敗、モジュールが見つからない、CPU非対応、ONNXやTensorRTへの変換で行き詰まるといった問題が多く、repoの最終pushは2024年5月です。\n\n論文と異なる結果の報告もあります。自身のセグメンテーションで[DCNv3より学習が遅い](https://github.com/OpenGVLab/DCNv4/issues/54)という例や、公式測定コードを3090で動かして[論文より遅かった](https://github.com/OpenGVLab/DCNv4/issues/106)という例です。YOLOなど自分のモデルへ入れて、[lossが下がらない](https://github.com/OpenGVLab/DCNv4/issues/80)、[NaNが出る](https://github.com/OpenGVLab/DCNv4/issues/105)という報告も複数あります。いずれも完全な設定や公式回答がなく、原因は不明です。\n\n本稿の推測では、softmaxによる重みの上限がなくなった分、別のネットワークでは初期化や学習率を調整し直す必要があるのかもしれません。論文の成功例はInternImageのようなdeformable convolution向けの構造か、著者が調整した設定によるものです。\n\n## 結論\n\nDCNv4は2つのことを行いました。softmaxを除き、通常の畳み込みと同じく重みの上限をなくして収束を速めたこと。そしてCUDA kernelを書き直し、同じグループのチャネルで読み込みを共有し、ベクトル化命令で複数チャネルをまとめて転送して、演算子を3倍以上速めたことです。\n\nInternImageを使っているなら、FlashInternImageへの変更はほぼ追加負担なしの高速化です。自分のモデルへ入れるなら半精度を有効にしましょう。DCNv4はFP16で最速になります。最初の数百ステップのlossも注意して確認します。\n\n論文の題名は「動的で疎な演算子の再考」です。読み終えると、速度改善の大部分は、同じグループのオフセットを何回メモリから読むべきか、という素朴な問いから生まれています。\n","imageSizes":{"/content/papers/assets/5a7b5fe22fc3c1bf41919d57fbcca8c73c4d14c00875c73ce999527f2f9ae54e.png":{"width":1020,"height":546},"/content/papers/assets/fe768f9a1b9df098fd7de1ed2c34ba0713cb83936e024d45ca26e85a2b340ff1.png":{"width":1020,"height":522},"/content/papers/assets/db5cc5d4b75082f8705ba96857cd9bf56bd46cfb53a7946d53500fabcace0dd5.png":{"width":1020,"height":426}}}
