“一次性拼接 RM+FSD 做单次前向/反向”的方案

整体来看,TDA2 那种"一次性拼接 RM+FSD 做单次前向/反向"的方案,在同等数据量和 batch 设置下会更快:

  • 前向/反向次数少一半

TDA2 1 次 forward + 1 次 backward;TDA4 需要 2 次 forward + 2 次 backward,显卡上的卷积/BN/激活都重复跑一遍。

  • 显存读写、激活缓存也只保留一次

单次拼接能把两个任务的激活一起算出梯度;双前向得额外保存两套激活,内存 IO 和缓存压力都更大。

  • 梯度同步/accumulate 只做一次

配合梯度累积时,拼接版本在一次 step 前只做一次 scaler.step、一次 optimizer.step;双前向要在同一迭代内处理两套 loss,哪怕最后再聚合,也要多跑一次缩放和 zero_grad。

实际跑下来,拼接方案通常能节省接近一半的纯计算时间(最终加上一些 Python 循环、数据加载开销,整体速度优势也能有 30%~40%),同时还保持了 BN 统计统一。双前向唯一的好处是逻辑直观,但在性能和稳定性上都不如 TDA2 的实现。

可能的加速原因主要来自工程差异,而不是你这次改动本身:

  • 混合精度:train2_TDA2_train_v4_ontrain.py 全程包在 with amp.autocast(...); scaler = amp.GradScaler 中跑 FP16/FP32 混合精度,卷积/BN 的吞吐会大幅提升;tda2/train.py 全部是 FP32。 train2_TDA2_train_v4_ontrain.pyLines 700-705

    scaler = amp.GradScaler(enabled=cuda)

    ...

    with amp.autocast(enabled=cuda):

    outputs = model(joint_imgs)

tda2/train.py 则没有 amp 相关代码。

  • 数据加载线程数:tda4 默认 workers=8,且开启 pin_memory,CPU 预取更快;tda2 配置里 workers: 0,等于单线程加载。 train2_TDA2_train_v4_ontrain.pyLines 1686-1688

    parser.add_argument('--workers', type=int, default=8, help='maximum number of dataloader workers')

    tda2-20240703-lyp.yamlLines 73-79

    workers: 0 # data loader workers

  • 按步统计/日志开销更少:tda2 在每个 batch 里计算 IoU/Acc、做 all_reduce,并频繁写 tensorboard;tda4 的循环只反向后偶尔打印日志,mIoU 计算挪到每轮验证,GPU/CPU 都省了不少时间。
  • 同步/分布式开销:tda2 默认 sync_bn=True 且用 DataParallel/DistributedDataParallel,BN 同步和梯度同步会增加通信;tda4 在单机单卡时不会启用 sync_bn/分布式,纯本地前向后向更快。
  • 数据增强复杂度:tda2 的自定义 transform 里有 RandScale/RandRotate/GaussianBlur 等基于 OpenCV 的操作(在 CPU 上),开销较大;tda4 的 SegmentationDataset 中实际使用的增强相对简单(ColorJitter+ToTensor),CPU 部分更轻。

综上,混合精度 + 多线程数据加载 + 更轻的 per-batch 计算,是你看到"训练速度大幅缩短"的主要原因,即使模型和 batch 尺寸相同,也会比 tda2 的老训练脚本快不少。

同样的数据和 batch 大小下,TDA2 的方式更快:只做一次前向/反向,BN 统计和梯度同步都跑一遍;tda4 的两次前向/反向会把卷积/BN/激活计算、梯度回传和内存读写各跑两次,开销几乎翻倍。所以在不改其他设置的前提下,TDA2 这种"拼接 RM+FSD,一次前向/反向"的方案速度更快。

相关推荐
蜡台3 分钟前
SPA(Single Page Application) Web 应用(即单页应用)架构模式 更新
前端·架构·vue·react·spa·spa更新
网络点点滴1 小时前
组件通信-作用域插槽
前端·javascript·vue.js
LZQ <=小氣鬼=>2 小时前
React 图片放大镜组件使用文档
javascript·react.js·前端框架·ecmascript
kyriewen112 小时前
异步编程:从“回调地狱”到“async/await”的救赎之路
开发语言·前端·javascript·chrome·typescript·ecmascript·html5
早點睡3902 小时前
ReactNative项目Openharmony三方库集成实战:@react-native-clipboard/clipboard
javascript·react native·react.js
Old Uncle Tom2 小时前
Markdown Viewer 再升级
前端
吴声子夜歌2 小时前
JavaScript——数据类型
开发语言·javascript·ecmascript
Luna-player2 小时前
Vue3中使用vue-awesome-swiper
前端·vue.js·arcgis
SuperEugene2 小时前
Vue3 Pinia 状态管理规范:状态拆分、Actions 写法、持久化实战,避坑状态污染|状态管理与路由规范篇
前端·javascript·vue.js·前端框架·pinia
black方块cxy2 小时前
实现一个输入框多个ip以逗号分隔最多20组,且ip不能重复
java·服务器·前端