AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

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

评论

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

[0/28]软件质量的那点事(1)———引言

L3C老司机

软件测试 软件质量

独角兽余额宝(Java现场面试48题):性能调优+索引+Mysql+缓存+HashMap+GC

Java架构之路

Java 程序员 架构 面试 编程语言

智慧城市发力,区块链助力土木建设数据存储

CECBC

土木建设

HDFS SHELL详解(2)

罗小龙

hadoop 28天写作 hdfs shell

【JS】函数实参与形参

德育处主任

JavaScript 大前端 js 28天写作

极客时间架构 1 期:大作业二 学习大总结

Null

金三银四将至!我肝了万字的Java垃圾回收,看完你还敢说不会?

编程 面试 JVM

即时通讯的原理和历史

v16629866266

APICloud AVM多端开发 | 企业app开发解析:案例展示、加盟申请功能源码

YonBuilder低代码开发平台

大前端 小程序flutter, 跨平台 APICloud

Java并发编程实战(2)- Java内存模型

技术修行者

Java 并发编程 happens-before 多线程

太过完美!滴滴全球首发Spring5+SpringMVC5+Mybatis3.X全彩小册

Java架构追梦

Java 源码 架构 滴滴 ssm

最新区块链科普图书《区块链进化史》上市

CECBC

区块链 科普

重学JS | 聊聊闭包

梁龙先森

大前端 编程语言 28天写作

智能合约DAPP软件APP开发|智能合约DAPP系统开发

系统开发

DeFi去中心化DAPP系统开发的知识科普

W13902449729

去中心化金融 DeFi去中心化系统开发

高频量化交易机器人系统开发技术

薇電13242772558

区块链 策略模式

别小看 Log 日志,它难住了我们组的架构师

Java架构师迁哥

京东T7团队技术4面:线程池+索引+Spring +分布式锁+Mysql+项目等

Java架构之路

Java 程序员 架构 面试 编程语言

强!腾讯老兵亲荐“从零开始学架构”教你如何成为出色的架构师?(整整2000页的笔记)

比伯

Java 编程 架构 面试 程序人生

大作业(二)

橘子皮嚼着不脆

极客时间架构 1 期:大作业一 根据业务编写指定输出系统概要设计

Null

面试大揭秘!从技术面被“虐”到征服CTO,全凭这份强到离谱的pdf

Java架构之路

Java 程序员 架构 面试 编程语言

MySQL慢查询(中):正确的处理姿势,你get到了吗?

架构精进之路

MySQL MySQL优化 MySQL架构 28天写作

同城快递系统架构

Jacky.Chen

架构师训练营 1 期:大作业(二)

piercebn

架构师训练营第 1 期

惊艳!四份SpringSecurity笔记带你玩转金三银四的面试题集!

996小迁

Java 架构 面试 springsecurity 笔记

价值 - 风险管理(二)

石云升

读书笔记 风险管理 28天写作 价值

去中心化DAPP系统APP开发|去中心化DAPP软件开发

系统开发

大作业(一)

橘子皮嚼着不脆

搭建自己的MinDoc文档库

后台技术汇

28天写作

消失的同事

石君

时代发展 28天写作

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