写点什么

MXNet 视频 I/O 读取速度提升 18 倍的优化策略

  • 2020-02-24
  • 本文字数:2116 字

    阅读完需:约 7 分钟

MXNet 视频I/O读取速度提升18倍的优化策略

大规模视频数据的模型训练中,视频读取时间严重影响模型的训练速度。MXNet 仅提供读取图像的迭代器,没有提供读取视频的迭代器,本文提出一种优化策略,可以将训练速度提升 18 倍。

一、前言

大规模视频数据的模型训练中,视频读取时间严重影响模型的训练速度。MXNet 仅提供读取图像的迭代器,没有提供读取视频的迭代器。传统方法基于 opencv 或 skimage 直接读取原始图像,速度较慢。我们将原始图像打包成 Rec 格式,然后使用 ImageRecordIter 迭代器构建新的迭代器,具体代码实现见 MTCloudVision/mxnet-videoio(https://github.com/MTCloudVision/mxnet-videoio)。使用4个Titan 1080ti GPU,优化后训练速度提升了~18 倍。


MXNet 框架使用迭代器器模式实现读取硬盘中图像的 I/O 接口。目前 MXNet 官方提供的读取图像的迭代器有:image.ImageIter、io.ImageRecordIter(io.ImageRecordUInt8Iter)、io.MNISTIter。MXNet 的 I/O 接口可扩展性强,支持开发者对于图像进行打包,生成用于训练模型的迭代器。目前 MXNet 没有提供读取视频的 I/O 接口。


本文首先比较 MXNet 不同接口的图像 I/O 性能;然后在 Rec 图像迭代器基础上,实现视频 I/O 迭代器,同时对比了优化前后的性能指标。

二、图像 I/O 接口性能对比

MXNet 三种图像 I/O 迭代器:


  • io.MNISTIter:该接口是为 MNIST 数据集设计的,仅支持读取 MNIST 图像数据,数据增强格式支持有限;

  • io.ImageRecordIter:支持 Rec 格式的数据读取。该接口同时支持多种图像增强方式。基于 C++实现,执行效率较高,读取速度较快。缺点是需要将所有训练图像一次性打包成 Rec 格式,占用磁盘空间较大;

  • image.ImageIter:同时支持读取 Rec 和原始图像,相比以上两接口,更加灵活,同时也支持多种图像增强方式。接口基于 Python 实现,读取速度慢于 io.ImageRecordIter 接口;


我们对 image.ImageIter 和 io.ImageRecordIter 做了如下对比测试:


测试环境:


MXNet 版本:0.11.0


网络结构:Inception-v3


类别(num-classes):3


GPU:titan x


测试结果:


单 GPU,batchsize=128



可以看出,前两种读取方式的 I\O 时间主要消耗在 data_iter 阶段,第三种 I\O 时间主要消耗在 update_metric 阶段,且前两种时间消耗大约是第三种的 1.4 倍。调试 ImageRecordIter 接口的 update_metric 阶段操作,发现耗时主要集中在 pred_label.asnumpy()或 pred.asnumpy()操作。


多 GPU(3),batchsize=128*3



可以看出,多 GPU 时,前两种 io 时间约为第三种的 4.4 倍。


结论:单 GPU 时,ImageRecordIter(Rec 格式)的读取速度是其他接口的 1.4 倍;多 GPU 时,ImageRecordIter(Rec 格式)是其他接口的 4.4 倍。原因是其他接口 I/O 读取数据时间是训练时间的 30 倍+,多 GPU 时,其他接口速度基本不变。如果数据集是固定的,建议使用 ImageRecordIter 接口进行图像读取,缺点是占用磁盘空间较大。

三、视频 I/O 优化性能分析

本部分介绍基于 mxnet 图像 io 迭代器 ImageRecordIter 的视频读取迭代器的实现方法,具体实现可以参考:MTCloudVision/mxnet-videoio(https://github.com/MTCloudVision/mxnet-videoio)。


mxnet 图像 I/O 迭代器的输出结构:(batchsize, channel, height, width)。


我们要实现的读取视频的迭代器输出结构:(batchsize, frame_pervideo, channel, height, width),有两种方式可以实现这种迭代器,即基于 opencv 接口实现迭代器和对已有迭代器接口进行封装。


  • 基于 OpenCV 接口实现迭代器:使用 OpenCV 读取视频,将读取数据进行打包成结构为(batchsize,frame_pervideo, channel, height, width)的数据。该方法优点:基于 Python 代码容易实现。缺点:视频读取很慢,对于大规模视频训练任务,严重影响模型的迭代效率。

  • 封装 ImageRecordIter 接口:以每个视频取 3 帧为例,先将视频的数据封装成结构为(3batchsize, channel, height, width)的图像数据,将标签封装成(3batchsize,)的结构;然后调用 ImageRecordIter,将图像数据 reshape 成(batchsize, 3, channel, height, width),并将标签进行稀疏采样成(batchsize,)的结构。

  • 基于以上两种方法,我们做了三组性能对比实验,结果如下:




通过对比,可以看到:


  • 基于 Rec 格式的数据读取速度约为使用 opencv 读取图像速度的 18 倍;

  • 基于 Rec 格式的数据读取速度与 GPU 数正相关,4 个 GPU 的训练速度大概是单个 GPU 的 4 倍,即多 GPU 训练性能提升显著;

  • OpenCV 读取视频图像时,单 GPU 和多 GPU 的读取速度相近,即使用多 GPU 对训练速度的提升几乎没有帮助;

  • OpenCV 读取视频图像,多线程(10)读取比单线程读取速度有提升,但提升有限;


以上实验结果的测试环境:


MXNet 版本:1.0.1


网络结构:BN-Inception


批次数(BatchSize):50


机器:GTX1080ti


训练数据类别数(num_class):101


视频处理:视频采样 3 帧,每帧大小 256x320


实际应用中,训练数据 10W 视频,每个视频截取 10 帧时,采用 resnet-200 在 titan x 上训练 20 个 epoch,采用 cv2.imread 四个线程 io 需要~228 小时,而基于 Rec 视频迭代器只需~22 小时。


作者介绍:付志康,美图云视觉技术部门,计算机视觉工程师。


本文转载自美图技术公众号。


原文链接:https://mp.weixin.qq.com/s/Nq-fZY1L_ULO5DtBVg8eAw


2020-02-24 19:181332

评论

发布
暂无评论
发现更多内容

VMware ESXi 7.0U3v macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)

sysin

esxi

HarmonyOS NEXT 中级开发笔记:基于ArkUI方舟开发框架的家庭菜谱应用实践

chengxujianke

AI 极客低代码平台快速上手 --生成Python代码

华哥的全栈次元舱

Java Python vuetify 纯血鸿蒙 AIGC低代码平台

2025 年 6 个最佳开源工单系统推荐

NocoBase

开源 低代码 无代码 工单系统 IT工单管理

Gemini 刚发布的「主动音频」和「主动视频」是什么?对谈 Project Astra 主管

声网

VMware vSphere 7.0 Update 3v 下载 - 数据中心虚拟化和云原生平台

sysin

esxi

HarmonyOS NEXT 中级开发笔记:ArkUI在汽车智驾类应用中的实践

chengxujianke

全球第一 AI 录音笔品牌,如何搭建运营与客服系统?

NocoBase

开源 AI 低代码 无代码 客服系统

Arthas vmoption(查看和修改 JVM里诊断相关的option)

刘大猫

JVM 监控 Arthas 监控工具 vmoption

Arthas jvm(查看当前JVM的信息)

刘大猫

人工智能 JVM 监控 Arthas 监控工具

AI 极客低代码平台快速上手 -- 生成鸿蒙代码

华哥的全栈次元舱

低代码平台 vuetify 纯血鸿蒙 AI极客 AIGC低代码平台

VMware ESXi 7.0 U3v 下载 - 领先的裸机 Hypervisor

sysin

esxi

HarmonyOS NEXT 中级开发笔记:电竞直播应用ArkUI实践

chengxujianke

Gemma 3n 新增音视频理解,可在手机运行;Gemini Live API 升级主动音视频,能记录关键事件和适时回应丨日报

声网

HarmonyOS NEXT 中级开发笔记:基于ArkUI的减脂膳食应用界面实践

chengxujianke

VMware ESXi 7.0U3v macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版

sysin

esxi

HarmonyOS NEXT 中级开发笔记:ArkUI实现短剧播放器界面

chengxujianke

HarmonyOS NEXT 中级开发笔记:ArkUI实现交通地图导航组件

chengxujianke

HarmonyOS NEXT 中级开发笔记:基于ArkUI的休闲棋盘游戏实现

chengxujianke

HarmonyOS 如何实现传输中的数据加密

网罗开发

鸿蒙 开发工具 HarmonyOS HarmonyOS NEXT 实践分享

构建安全护盾:HarmonyOS 应用的数据安全审计与日志管理实战

网罗开发

鸿蒙 HarmonyOS HarmonyOS NEXT

采用XIRAID引擎和Kioxia PCIe5驱动器的虚拟环境中PostgreSQL的高性能存储解决方案

Sergey Platonov

性能测试 高性能计算, 数据库· 安装指南

什么是实时流数据?核心概念与应用场景解析

镜舟科技

数据采集 StarRocks 流批一体 OLAP 数据库 实时流数据

HarmonyOS NEXT 中级开发笔记:ArkUI实现泊车助手UI布局

chengxujianke

HarmonyOS NEXT 中级开发笔记:ArkUI在打车出行类应用的实践

chengxujianke

AI 极客低代码平台快速上手 -- 生成Vuetify代码

华哥的全栈次元舱

Java Python 低代码平台 vuetify 纯血鸿蒙

电脑浓雾之上,一轮鸿蒙之火

脑极体

AI

HarmonyOS NEXT 中级开发笔记:ArkUI实现演唱会票务页面

chengxujianke

什么是SDK集成,与API有什么区别?白板SDK集成攻略分享!

职场工具箱

sdk 在线白板 办公软件 SDK 教程 AIGC

VMware vCenter Server 7.0U3v 下载 - 集中管理 vSphere 环境

sysin

esxi

HarmonyOS NEXT 中级开发笔记:ArkUI实现电影票务应用界面

chengxujianke

MXNet 视频I/O读取速度提升18倍的优化策略_行业深度_付志康_InfoQ精选文章