低效的IO方式

最近通过观察PAI平台上TensoFlow用户的运行情况,发现大家在数据IO这方面还是有比较大的困惑,主要是因为很多同学没有很好的理解本地执行TensorFlow代码和分布式云端执行TensorFlow的区别。本地读取数据是server端直接从client端获得graph进行计算,而云端服务server在获得graph之后还需要将计算下发到各个worker处理(具体原理可以参考视频教程-Tensorflow高级篇:https://tianchi.aliyun.com/competition/new_articleDetail.html)。

本文通过读取一个简单的CSV文件为例,帮助大家快速了解如何使用TensorFlow高效的读取数据。CSV文件如下:

1,1,1,1,1
2,2,2,2,2
3,3,3,3,3  

首先我们来看下大家容易产生问题的几个地方。

1.不建议用python本地读取文件的方式

PAI支持python的自带IO方式,但是需要将数据源和代码打包上传的方式使用,这种读取方式是将数据写入内存之后再计算,效率比较低,不建议使用。范例代码如下:

import csv
csv_reader=csv.reader(open('csvtest.csv'))
for row in csv_reader:print(row)  

2.尽量不要用第三方库的读取文件方法

很多同学使用第三方库的一些数据IO的方式进行数据读取,比如TFLearn、Panda的数据IO方式,这些方法很多都是通过封装PYTHON的读取方式实现的,所以在PAI平台使用的时候也会造成效率低下问题。

3.尽量不要用preload的方式读取文件

很多人在用PAI的服务的时候表示GPU并没有比本地的CPU速度快的明显,主要问题可能就出在数据IO这块。preload的方式是先把数据全部都读到内存中,然后再通过session计算,比如feed的读取方式。这样要先进行数据读取,再计算,不同步造成性能浪费,同时因为内存限制也无法支持大数据量的计算。举个例子:假设我们的硬盘中有一个图片数据集0001.jpg,0002.jpg,0003.jpg……我们只需要把它们读取到内存中,然后提供给GPU或是CPU进行计算就可以了。这听起来很容易,但事实远没有那么简单。事实上,我们必须要把数据先读入后才能进行计算,假设读入用时0.1s,计算用时0.9s,那么就意味着每过1s,GPU都会有0.1s无事可做,这就大大降低了运算的效率。

下面我们看下高效的读取方式。

高效的IO方式

高效的TensorFlow读取方式是将数据读取转换成OP,通过session run的方式拉去数据。另外,读取线程源源不断地将文件系统中的图片读入到一个内存的队列中,而负责计算的是另一个线程,计算需要数据时,直接从内存队列中取就可以了。这样就可以解决GPU因为IO而空闲的问题!

下面我们看下代码,如何在PAI平台通过OP的方式读取数据:

import argparse
import tensorflow as tf
import os
FLAGS=None
def main(_):dirname = os.path.join(FLAGS.buckets, "csvtest.csv")reader=tf.TextLineReader()filename_queue=tf.train.string_input_producer([dirname])key,value=reader.read(filename_queue)record_defaults=[[''],[''],[''],[''],['']]d1, d2, d3, d4, d5= tf.decode_csv(value, record_defaults, ',')init=tf.initialize_all_variables()with tf.Session() as sess:sess.run(init)coord = tf.train.Coordinator()threads = tf.train.start_queue_runners(sess=sess,coord=coord)for i in range(4):print(sess.run(d2))coord.request_stop()coord.join(threads)if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--buckets', type=str, default='',help='input data path')parser.add_argument('--checkpointDir', type=str, default='',help='output model path')FLAGS, _ = parser.parse_known_args()tf.app.run(main=main)
  • dirname:OSS文件路径,可以是数组,方便下一阶段shuffle
  • reader:TF内置各种reader API,可以根据需求选用
  • tf.train.string_input_producer:将文件生成队列
  • tf.decode_csv:是一个splite功能的OP,可以拿到每一行的特定参数
  • 通过OP获取数据,在session中需要tf.train.Coordinator()和tf.train.start_queue_runners(sess=sess,coord=coord)

在代码中,我们的输入是3行5个字段:

1,1,1,1,1
2,2,2,2,2
3,3,3,3,3  

我们循环输出4次,打印出第2个字段。结果如图:

输出结果也证明了数据结构是成队列。

其它

  • 我的微信公众号(长期分享机器学习干货):凡人机器学习

  • PAI notebook功能上线,支持在线修改代码并且内置各种深度学习框架,欢迎使用:https://data.aliyun.com/product/learn

  • 强烈推荐视频教程:https://tianchi.aliyun.com/competition/new_articleDetail.html
  • 本文参考了互联网上《十图详解TensorFlow数据读取机制(附代码)》一文,关于图片的读取方式也可以参考这篇文章,感谢原作者。

云端TensorFlow读取数据IO的高效方式相关推荐

  1. pytorch dataset读取数据流程_高效 PyTorch :如何消除训练瓶颈

    加入极市专业CV交流群,与 10000+来自港科大.北大.清华.中科院.CMU.腾讯.百度 等名校名企视觉开发者互动交流! 同时提供每月大咖直播分享.真实项目需求对接.干货资讯汇总,行业技术交流.关注 ...

  2. Tensorflow读取数据-tf.data.TFRecordDataset

    tensorflow TFRecords文件的生成和读取方法 文章目录 tensorflow TFRecords文件的生成和读取方法 1. TFRecords说明 2.关键API 2.1 tf.io. ...

  3. oracle读取数据方式,关于oracle数据库读取数据的三种方式

    打开oracle sqldeveloper,连接到HR模式下的数据库,在SQL工作表中,执行如下语句: CREATE TABLE WANG( Name  varchar2(6), ID     num ...

  4. oracle从mysql抓数据_关于oracle数据库读取数据的三种方式

    打开oracle sqldeveloper,连接到HR模式下的数据库,在SQL工作表中,执行如下语句: CREATE TABLE WANG( Name  varchar2(6), ID     num ...

  5. mysql数据传出_从MySQL读取数据,以List方式传出

    代码如下:publicListselectDb(){Listlist=newArrayList();InfoForminfo=newInfoForm();Statementsm=null;Result ...

  6. TensorFlow高效读取数据的方法

    概述 最新上传的mcnn中有完整的数据读写示例,可以参考. 关于Tensorflow读取数据,官网给出了三种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Pytho ...

  7. 【深度学习】高效读取数据的方法(TFRecord)

    Record顾名思义主要是为了记录数据的. 使用TFRocord存储数据的好处: 为了更加方便的建图,原来使用placeholder的话,还要每次feed_dict一下,使用TFRecord+ Dat ...

  8. java解析tfrecord_TensorFlow高效读取数据的方法——TFRecord的学习

    摘要: ortmatplotlib.pyplotaspltimportcv2defshow_image(title,image):'''显示图片:paramtitle:图像标题:paramimage: ...

  9. python如何读取tfrecord_tensorflow学习笔记——高效读取数据的方法(TFRecord)

    关于TensorFlow读取数据,官网给出了三种方法: 供给数据(Feeding):在TensorFlow程序运行的每一步,让python代码来供给数据. 从文件读取数据:在TensorFlow图的起 ...

最新文章

  1. linux简单目录,Linux下各目录简单整理
  2. Selenium提取数据之标签对象提取文本内容和属性值
  3. silverlight 跨域文件位置
  4. Java 技术篇-借助自定义对象实现函数返回多个不同类型的值实例演示
  5. Mavan的配置,以及与IDEA版本不一致,解决办法
  6. klearn 文本分类_使用gensim和sklearn搭建一个文本分类器
  7. bzoj1230[Usaco2008 Nov]lites 开关灯*
  8. C#逻辑运算符及解析
  9. 百度顶会论文复现(1):课程概述
  10. f5+big+client+android,F5负载均衡 MIBs bigip oid
  11. 求和符号上下的值怎么打_Excel快速求和的N种方法,一网打尽
  12. 六招制敌,搞定 core dump 问题
  13. informix 访问mysql_Informix 11.7 使用非系统用户访问数据库
  14. java中this关键字的作用
  15. 完美解决“运行引擎需要DX11特性等级10.0”
  16. 【转】概要设计文档编写规范
  17. 2022年烷基化工艺模拟考试题及烷基化工艺模拟考试题库
  18. 单元测试报错Wanted but not invoked:
  19. 五险一金,终于懂了!
  20. [Python爬虫]爬取新浪理财师股票问答

热门文章

  1. net-snmp交叉编译出现 undefined reference to dlopen,dlsym,dlclose错误
  2. 模拟命令行自动输入的HTML,HTML5 命令行界面仿真和自动打字动画
  3. 计算机专业2016高考录取分数线,中国科学院大学计算机科学与技术专业2016年在江苏理科高考录取最低分数线...
  4. xman的思维导图快捷键_一次性入门大纲笔记神器“幕布”,支持一键生成思维导图...
  5. 计算机应用基础2004年,计算机应用基础2004年下半年全国试题参考答案2
  6. mysql主从复制原理 简书_mysql主从复制,从原理讲到安装配置,全干货
  7. 统计输入字符串中英文单词的个数
  8. 3_电子商务开发模型与java的关系_计算机网络与软件工程专业作业答案
  9. 最新的ndkr20编译c_史上最优雅的NDK加载pass方案
  10. html传递guid参数,C#中的Guid.ToString鲜为人知参数用法