“一次性拼接 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,一次前向/反向"的方案速度更快。

相关推荐
爱吃大芒果5 小时前
Flutter 路由进阶:命名路由、动态路由与路由守卫实现
开发语言·javascript·flutter·华为·ecmascript
一只爱吃糖的小羊5 小时前
深入 React 原理:Reconciliation
前端·javascript·react.js
哆啦A梦15885 小时前
商城后台管理系统 03 Vue项目-实现表格导出EXCEL表格
前端·vue.js·excel
程序员爱钓鱼5 小时前
BlackHole 2ch:macOS无杂音录屏与系统音频采集完整技术指南
前端·后端·设计模式
未来之窗软件服务5 小时前
幽冥大陆(五十二)V10酒店门锁SDK TypeScript——东方仙盟筑基期
前端·javascript·typescript·酒店门锁·仙盟创梦ide·东方仙盟·东方仙盟sdk
LYFlied5 小时前
【每日算法】LeetCode148. 排序链表
前端·数据结构·算法·leetcode·链表
企微自动化5 小时前
Java 实现 Token 安全缓存:使用 ReentrantLock 和单例模式实现并发安全的 Token 管理器
开发语言·javascript·ecmascript
m0_738120725 小时前
应急响应——知攻善防蓝队靶机Web-1溯源过程
前端·网络·python·安全·web安全·ssh
未来之窗软件服务5 小时前
浏览器开发CEF(二十一)C#浏览器 Promise模式调用——东方仙盟元婴期
前端·javascript·html·仙盟创梦ide·东方仙盟·东方仙盟vos智能浏览器