50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

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:181416

评论

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

YashanDB CRYPT_HASH函数

YashanDB

yashandb

BOE(京东方)发布行业首个可持续发展品牌“ONE”:以开放创新科技之力守护人类未来

爱极客侠

京东方

YashanDB|关闭归档时报 YAS-02079?你可能忘了关闭“复制模式”

数据库砖家

数据库·

YashanDB CRYPT_ASYM_DECRYPT函数

YashanDB

yashandb

YashanDB COUNT函数

YashanDB

yashandb

YashanDB CRYPT_RANDOM函数

YashanDB

yashandb

字节推出 LiveCC,首个实时评论视频模型;AI 客户访谈初创 Listen Labs 融资 2700 万美元,红杉领投丨日报

声网

YashanDB|Ubuntu 加载 C 驱动后 PHP 启动失败?原来是“库冲突”惹的祸

数据库砖家

数据库·

YashanDB |执行 SQL 报 YAS-02024 锁等待超时?可能是默认设置的问题

数据库砖家

数据库·

10.接口而非实现编程

杨充

Arthas sc(查看JVM已加载的类信息 )

刘大猫

人工智能 监控 Arthas 大模型 sc

企业异地组网方案:IEPL/IPLC与MPLS/SD-WAN对比

Ogcloud

SD-WAN 企业组网 异地组网

YashanDB CRYPT_ENCRYPT函数

YashanDB

yashandb

企业如何挑选靠谱的云计算服务商?七个避坑指南

Ogcloud

云计算 云服务 云服务商

YashanDB CRYPT_KEY函数

YashanDB

yashandb

YashanDB|大事务回滚卡死全库,YAS-02016 报错怎么破?

数据库砖家

数据库·

YashanDB|数据库运行没问题,为何日志频繁提示 metadata changed?

数据库砖家

数据库·

Kairos:AI Agent 时代的基础设施新范式,重塑全球算力网络

股市老人

福启云端,相约榕城,4月29日,不见不散!

天翼云开发者社区

智能云 数字中国

YashanDB CRYPT_ASYM_ENCRYPT函数

YashanDB

yashandb

估值150亿后,腾讯继续加码「智元机器人」

机器人头条

人形机器人 具身智能 智元机器人

YashanDB |掉电后数据库启动报错 core dump?原来是 VMware 默认配置的“锅”!

数据库砖家

数据库·

YashanDB |PHP 无法连接 YashanDB?ODBC 驱动“找不到”的锅怎么甩?

数据库砖家

数据库·

YashanDB CRYPT_DECRYPT函数

YashanDB

yashandb

YashanDB CRYPT_HMAC函数

YashanDB

yashandb

YashanDB|JDBC 插入慢?别忽略了“网络带宽”这个瓶颈!

数据库砖家

数据库·

从Servlet到云原生:一文讲透Java Web容器的核心技术体系

AI时代的一滴水

tomcat 云原生 Java web

YashanDB CRYPT_SELFTEST函数

YashanDB

yashandb

教育考试院存储系统焕新:轻量升级,无缝切换!

天翼云开发者社区

存储 天翼云

YashanDB|Mybatis-Plus 无法识别 YashanDB?加一段配置就能解决

数据库砖家

数据库·

YashanDB|YAS-00413 超时报错?其实是系统资源限制“卡脖子”了

数据库砖家

数据库·

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