论文题目:OverLoCK: An Overview-first-Look-Closely-next ConvNet with Context-Mixing Dynamic Kernels
中文题目:OverLoCK:一种先概览-再仔细观察-最后上下文混合动态核的卷积网络
文献地址:https://arxiv.org/pdf/2502.20087
源码地址:https://github.com/LMMMEng/OverLoCK
所属单位:香港大学计算与数据科学学院

### 文章目录
- [@toc](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
- [五分钟回顾模型](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
- [实验结果](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
- [ImageNet-1K 图像分类](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
- [目标检测与实例分割](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
- [ADE20K 语义分割](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
- [吞吐量与分布外鲁棒性](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
- [本文方法](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
- [A. 整体框架](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
- [B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积)](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
- [环境安装](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
- [训练速度慢问题验证](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
- [A. 验证mmcv算子是否受pytorch高版本影响](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
- [B. 验证natten是否高效运行](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
- [C. 训练iGEMM](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
- [D. 端到端训练流程验证](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
- [总结与思考](#文章目录 @[toc] 五分钟回顾模型 实验结果 ImageNet-1K 图像分类 目标检测与实例分割 ADE20K 语义分割 吞吐量与分布外鲁棒性 本文方法 A. 整体框架 B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积) 环境安装 训练速度慢问题验证 A. 验证mmcv算子是否受pytorch高版本影响 B. 验证natten是否高效运行 C. 训练iGEMM D. 端到端训练流程验证 总结与思考)
传统卷积网络通常采用自下而上的特征提取方式:随着网络逐层加深,特征图不断缩小、语义逐渐增强。但这种单向信息流存在一个问题------中间特征只能继续向下编码,难以提前获得来自高层语义的指导。
人类观察图像时往往不是逐像素扫描,而是先快速形成场景概览,再把注意力集中到重要区域。OverLoCK 正是从这一过程出发,在纯卷积网络中构造一条自上而下的上下文指导流,让模型实现"先概览、再聚焦"。
🔥🔥🔥**本篇内容** : 本文介绍 CVPR 2025 纯卷积视觉网络 OverLoCK。模型提出 Deep-stage Decomposition Strategy(深度阶段分解策略,DDS)与 Context-Mixing Dynamic Convolution(上下文混合动态卷积,ContMix),分别解决"高层语义如何反向指导特征提取"和"卷积如何兼顾长程依赖与局部归纳偏置"两个问题。
五分钟回顾模型
OverLoCK 的名字直接概括了它的工作方式:
Overview First,Look Closely Next------先形成全局概览,再聚焦关键细节。
它要解决的核心矛盾是:传统 CNN 擅长提取局部模式,但缺少显式的自上而下语义指导;大核卷积和动态卷积能够扩大感受野,却不一定同时兼顾输入自适应、长程依赖和局部细节。
OverLoCK 从整体上采用分支式纯卷积架构。输入先经过 Base-Net 形成通用中层特征;Overview-Net 在更低分辨率上快速建立全局上下文;Focus-Net 再接收中层特征和上下文先验,聚焦关键区域并生成高层特征。三个子网络共同组成一条"先概览、再聚焦"的信息流。

从这个整体框架向下看,OverLoCK 给出的答案主要包含 DDS 和 ContMix 两项创新:
| 快速回顾项 | 传统问题 | OverLoCK 的设计 | 直接作用 |
|---|---|---|---|
| 深层信息流 | 只有自下而上的逐级编码 | DDS:Base、Overview、Focus | 先概览,再用上下文指导聚焦 |
| 长程建模 | 固定卷积核的有效范围有限 | ContMix:上下文生成动态核 | 根据输入调整空间聚合方式 |
| 局部细节 | 全局建模可能削弱局部归纳偏置 | 大核组与 5×5 小核组并用 |
同时覆盖长程关系与局部结构 |
DDS:把深层网络拆成三个协同部分。 Deep-stage Decomposition Strategy(DDS)将网络拆分为:
Base-Net:提取低层和中层通用特征,为后续两个分支提供基础表示。Overview-Net:在更低分辨率上快速获得高语义的全局概览。Focus-Net:在 Overview-Net 的上下文先验指导下,进一步提取细粒度高层特征。
这种设计不需要反复递归计算,而是通过一次 Overview 和一次 Focus 建立自上而下的信息流。
ContMix:让上下文进一步参与局部卷积。Context-Mixing Dynamic Convolution(ContMix)位于 Focus-Net 的 Dynamic Block 中。它先将全局上下文压缩成固定数量的区域中心,再计算局部位置与区域中心的关联,根据关联结果生成位置相关的动态卷积核。

简单理解,普通卷积对所有输入使用一组固定参数;ContMix 则让不同位置根据当前图像的全局上下文选择不同的聚合方式。
为兼顾不同尺度,一部分通道组使用较大的动态核建模长程依赖,另一部分使用5×5小核保留局部细节。这使 ContMix 既能"看得远",又不会完全丢掉 CNN 擅长的局部归纳偏置。
模型变体。 OverLoCK 提供 XT、T、S、B 四种模型规模,通过通道数、Block 数量、卷积核尺寸和分组数调节计算量与容量,可以作为分类、检测和分割任务的通用 Backbone。

Base-Net 负责建立基础表示,Overview-Net 负责快速理解全局,Focus-Net 在全局语义指导下仔细观察;ContMix 则继续向下,把这种指导转化为输入相关的动态卷积核。
实验结果

ImageNet-1K 图像分类
在 224×224 输入下,
- OverLoCK-T 的 Top-1 Accuracy 为 84.2%。
- OverLoCK-B 的 Top-1 Accuracy 为 85.1%。
- 将输入提高到
384×384后,OverLoCK-B 达到 86.2%。

这些结果说明,OverLoCK 不只适用于密集预测,其纯卷积 Backbone 在分类任务上也具有较强的表征能力。具体优劣仍应在相同输入分辨率、训练策略、预训练数据和计算预算下比较。
目标检测与实例分割
使用 Mask R-CNN 3× 调度时, OverLoCK-S 的框检测 AP(APᵇ)达到 51.0,实例分割 AP(APᵐ)达到 45.0;采用 Cascade Mask R-CNN 时,OverLoCK-B 的 APᵇ 与 APᵐ 分别为 53.9 和 46.8。

检测与分割结果表明,Overview-Net 提供的上下文指导并非只对分类有效,它也能服务于需要多尺度输出的下游任务。
ADE20K 语义分割
在 UperNet 框架下,原文档记录:
| Backbone | mIoU | Multi-scale mIoU |
|---|---|---|
| OverLoCK-T | 50.3 | 50.8 |
| OverLoCK-B | 51.7 | 52.3 |
| 语义分割需要同时理解全局场景与像素级局部边界,因此能够传递全局上下文的 DDS 和兼顾大小感受野的 ContMix 与这类任务较为契合 |
吞吐量与分布外鲁棒性
OverLoCK-XT 的吞吐量为 1672 images/s,并给出了 ImageNet-V2、ImageNet-A、ImageNet-R、ImageNet-Sketch 等分布外数据集上的结果。

这些实验关注的不只是标准数据集精度,也考察了模型面对数据分布变化时的表现。不过吞吐量高度依赖 GPU、batch size、数值精度和推理实现,引用时应同时保留论文对应的测试条件。
本文方法
A. 整体框架
OverLoCK 采用分支式纯卷积架构 ,核心基于深度阶段分解策略 (DDS),由 Base-Net、Overview-Net、Focus-Net三个子网络组成,搭配动态上下文流实现自上而下的语义指导,整体包含 4 个 stage,输出多尺度特征用于各类视觉任务:

- Base-Net建立通用中层表示:是OverLoCK的低层特征提取器 ,为后续的
Overview-net概览和Focus-net聚焦提供高质量中层特征。具体而言,通过三个Embedding层,逐步将输入图像(HxW)下采样至(H/16 x W / 16),在缩小分辨率、降低夹断来那个的同时,逐步聚合局部信息,生成包含边缘、纹理、简单形状等通用特征的中层特征图;另一方面,构建Basic Block基础块,结构为 "残差 3×3 深度卷积 → 层归一化 → 膨胀重参数卷积(Dilated RepConv)→SE层 → 卷积前馈网络(ConvFFN),强化局部细节的特征表达。

- Overview-Net用低分辨率快速看全局: 以
Base-Net的中层特征为输入,快速生成低分辨率、高语义的全局上下文先验 。具体而言,将Base-Net输出的 H/16×W/16 特征进一步下采样至 H/32×W/32,也是通过Embedding层和Basic Block进行,此处下采样倍数更高,相当于用极小的计算开销覆盖整个输入图像的全局信息,生成具有指导意义的上下文先验。 - 产生一个语义上有意义但质量较低的概览特征图,作为对输入图像的整体理解,作为上下文先验融合到Focus-Net的所有构建块中。
- Focus-Net在全局指导下聚焦: 以
Base-Net的中层特征和Overview-Net的上下文先验为双重输入,在自上而下的指导下,精细提取高分辨率、高语义的高层特征 ,提升核心区域的特征区分度(如从"通用轮廓"到"猫的脸部特征")。具体而言,采用Dynamic Block=残差 3×3 深度卷积 → 门控动态空间聚合器(GDSA) → ConvFFN;核心组件GDSA以ContMix为token混合器,输入Base-Net特征 +Overview-net上下文先验的融合特征,通过 1×1 卷积 + SiLU 激活生成动态门控(抑制噪声),再通过 ContMix 聚合长程特征,实现 "指导 - 聚合 - 优化" 的闭环;
text
局部特征
│
残差 3×3 DWConv
│
GDSA:门控 + ContMix 动态空间聚合
│
ConvFFN
│
聚焦后的高层特征
Gated Dynamic Spatial Aggregator(GDSA)使用门控分支调节动态空间聚合结果,再由 ContMix 完成长程空间混合。到这一层,Overview-Net 提供的全局指导开始具体作用于局部特征聚合。

整体来看,三者的协同完美模拟了人类 "先看整体(Overview-Net)→ 再聚焦细节(Focus-Net)" 的视觉感知逻辑,同时通过 Base-Net 的通用特征支撑,既避免了传统卷积网络 "无指导的盲目提取",又解决了 Transformer/Mamba等模型 "计算量过大" 的问题,这也是 OverLoCK 兼顾精度与效率的核心原因。

普通层级式 Backbone 通常是单向的:前一 stage 的输出直接送入下一 stage。OverLoCK 则通过 DDS 把深层处理拆成 Overview 和 Focus 两个阶段,形成两条相互配合的信息流:
- 特征流:承载纹理、边缘、轮廓和高层语义。
- 上下文指导流:把 Overview-Net 的全局理解送到 Focus-Net。
text
Base-Net 提取通用中层特征
↓
Overview-Net 低成本建立全局语义
↓
上下文先验送入 Focus-Net
↓
Dynamic Block 在指导下聚合局部与长程信息
↓
输出兼顾全局语义与局部细节的高层特征
B. Dynamic Convolution with Context-Mixing(上下文混合动态卷积)
ContMix的整体结构示意图如下图所示,作为一种即插即用的动态卷积模块,ContMix在捕捉长距离依赖关系和保持归纳偏置方面的能力如图所示。

ContMix实现了在保持卷积归纳偏置的同时,动态地对长距离依赖进行建模,从而在各种输入分辨率下都能有效地处理图像特征。实现过程:
a. 输入特征转换:输入特征 X X X被转换为两部分:Q和K。其中,Q通过1×1卷积 W q {W_q} Wq对 X X X进行特征提取;K是通过将 X X X通过自适应平均池化Adaptive Pooling得到S×S区域中心的聚合,再通过1x1卷积 W k {W_k} Wk进行特征提取,将Q和K的通道均匀分成G组,以获得 Q g {Q_g} Qg和 K g {K_g} Kg。
b. 计算亲和矩阵:通过矩阵乘法计算出每一对Qg和Kg的G个亲和矩阵 A g {A^g} Ag。 A g {A^g} Ag的每一行 A i g {A^g_i} Aig包含了 Q g {Q_g} Qg中第 i i i个token与 K g {K_g} Kg中所有token的亲和度。
c. 生成动态卷积核:通过线性层 W d {W_d} Wd对每个亲和度矩阵 A g {A_g} Ag中的token亲和度值进行聚合,并通过softmax函数进行归一化,得到 D g D^g Dg。每个 D g D^g Dg的行可以被重塑成目标卷积核形状,从而在每个token位置产生一个输入依赖的卷积核。
d. 卷积操作:卷积操作将特征 X X X的通道均匀分成G组,同一组内的通道共享同一个动态卷积核。每个token在卷积操作中与全局信息交互,从而捕获长距离依赖。
e. ContMix的定制实现:在OverLoCK网络的Dynamic Block中,ContMix被定制实现。Q 来自 Z i Z_i Zi(局部特征),K来自 P i {P_i} Pi(全局上下文),而非融合特征。确保 "局部像素" 与 "全局指导" 的关联更精准。此外,ContMix的S被设置为7,以确保线性时间复杂度。ContMix的组被分配给大卷积核和小卷积核,其中小卷积核的大小设置为5×5,以实现不同尺度特征的提取。
ContMix 的核心过程可以分成五步:
- 构造局部查询 :通过
1×1卷积从局部特征生成 Query,用来描述每个位置当前需要什么信息。 - 压缩全局上下文 :利用自适应平均池化将上下文聚合为固定的
S×S区域中心,再生成 Key。 - 计算位置---区域关联:比较每个局部位置与各区域中心,得到上下文亲和度。
- 生成动态核:将亲和度映射为卷积核权重,并通过 Softmax 进行归一化。
- 分组动态卷积 :同一组通道共享相应动态核,在保留卷积局部连接形式的同时,引入来自全局上下文的权重。
作用分析:ContMix作为一个通用的即插即用模块,其在OverLoCK网络中的实现细节包括使用当前融合特征X计算Q和K,以及将大卷积核和小卷积核的组数设置为一半,以实现长距离依赖和局部细节的建模。
在 OverLoCK 的 Dynamic Block 中,局部特征与 Overview-Net 上下文承担不同角色:局部特征提供待聚合的位置描述,上下文先验提供全局指导。论文配置将区域中心固定为S=7,位置与区域中心的关联规模为HW × S²;当S固定时,该部分复杂度相对于 token 数HW呈线性增长。
为了同时覆盖远距离关系和局部细节,ContMix 将通道组分配给不同核尺寸:一部分使用大核,另一部分使用5×5小核。大核扩大依赖范围,小核保留局部结构,二者共同构成多尺度空间聚合
至此,整条由整体到局部的逻辑就完整了:DDS 决定网络如何先概览再聚焦,Base/Overview/Focus 决定上下文如何流动,Dynamic Block 和 GDSA 决定如何使用指导信息,ContMix 最终把上下文变成每个位置参与计算的动态卷积核。
环境安装
shell
# Environments:
cuda==12.1
python==3.10
# Dependencies:
pip install torch==2.3.1 torchvision==0.18.1 --index-url https://download.pytorch.org/whl/cu121
pip install natten==0.17.1+torch230cu121 -f https://shi-labs.com/natten/wheels/
pip install timm==0.6.12
pip install mmengine==0.2.0 -i https://mirrors.ustc.edu.cn/pypi/simple/
git clone https://github.com/Shiweiliuiiiiiii/SLaK.git
pip install timm tensorboardX six
cd cutlass/examples/19_large_depthwise_conv2d_torch_extension
TORCH_CUDA_ARCH_LIST="8.0" ./setup.py install --user # 时间有点长
A quick check: python depthwise_conv2d_implicit_gemm.py
TORCH_CUDA_ARCH_LIST="8.0" 对应特定 GPU 架构,不能直接照搬到所有设备。编译过程耗时较长属于常见现象,应根据实际 GPU Compute Capability 调整。

quick check没问题。
训练速度慢问题验证
A. 验证mmcv算子是否受pytorch高版本影响
验证高版本pytorch 2.3.1与mmdet2.28.1不兼容问题是否影响mmcv算子回退到cpu版本
python
python -c "import mmcv.ops; print(mmcv.ops.__all__)"
存在RoIAlign, DeformConv 等核心算子。

并验证输出的设备:
python
import torch
import mmcv.ops
# 测试 DeformConv2d
deform_conv = mmcv.ops.DeformConv2d(3, 3, kernel_size=3, padding=1).cuda()
x = torch.randn(1, 3, 64, 64).cuda()
offset = torch.randn(1, 18, 64, 64).cuda()
out = deform_conv(x, offset)
print(f"DeformConv2d output device: {out.device}")
# 测试 RoIAlign
roi_align = mmcv.ops.RoIAlign(output_size=(7, 7), spatial_scale=1.0, sampling_ratio=0).cuda()
x = torch.randn(1, 3, 64, 64).cuda()
rois = torch.tensor([[0, 0, 0, 10, 10]]).float().cuda()
out = roi_align(x, rois)
print(f"RoIAlign output device: {out.device}")
将上述代码放置于test_mmcv_ops.py中进行验证,输出均在cuda上。

B. 验证natten是否高效运行
python
python -c "import natten; print(natten.__version__)"

打印natten版本为0.17.1。
测试natten上算子耗时,1.86ms基本上也没问题。
python
import torch
import natten
import time
# 创建输入
B, C, H, W = 1, 64, 64, 64
x = torch.randn(B, C, H, W).cuda()
# 创建邻域注意力层,使用正确的参数名
na = natten.NeighborhoodAttention2D(
dim=C, # 用 dim 代替 in_channels
kernel_size=7,
num_heads=1 # 必须传入 num_heads
).cuda()
# 测速
start = time.time()
for _ in range(100):
out = na(x)
torch.cuda.synchronize()
end = time.time()
print(f"NATTEN average time: {(end - start) / 100 * 1000:.2f} ms")

C. 训练iGEMM
从训练过程中,也可以看出加速库iGEMM成功加载
python
===== iGEMM Efficient Conv Impl, channels 64, kernel size (17, 17) =====
---------------- trying to import iGEMM implementation for large-kernel conv
---------------- found iGEMM implementation
===== iGEMM Efficient Conv Impl, channels 64, kernel size (17, 17) =====
---------------- trying to import iGEMM implementation for large-kernel conv
---------------- found iGEMM implementation

综上,大核卷积(iGEMM)、MMCV 算子、NATTEN 这三个核心依赖都已经确认在 GPU 上正常工作。
D. 端到端训练流程验证
使用一个简单的脚本进行验证,如下所示:
python
#!/usr/bin/env python3
# mmdet v2.28.1 专属性能分析脚本
import os
import sys
import torch
from torch.profiler import profile, record_function, ProfilerActivity
# 添加mmdet路径(根据你的实际路径调整)
# sys.path.append(os.path.abspath('.'))
# sys.path.append(os.path.abspath('./mmdetection'))
# 导入mmdet v2.28.2的核心模块(旧版接口)
from mmdet.apis import init_detector, set_random_seed
from mmdet.datasets import build_dataloader, build_dataset
from mmdet.models import build_detector
from mmcv import Config
from mmcv.runner import build_optimizer, EpochBasedRunner
from mmcv.parallel import MMDataParallel
def main():
# ===================== 配置参数(根据你的实际情况修改) =====================
CONFIG_PATH = '/home/data/Model/000_model_eval/20260227_cascadercnn_overlock-t-fpn_sdxtdataset_1x/20260227_cascadercnn_overlock-t-fpn_sdxtdataset_1x.py' # 你的配置文件路径
CHECKPOINT_PATH = None # 可选:预训练权重路径
GPU_ID = 0 # 使用的GPU编号
# ==========================================================================
# 1. 加载配置文件
cfg = Config.fromfile(CONFIG_PATH)
cfg.gpu_ids = [GPU_ID]
set_random_seed(0, deterministic=False)
# 2. 构建数据集和数据加载器(仅加载训练集)
dataset = build_dataset(cfg.data.train)
data_loader = build_dataloader(
dataset,
samples_per_gpu=cfg.data.samples_per_gpu,
workers_per_gpu=cfg.data.workers_per_gpu,
num_gpus=1,
dist=False,
shuffle=True
)
data_iter = iter(data_loader)
data_batch = next(data_iter) # 获取第一个batch的数据
# 3. 构建模型(MMDataParallel适配旧版)
model = build_detector(cfg.model, train_cfg=cfg.get('train_cfg'), test_cfg=cfg.get('test_cfg'))
model.init_weights()
model = MMDataParallel(model.cuda(), device_ids=[GPU_ID])
model.train()
# 4. 构建优化器(仅用于解析loss,不实际更新参数)
optimizer = build_optimizer(model, cfg.optimizer)
# 5. 执行Profiling(核心步骤)
print("🚀 开始性能分析(mmdet v2.28.2)...")
with profile(
activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA],
profile_memory=True,
record_shapes=True,
on_trace_ready=torch.profiler.tensorboard_trace_handler('./profiler_log')
) as prof:
with record_function("train_step"):
# 执行一次完整的训练step(前向+反向)
losses = model(** data_batch)
loss, _ = model.module._parse_losses(losses)
loss.backward()
# 6. 输出并保存结果
print("\n" + "="*80)
print("📊 Profiling 结果(按CUDA耗时排序):")
print("="*80)
result_table = prof.key_averages().table(sort_by="cuda_time_total", row_limit=20)
print(result_table)
# 保存到文件
with open("profiler_result.txt", "w", encoding='utf-8') as f:
f.write(result_table)
# 7. 提示信息
print(f"\n✅ Profiling完成!结果已保存到:")
print(f" - 文本报告:{os.path.abspath('profiler_result.txt')}")
print(f" - TensorBoard日志:{os.path.abspath('./profiler_log')}")
print(f"\n📌 如需可视化分析,请运行:")
print(f" tensorboard --logdir=./profiler_log")
if __name__ == '__main__':
# 确保使用GPU
assert torch.cuda.is_available(), "请确保GPU可用!"
main()
验证结果部分截图如下所示:

训练速度依旧很慢。

总结与思考
OverLoCK 的核心并不是单独提出一个更大的卷积核,而是重新组织了卷积网络中的上下文流动方式:
- DDS 将深层处理拆成 Base、Overview 和 Focus 三部分。
- Overview-Net 先在低分辨率上形成全局语义先验。
- Focus-Net 在先验指导下提取更有针对性的高层特征。
- GDSA 通过门控控制上下文信息。
- ContMix 将局部位置与全局区域中心的关系转化为动态卷积核,同时保留大小核的多尺度聚合。
如果只是快速回顾这篇论文,可以记住一句话:
OverLoCK 让纯卷积网络先低成本地看懂全局,再用全局上下文指导局部特征聚合。
从个人复现记录看,MMCV、NATTEN 和 iGEMM 的 CUDA 路径均能加载或执行,但训练依然较慢。
OverLoCK 值得关注的地方,是它没有为了全局建模完全转向 Transformer 或状态空间模型,而是通过上下文指导流和动态卷积重新挖掘 CNN 的能力。对于需要复用卷积生态、同时希望增强长程依赖的视觉任务,它提供了一个有启发性的设计方向。