日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

云端TensorFlow读取数据IO的高效方式

發(fā)布時間:2025/4/5 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 云端TensorFlow读取数据IO的高效方式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

低效的IO方式

最近通過觀察PAI平臺上TensoFlow用戶的運行情況,發(fā)現(xiàn)大家在數(shù)據(jù)IO這方面還是有比較大的困惑,主要是因為很多同學沒有很好的理解本地執(zhí)行TensorFlow代碼和分布式云端執(zhí)行TensorFlow的區(qū)別。本地讀取數(shù)據(jù)是server端直接從client端獲得graph進行計算,而云端服務server在獲得graph之后還需要將計算下發(fā)到各個worker處理(具體原理可以參考視頻教程-Tensorflow高級篇:https://tianchi.aliyun.com/competition/new_articleDetail.html)。

本文通過讀取一個簡單的CSV文件為例,幫助大家快速了解如何使用TensorFlow高效的讀取數(shù)據(jù)。CSV文件如下:

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

首先我們來看下大家容易產(chǎn)生問題的幾個地方。

1.不建議用python本地讀取文件的方式

PAI支持python的自帶IO方式,但是需要將數(shù)據(jù)源和代碼打包上傳的方式使用,這種讀取方式是將數(shù)據(jù)寫入內(nèi)存之后再計算,效率比較低,不建議使用。范例代碼如下:

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

2.盡量不要用第三方庫的讀取文件方法

很多同學使用第三方庫的一些數(shù)據(jù)IO的方式進行數(shù)據(jù)讀取,比如TFLearn、Panda的數(shù)據(jù)IO方式,這些方法很多都是通過封裝PYTHON的讀取方式實現(xiàn)的,所以在PAI平臺使用的時候也會造成效率低下問題。

3.盡量不要用preload的方式讀取文件

很多人在用PAI的服務的時候表示GPU并沒有比本地的CPU速度快的明顯,主要問題可能就出在數(shù)據(jù)IO這塊。preload的方式是先把數(shù)據(jù)全部都讀到內(nèi)存中,然后再通過session計算,比如feed的讀取方式。這樣要先進行數(shù)據(jù)讀取,再計算,不同步造成性能浪費,同時因為內(nèi)存限制也無法支持大數(shù)據(jù)量的計算。舉個例子:假設我們的硬盤中有一個圖片數(shù)據(jù)集0001.jpg,0002.jpg,0003.jpg……我們只需要把它們讀取到內(nèi)存中,然后提供給GPU或是CPU進行計算就可以了。這聽起來很容易,但事實遠沒有那么簡單。事實上,我們必須要把數(shù)據(jù)先讀入后才能進行計算,假設讀入用時0.1s,計算用時0.9s,那么就意味著每過1s,GPU都會有0.1s無事可做,這就大大降低了運算的效率。

下面我們看下高效的讀取方式。

高效的IO方式

高效的TensorFlow讀取方式是將數(shù)據(jù)讀取轉(zhuǎn)換成OP,通過session run的方式拉去數(shù)據(jù)。另外,讀取線程源源不斷地將文件系統(tǒng)中的圖片讀入到一個內(nèi)存的隊列中,而負責計算的是另一個線程,計算需要數(shù)據(jù)時,直接從內(nèi)存隊列中取就可以了。這樣就可以解決GPU因為IO而空閑的問題!

下面我們看下代碼,如何在PAI平臺通過OP的方式讀取數(shù)據(jù):

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文件路徑,可以是數(shù)組,方便下一階段shuffle
  • reader:TF內(nèi)置各種reader API,可以根據(jù)需求選用
  • tf.train.string_input_producer:將文件生成隊列
  • tf.decode_csv:是一個splite功能的OP,可以拿到每一行的特定參數(shù)
  • 通過OP獲取數(shù)據(jù),在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

我們循環(huán)輸出4次,打印出第2個字段。結(jié)果如圖:

輸出結(jié)果也證明了數(shù)據(jù)結(jié)構(gòu)是成隊列。

其它

  • 我的微信公眾號(長期分享機器學習干貨):凡人機器學習

  • PAI notebook功能上線,支持在線修改代碼并且內(nèi)置各種深度學習框架,歡迎使用:https://data.aliyun.com/product/learn

  • 強烈推薦視頻教程:https://tianchi.aliyun.com/competition/new_articleDetail.html
  • 本文參考了互聯(lián)網(wǎng)上《十圖詳解TensorFlow數(shù)據(jù)讀取機制(附代碼)》一文,關于圖片的讀取方式也可以參考這篇文章,感謝原作者。

總結(jié)

以上是生活随笔為你收集整理的云端TensorFlow读取数据IO的高效方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。