{"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":"zh-hant","path":"/content/papers/zh-hant/classic-cnns/dcnv4.6e861d751ac3.md","headings":[{"id":"定義問題","text":"定義問題","depth":2},{"id":"只取樣-9-個點為什麼不快","text":"只取樣 9 個點，為什麼不快","depth":3},{"id":"softmax-是借來的","text":"softmax 是借來的","depth":3},{"id":"解決問題","text":"解決問題","depth":2},{"id":"一拿掉-softmax","text":"一、拿掉 softmax","depth":3},{"id":"二讓-gpu-少搬資料","text":"二、讓 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":"zh-hant","path":"/content/papers/zh-hant/classic-cnns/internimage.ace4173a8cfd.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":"zh-hant","path":"/content/papers/zh-hant/classic-cnns/deformable-convnets.c8fe7262b5e2.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\n一年多後，大致是同一群人推出了 DCNv4，第一項改動就是把 softmax 拿掉，而且收斂得比原本更快。\n\n第一作者 Yuwen Xiong 是 2017 年第一代可變形卷積的作者之一，通訊作者 Jifeng Dai 則是第一代的第一作者。這次的團隊來自多倫多大學、上海人工智慧實驗室、清華、商湯、港中文等單位。除了 softmax，這篇另一半的篇幅在問，可變形卷積明明只取樣 9 個點，為什麼跑得比 7×7 的 depthwise 卷積還慢？\n\n\n> [!TIP]\n> \n> DCNv3 和 InternImage 的設計，以及第一代可變形卷積，可以先看這兩篇：\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) 長條圖，橫軸是三種輸入張量大小（56×56×128、28×28×256、14×14×512），縱軸是以 DCNv3 為 1 的相對執行時間；每組有 FlashAttention、Window Attention、DWConv、DCNv3、DCNv4 五根長條，DCNv4 在前兩組最短，第三組和 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*原論文 Figure 1（Xiong 等人），取自 [**PDF 第 1 頁**](https://arxiv.org/pdf/2401.06197v1#page=1)。圖說未收錄。*\n\n左圖是速度，DCNv3 是 1，越短越快，DCNv4 在前兩種大小最快，到了 14×14×512 和 FlashAttention 差不多。右圖是同一個網路架構換不同運算子，訓練初期的準確率，DCNv4 一路領先，DCNv3 反而墊底。\n\n## 定義問題\n\n### 只取樣 9 個點，為什麼不快\n\n先複習一下 DCNv3。對位置 $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\n照理說，只看 9 個點的稀疏運算子，應該比 7×7 的 depthwise 卷積或密集的注意力快。實際上不是，問題出在記憶體存取。\n\n作者用 roofline 模型分析。輸入輸出都是 $H\\times W\\times C$ 時，DCNv3 的計算量是 $36HWC$ FLOPs，9 個取樣點各要做一次雙線性插值，每次牽涉 4 個像素。理想情況下，每個數值只從記憶體讀一次，記憶體存取量大約是 $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另一個問題是 softmax。DCNv3 的 softmax 是向注意力機制借來的，可是注意力需要 softmax 有它的理由。\n\n縮放點積注意力是 $\\mathrm{softmax}(QK^\\top/\\sqrt{d})V$。拿掉 softmax，就可以先算 $K^\\top V$，得到一個 $d\\times d$ 的矩陣，同一個視窗裡的所有查詢都乘上同一個矩陣，注意力就退化成一個線性投影。\n\n卷積和 DCNv3 沒有這個問題。每個位置本來就有自己的取樣視窗，視窗裡的值本來就各不相同，沒有「key」的概念，也就不需要正規化。\n\n為了驗證，作者反過來在 ConvNeXt 的 7×7 depthwise 卷積權重上加 softmax：\n\n| 模型 | 第 5 個 epoch | 第 10 個 | 第 20 個 | 第 50 個 | 第 300 個 |\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\n加了 softmax，收斂明顯變慢，訓練完也少了 2.2 個百分點。\n\nsoftmax 把每個權重限制在 0 到 1 之間，加總是 1，輸出就只能是取樣值的加權平均。加權平均永遠落在最小值和最大值之間，做不出「相減」這種運算，而邊緣偵測這類最基本的濾波器就是在相減。我們讓兩種權重去學一個「右邊減左邊」的濾波器：\n\n```python\nimport torch\n\ntorch.manual_seed(0)\nx = torch.randn(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：四格示意圖，比較同一個通道裡不同位置的查詢像素如何做空間聚合，左上角圖例說明星號是查詢像素、方格是回應像素，顏色條分成 (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*原論文 Figure 2（Xiong 等人），取自 [**PDF 第 3 頁**](https://arxiv.org/pdf/2401.06197v1#page=3)。圖說未收錄。*\n\n這張圖把四種運算子放在一起比。注意力的權重會變，可是有上限；卷積沒有上限，可是權重固定、視窗形狀固定。DCNv4 想要的是右下角，每個位置有自己會變形的視窗，權重隨輸入變化，而且沒有上限。\n\n## 解決問題\n\n### 一、拿掉 softmax\n\n公式和 DCNv3 一樣，只是 $m_{gk}$ 不再過 softmax，直接由一個線性層從輸入預測，可以是任何實數。\n\nsoftmax 拿掉之後，還有一個附帶的好處。原本算偏移量和算權重是兩個線性層，現在可以合成一個，少一次 kernel 啟動和同步。作者也把計算偏移量的子網路簡化，原本是 depthwise 3×3、LayerNorm、GELU 再接線性層，現在拿掉中間的 LayerNorm 和 GELU，回到 Xception 那種單純的可分離卷積。\n\n### 二、讓 GPU 少搬資料\n\n[![原論文 Figure 3：左右兩張示意圖，比較 DCNv3 與 DCNv4 的執行緒分工。兩邊左側都是 GPU 記憶體中的一組偏移量與權重，右側是立方體狀的輸出張量（H、W、C）。(a) DCNv3 有 Thread-1 到 Thread-6 六個執行緒，各自負責一個通道，每個都發出一次記憶體讀取請求；(b) DCNv4 只有 Thread-1 到 Thread-3，每個執行緒負責同一組裡的兩個通道，讀取請求少了一半，右上角標註記憶體存取少 2 倍。](/content/papers/assets/db5cc5d4b75082f8705ba96857cd9bf56bd46cfb53a7946d53500fabcace0dd5.png)](/content/papers/assets/db5cc5d4b75082f8705ba96857cd9bf56bd46cfb53a7946d53500fabcace0dd5.png)\n\n*原論文 Figure 3（Xiong 等人），取自 [**PDF 第 4 頁**](https://arxiv.org/pdf/2401.06197v1#page=4)。圖說未收錄。*\n\nDCNv3 原本的 CUDA 實作開 $H\\times W\\times C$ 個執行緒，一個執行緒負責一個位置的一個通道。可是同一組的 $D=C/G$ 個通道，在同一個位置共用同一組偏移量和權重，結果 $D$ 個執行緒各自去記憶體讀同樣的東西，雙線性插值的係數也各算一次。\n\nDCNv4 讓一個執行緒負責同一組裡的好幾個通道，偏移量和權重只讀一次，插值係數也只算一次。圖中為了好畫，一個執行緒負責兩個通道，實際的實作是 8 個。\n\n有趣的是，光做這一步反而變慢。執行緒變少，平行度下降，每個執行緒的工作量變成 8 倍。真正的加速來自下一步。通道在記憶體裡是連續擺放的（channel-last），相鄰幾個通道的值可以用一條向量化指令一次讀進來，例如四個 32 位元的浮點數合成一次 128 位元的讀取，不用一個一個讀。寫回結果也一樣。\n\n作者把每一步的效果拆開量。輸入 56×56×128，批次 64，4 組（每組 32 個通道），單位是毫秒：\n\n| 實作 | 整個模組 | CUDA 核心 |\n| --- | ---: | ---: |\n| DCNv3 原版 | 3.28 | 1.45 |\n| 精簡模組設計 | 2.12 | 1.45 |\n| 一個執行緒處理 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精簡模組設計只動到核心以外的部分，核心時間沒變；接下來兩步讓核心變慢了一點；向量化讀寫一上，核心時間少了六成。半精度每個數只有 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 時執行時間少了將近四成。DCNv3 那一列也印證了前面的說法，換成 FP16 反而慢了一點。\n\n### FlashInternImage\n\n把 InternImage 裡的 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\n和 InternImage 比，T 快了 64% 到 80%，準確率還稍微高一點。\n\n和 ConvNeXt 比要小心看。FlashInternImage-T 在 FP16 下還是只有 ConvNeXt-T 的七成多速度，S 和 B 也略慢，大約是 ConvNeXt 的九成五。比較公平的說法是，DCNv4 把 InternImage 拉到和 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 卷積換成 DCNv4，ImageNet 從 83.8% 到 84.0%，吞吐量多了 20%（FP32）和 33%（FP16）。\n- **ViT-B**：注意力換成 DCNv4，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 最後一次推送是 2024 年 5 月。\n\n也有使用者回報的結果和論文不同。有人在自己的分割任務上發現[訓練比 DCNv3 還慢](https://github.com/OpenGVLab/DCNv4/issues/54)，有人用官方的測速程式在 3090 上量，[結果也比論文說的慢](https://github.com/OpenGVLab/DCNv4/issues/106)。還有好幾位把 DCNv4 接進自己的模型，例如 YOLO，回報 [loss 不降](https://github.com/OpenGVLab/DCNv4/issues/80)或[出現 NaN](https://github.com/OpenGVLab/DCNv4/issues/105)。這些回報都沒有附上完整設定，也沒有官方回覆，原因不明。\n\n本文的推測是，權重少了 softmax 的上限，接進別人的網路時，初始化和學習率可能要重新調。論文裡的成功經驗，都是在 InternImage 這類為可變形卷積設計的架構，或是作者自己調過的設定上得到的。\n\n## 結論\n\nDCNv4 做了兩件事。一件是拿掉 softmax，權重和一般卷積一樣不設上限，模型收斂得更快；另一件是重寫 CUDA 核心，同一組的通道共用一次讀取，再用向量化指令一次搬好幾個通道，運算子快了三倍多。\n\n已經在用 InternImage 的話，換成 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}}}
