十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

多进程数据加载器CityLoader解析:TuSimple-DUC如何加速CityScapes训练吞吐

多进程数据加载器CityLoader解析:TuSimple-DUC如何加速CityScapes训练吞吐 多进程数据加载器CityLoader解析TuSimple-DUC如何加速CityScapes训练吞吐【免费下载链接】TuSimple-DUCUnderstanding Convolution for Semantic Segmentation项目地址: https://gitcode.com/gh_mirrors/tu/TuSimple-DUC训练语义分割模型时GPU 常在等数据。TuSimple-DUC 是图森视觉团队开源的语义分割框架论文《Understanding Convolution for Semantic Segmentation》WACV 2018其核心组件CityLoader 多进程数据加载器用生产者-消费者流水线把 CityScapes 的图像读取、缩放、随机裁剪等耗时操作从主进程剥离出去让训练吞吐大幅提升。本文将拆解这套机制并给出开启方法。为什么数据加载会成为训练瓶颈CityScapes 是高分辨率街景数据集单张原图可达 2048×1024。TuSimple-DUC 训练时每个样本要经过一长串 CPU 操作定义在 tusimple_duc/core/utils.py 的get_single_image_duc函数步骤说明读取原图OpenCV 解码 PNG BGR→RGB 通道转换随机缩放从scale_factors如 0.5~1.5中随机选比例随机裁剪以标注的裁剪中心为基准在random_bound范围内抖动边界填充越界区域用 RGB 均值补边copyMakeBorder归一化三通道分别减去rgb_mean标签对齐最近邻缩放标签、id→trainId 转换、按 8 倍下采样率重排随机翻转50% 概率水平镜像标签同步翻转这些操作是纯 CPU 计算且带磁盘 IO。如果串行执行GPU 每个 batch 都要空等几十到上百毫秒。CityLoader 的解法让 N 个子进程提前把数据备好主进程取走即用。CityLoader 多进程架构一条数据流水线CityLoader 位于 tusimple_duc/core/cityscapes_loader.py继承自mx.io.DataIter内部由两类队列 一批工作进程组成 流水线四个环节任务入队_insert_queue()把全部样本依次放入data_queue再向队列尾部投递n_thread个stop_word默认字符串STOP--作为收工暗号多进程并行预处理_thread_start()拉起n_thread个默认 7 个mp.Process工作进程每个进程循环执行data_queue.get()取到任务就调用get_single_image_duc完成上面那张表里的全部操作然后把结果放入result_queue主进程装批_get_next()从result_queue顺序取出图像与标签拼进预分配的 numpy 数组转成mx.io.DataBatch交给 MXNet优雅停机shutdown()先清空两条队列再置位共享的stop_flagmp.Value工作进程检测到标志即退出join超时未退出的进程会被强制terminate并通过atexit注册确保异常退出时也能清理。⚙️ 几个值得细看的设计细节背压控制result_queue容量设为batch_size × 3构造函数中mp.Queue(maxsize...)子进程生产过快时会自动阻塞避免内存被中间结果撑爆逐 epoch 重建reset()在每个 epoch 开头先shuffle打乱样本顺序然后shutdown()旧进程、重新灌队列、启动新进程保证每个 epoch 的随机裁剪/缩放/翻转都是全新随机双模式兼容配置multi_threadFalse时退化为单进程串行模式主进程内直接调用_get_single方便调试小规模任务。最快开启方式修改配置文件 3 步多进程开关由 configs/train/train_cityscapes.cfg 的[env]段控制该配置由 train/solver.py 的get_data_iterator读取并透传给 CityLoader1️⃣ 打开多进程开关[env] multi_threadTrue2️⃣ 按需调整线程数n_thread不在 cfg 中出现时使用代码默认值7。经验值设为 CPU 物理核心数或核心数的一半避免与 GPU 训练争抢。3️⃣ 启动训练cd train python train_model.py ../configs/train/train_cityscapes.cfg 关键参数速查表默认值来自 cityscapes_loader.py 构造函数参数默认值作用multi_threadFalse多进程加载总开关n_thread7工作进程数量batch_size4批大小同时决定结果队列容量×3stop_wordSTOP--工作进程的退出信号data_shape/label_shape由网络推导预分配张量形状必须与预处理输出一致数据从哪来.lst 清单文件与一图 7 裁CityLoader 的输入是制表符分隔的清单文件例如配置中的train_list../data/cityscapes/imagesets/cityscapes_fine/train_bigger_patch.lst。该文件由 data_prep/get_cityscapes_list.py 生成每行格式为序号TAB图像路径TAB标签路径TAB裁剪宽度TAB裁剪中心XTAB裁剪中心Y值得注意的巧妙设计脚本对每张原图生成 7 条记录for i in range(1, 8)裁剪中心横坐标依次为256×1到256×7配合use_random_cropTrue的中心抖动等价于对整幅大图做滑窗式采样大幅增强小目标行人、车辆的曝光率——这也是训练集吞吐量的来源而 CityLoader 的多进程机制则负责把这量喂得够快。调优小贴士 CPU 核数少时把n_thread降到 2~4过多进程反而因 GIL 与上下文切换拖慢预处理磁盘是瓶颈时多进程读取能部分掩盖 SSD/HDD 延迟但若数据集在机械盘上建议先跑一遍fio类工具确认 IO 不是上限观察吞吐utils.py 内置的Speedometer回调每 50 个 batch 打印samples/sec对比multi_thread开/关两种配置的数值即可量化加速收益形状必须对齐修改data_shape后务必同步检查get_single_image_duc的输出维度队列中张量形状不一致会在xs[j][cnt] image[j]处直接报错。小结TuSimple-DUC 的 CityLoader 用一个双队列 N 进程的经典流水线把 CityScapes 训练中最重的预处理搬离主进程data_queue分发任务、result_queue容量batch_size×3缓冲结果、stop_word与stop_flag保证每个 epoch 干净重启。只需在配置文件中把multi_thread设为True即可获得立竿见影的训练吞吐提升——这也是所有语义分割项目值得借鉴的数据加载范式。【免费下载链接】TuSimple-DUCUnderstanding Convolution for Semantic Segmentation项目地址: https://gitcode.com/gh_mirrors/tu/TuSimple-DUC创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表