色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

tf.data API的功能和最佳實踐操作

Tensorflowers ? 來源:lq ? 2019-01-11 13:51 ? 次閱讀

GPU 和 TPU 可以從根本上縮短執行單個訓練步驟所需的時間。欲將性能提高到極致,則需要有一個高效的輸入管道,能夠在當前步驟完成之前為下一步提供數據。tf.data API 有助于構建靈活高效的輸入管道。本文介紹了 tf.data API 的功能和最佳實踐操作,用于在各種模型和加速器上構建高性能 TensorFlow 輸入管道。

本文將主要介紹下列內容:

說明 TensorFlow 輸入管道本質上是一個ETL過程

描述 tf.dataAPI 上下文中的常見性能優化

討論應用轉換順序的性能影響

總結設計高性能 TensorFlow 輸入管道的最佳實踐操作。

輸入數據管道的結構

一個典型的 TensorFlow 訓練輸入管道可以構建為 ETL 過程:

提取:從持久存儲中讀取數據 - 本地(例如 HDD 或 SSD)或遠程(例如 GCS 或 HDFS)

轉換:使用 CPU 內核對數據進行解析和執行預處理操作,例如圖像解壓縮,數據擴充轉換(例如隨機裁剪,翻轉和顏色失真),隨機洗牌和批處理

加載:將變換后的數據加載到執行機器學習模型的加速器設備(例如,GPU 或 TPU)上。

這種模式有效地利用了 CPU,與此同時為了模型訓練這種繁重的工作,還保留了加速器。此外,將輸入管道視為 ETL 過程提供了便于性能優化應用的結構。

使用 tf.estimator.EstimatorAPI 時,前兩個階段(提取和轉換)將在傳遞給 tf.estimator.Estimator 的 input_fn 中捕獲。在代碼中,這可能會看起來像以下(naive, sequential)執行情況:

defparse_fn(example): "Parse TFExample records and perform simple data augmentation." example_fmt = { "image": tf.FixedLengthFeature((), tf.string, ""), "label": tf.FixedLengthFeature((), tf.int64, -1) } parsed = tf.parse_single_example(example, example_fmt) image = tf.image.decode_image(parsed["image"]) image = _augment_helper(image) # augments image using slice, reshape, resize_bilinear returnimage, parsed["label"]definput_fn(): files = tf.data.Dataset.list_files("/path/to/dataset/train-*.tfrecord") dataset = files.interleave(tf.data.TFRecordDataset) dataset = dataset.shuffle(buffer_size=FLAGS.shuffle_buffer_size) dataset = dataset.map(map_func=parse_fn) dataset = dataset.batch(batch_size=FLAGS.batch_size) returndataset

下一部分將基于此輸入管道構建,添加性能優化。

性能優化

首先,我們定義要使用的模型種類。主智能體會擁有全局網絡,且每個本地工作器智能體在自己的進程中都會擁有此網絡的副本。我們會使用模型子類化對模型進行實例化。雖然模型子類化會使進程更冗長,但卻為我們提供了最大的靈活性。

正如您從我們的正向傳遞中看到的,我們的模型會采用輸入和返回策略概率的分對數和值。

隨著新的計算設備(諸如 GPU 和 TPU)不斷問世,訓練神經網絡的速度變得越來越快,這種情況下 CPU 處理很容易成為瓶頸。tf.dataAPI 為用戶提供構建塊,以設計有效利用 CPU 的輸入管道,優化 ETL 過程的每個步驟。

Pipelining

要執行訓練步驟,您必須首先提取并轉換訓練數據,然后將其提供給在加速器上運行的模型。然而,在一個簡單的同步執行中,當 CPU 正在準備數據時,加速器則處于空閑狀態。相反,當加速器正在訓練模型時,CPU 則處于空閑狀態。因此,訓練步驟時間是 CPU 預處理時間和加速器訓練時間的總和。

Pipelining 將一個訓練步驟的預處理和模型執行重疊。當加速器正在執行訓練步驟 N 時,CPU 正在準備步驟 N + 1 的數據。這樣做的目的是可以將步驟時間縮短到極致,包含訓練以及提取和轉換數據所需時間(而不是總和)。

如果沒有使用 pipelining,則 CPU 和 GPU / TPU 在大部分時間處于閑置狀態:

而使用 pipelining 技術后,空閑時間顯著減少:

tf.dataAPI 通過 tf.data.Dataset.prefetch 轉換提供了一個軟件 pipelining 操作機制,該轉換可用于將數據生成的時間與所消耗時間分離。特別是,轉換使用后臺線程和內部緩沖區,以便在請求輸入數據集之前從輸入數據集中預提取元素。因此,為了實現上面說明的 pipelining 效果,您可以將 prefetch(1) 添加為數據集管道的最終轉換(如果單個訓練步驟消耗 n 個元素,則添加 prefetch(n))。

要將此更改應用于我們的運行示例,請將:

dataset = dataset.batch(batch_size=FLAGS.batch_size)returndataset

更改為:

dataset = dataset.batch(batch_size=FLAGS.batch_size)dataset = dataset.prefetch(buffer_size=FLAGS.prefetch_buffer_size)returndataset

請注意,在任何時候只要有機會將 “制造者” 的工作與 “消費者” 的工作重疊,預取轉換就會產生效益。前面的建議只是最常見的應用程序。

將數據轉換并行化

準備批處理時,可能需要預處理輸入元素。為此,tf.dataAPI 提供了 tf.data.Dataset.map 轉換,它將用戶定義的函數(例如,運行示例中的 parse_fn)應用于輸入數據集的每個元素。由于輸入元素彼此獨立,因此可以跨多個 CPU 內核并行化預處理。為了實現這一點,map 轉換提供了 thenum_parallel_calls 參數來指定并行度。例如,下圖說明了將 num_parallel_calls = 2 設置為 map 轉換的效果:

為 num_parallel_calls 參數選擇最佳值取決于您的硬件,訓練數據的特征(例如其大小和形狀),Map 功能的成本以及在 CPU 上同時進行的其他處理;一個簡單的啟發式方法是使用可用的 CPU 內核數。例如,如果執行上述示例的機器有 4 個內核,則設置 num_parallel_calls = 4 會更有效。另一方面,將 num_parallel_calls 設置為遠大于可用 CPU 數量的值可能會導致調度效率低下,從而導致速度減慢。

要將此更改應用于我們的運行示例,請將:

dataset = dataset.map(map_func=parse_fn)

變更為:

dataset = dataset.map(map_func=parse_fn, num_parallel_calls=FLAGS.num_parallel_calls)

此外,如果您的批處理大小為數百或數千,您的 pipeline 可能還可以通過并行化批處理創建而從中獲益。為此,tf.dataAPI 提供了 tf.contrib.data.map_and_batch 轉換,它有效地 “融合” 了 map 和批處理的轉換。

要將此更改應用于我們的運行示例,請將:

dataset = dataset.map(map_func=parse_fn, num_parallel_calls=FLAGS.num_parallel_calls)dataset = dataset.batch(batch_size=FLAGS.batch_size)

更改為:

dataset = dataset.apply(tf.contrib.data.map_and_batch( map_func=parse_fn, batch_size=FLAGS.batch_size))

將數據提取并行化

在實際環境中,輸入數據可能被遠程存儲(例如,GCS 或 HDFS),因為輸入數據不適合本地,或者因為訓練是分布式的,因此在每臺機器上復制輸入數據是沒有意義的。在本地讀取數據時運行良好的數據集管道在遠程讀取數據時可能會成為 I / O 的瓶頸,因為本地存儲和遠程存儲之間存在以下差異:

首字節時間:從遠程存儲中讀取文件的第一個字節可能比本地存儲長幾個數量級

讀取吞吐量:雖然遠程存儲通常提供較大的聚合帶寬,但讀取單個文件可能只能使用此帶寬的一小部分。

另外,一旦將原始字節讀入存儲器,也可能需要對數據進行反序列化或解密(例如,protobuf),這就增加了額外的系統開銷。無論數據是本地存儲還是遠程存儲,都存在這種開銷,如果數據未被有效預取,則在遠程情況下情況可能更糟。

為了減輕各種數據提取開銷的影響,tf.dataAPI 提供了 tf.contrib.data.parallel_interleave 轉換。使用此轉換可以將其他數據集(例如數據文件讀取器)的內容執行和交錯并行化。可以通過 cycle_length 參數指定要重疊的數據集的數量。

為 parallel_interleavetransformation 提供 cycle_length = 2 的效果如下圖所示:

要將此更改應用于我們的運行示例,請將:

dataset = files.interleave(tf.data.TFRecordDataset)

更改為:

dataset = files.apply(tf.contrib.data.parallel_interleave( tf.data.TFRecordDataset, cycle_length=FLAGS.num_parallel_readers))

由于負載或網絡事件,遠程存儲系統的吞吐量可能會隨時間而變化。為了解釋這種差異,parallel_interleave 轉換可以選擇使用預取。(請參考 tf.contrib.data.parallel_interleave 了解詳情 https://tensorflow.google.cn/api_docs/python/tf/contrib/data/parallel_interleave?hl=zh-CN)。

默認情況下,parallel_interleave 轉換提供了元素的確定性排序使之重現。作為預取的替代方法(在某些情況下可能無效),parallel_interleave 轉換還提供了一個選項,能夠以保證排序作為代價來提高性能。尤其是如果 sloppy 參數設置為 true,則轉換可能會偏離其確定的排序,在請求下一元素時那些不可用文件將會暫時跳過。

性能注意事項

tf.dataAPI 圍繞可組合轉換而設計,為用戶提供了靈活性。雖然這些轉換中的許多都是可交換的,但某些轉換的排序具有性能上的影響。

Map 和 batch

調用傳遞給 map 轉換的用戶定義函數會帶來與調度和執行用戶定義函數相關的系統開銷。通常,與函數執行的計算量相比,這種系統開銷很小。但是,如果 map 幾乎沒有使用,那么這種開銷可能會占據總成本的大多數。在這種情況下,我們建議對用戶定義的函數進行矢量化(即,讓它一次對一批輸入進行操作),并在 map 轉換之前應用 batch 轉換。

Map 和 cache

tf.data.Dataset.cache 轉換可以在內存或本地存儲中緩存數據集。如果傳遞給 map 轉換的用戶定義函數非常高,只要結果數據集仍然適合內存或本地存儲,就可以在 map 轉換后應用緩存轉換。如果用戶定義的函數增加了存儲數據集所需的空間超出緩存容量,請考慮在訓練作業之前預處理數據以減少資源使用。

Map 和Interleave / Prefetch / Shuffle

許多轉換(包括 Interleave,prefetch 和 shuffle)會保留元素的內部緩沖區。如果傳遞給 map 變換的用戶定義函數改變了元素的大小,那么 map 變換的順序和緩沖元素的變換會影響內存使用。通常來說,除非由于性能需要不同的排序(例如,啟用 map 和 batch 轉換的融合)的情況,否則我們建議選擇帶來較低內存占用的順序。

Repeat 和 Shuffle

tf.data.Dataset.repeat 轉換以有限(或無限)次數重復輸入數據; 每次數據重復通常稱為 epoch。

tf.data.Dataset.shuffle 轉換隨機化數據集示例的順序。

如果在 shuffle 變換之前應用 repeat 變換,則 epoch 的邊界模糊。也就是說,某些元素可以在其他元素出現之前重復一次。另一方面,如果在 repeat 變換之前應用 shuffle 變換,則性能可能在與 shuffle 轉換的內部狀態的初始化相關的每個 epoch 時期的開始時減慢。換句話說,前者(repeat before shuffle)提供更好的性能,而后者(shuffle before repeat)提供更強的排序保證。

如果可能,我們推薦使用融合的 tf.contrib.data.shuffle_and_repeat 轉換,它結合了兩方面的優點(良好的性能和強大的排序保證)。否則,我們建議在 repeating 之前進行 shuffling。

最佳的實踐操作摘要

以下是設計輸入管道的最佳實踐操作摘要:

使用 prefetch 轉換重疊 “制造者” 和 “消費者” 的工作。特別是,我們建議將 prefetch(n)(其中 n 是訓練步驟消耗的元素 / 批次數)添加到輸入管道的末尾,以便在 CPU 上執行的轉換與加速器上的訓練重疊

通過設置 num_parallel_calls 參數來并行化 map 轉換。我們建議使用可用 CPU 內核數作為其參數值

如果使用 batch 轉換將預處理元素組合成批處理,我們建議使用融合的 map_and_batch 轉換,特別是在您使用大型批處理的情況下

如果您正在處理遠程存儲的數據和 / 或需要反序列化,我們建議使用 parallel_interleave 轉換來重疊來自不同文件的數據的讀取(和反序列化)

向傳遞到 map 轉換的廉價用戶定義函數進行向量化,以分攤與調度和執行函數相關的系統開銷

如果您的數據可以存儲于內存中,請使用 cache 轉換在第一個 epoch 期間將其緩存在內存中,以便后續 epoch 期間避免發生與讀取,解析和轉換相關的系統開銷

如果預處理增加了數據的大小,我們建議您首先應用 interleave,prefetch 和 shuffle(如果可能的話)以減少內存使用量

我們建議在 repeat 轉換之前應用 shuffle 轉換,理想情況下使用融合的 shuffle_and_repeat 轉換。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 加速器
    +關注

    關注

    2

    文章

    796

    瀏覽量

    37839
  • 神經網絡
    +關注

    關注

    42

    文章

    4771

    瀏覽量

    100714
  • 管道
    +關注

    關注

    3

    文章

    145

    瀏覽量

    17961

原文標題:tf.data API,構建高性能 TensorFlow 輸入管道

文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C編程最佳實踐.doc

    C編程最佳實踐.doc
    發表于 08-17 14:37

    PyODPS開發中的最佳實踐

    PyODPS開發中的最佳實踐摘要: PyODPS支持用 Python 來對 MaxCompute 對象進行操作,它提供了 DataFrame API 來用類似 pandas 的接口進行
    發表于 01-29 13:51

    Dockerfile的最佳實踐

    ”微服務一條龍“最佳指南-“最佳實踐”篇:Dockerfile
    發表于 07-11 16:22

    6行代碼如何實現對TF卡的讀寫功能

    前言shineblink core 開發板(簡稱Core)的庫函數支持TF卡讀寫功能,所以只需要調用兩三個API,即可實現TF卡的操作。PS
    發表于 02-09 08:04

    虛幻引擎的紋理最佳實踐

    紋理是游戲不可或缺的一部分。 這是一個藝術家可以直接控制的領域,以提高游戲的性能。 本最佳實踐指南介紹了幾種紋理優化,這些優化可以幫助您的游戲運行得更流暢、看起來更好。 最佳實踐系列指
    發表于 08-28 06:39

    嵌入式實時操作系統原理與最佳實踐

    嵌入式實時操作系統原理與最佳實踐,下來看看
    發表于 07-29 17:11 ?178次下載

    構建簡單數據管道,為什么tf.data要比feed_dict更好?

    如果想減少GPU閑置時間,我們可以在管道末尾添加tf.data.Dataset.prefetch(buffer_size),其中buffer_size這個參數表示預抓取的batch數,我們一般設buffer_size=1,但在某些情況下,尤其是處理每個batch耗時不同時,我們也可以適當擴大一點。
    的頭像 發表于 12-03 09:08 ?4542次閱讀

    TensorFlow 2.0將專注于簡單性和易用性

    使用 tf.data 加載數據。使用輸入管道讀取訓練數據,用 tf.data 創建的輸入線程讀取訓練數據。使用 tf.feature_column 描述特征,例如嵌套和特征交叉。還支持從內存數據(例如 NumPy)中方便地輸入
    的頭像 發表于 01-18 10:44 ?2595次閱讀
    TensorFlow 2.0將專注于簡單性和易用性

    6行代碼實現對TF卡的讀寫功能

    前言shineblink core 開發板(簡稱Core)的庫函數支持TF卡讀寫功能,所以只需要調用兩三個API,即可實現TF卡的操作。PS
    發表于 12-05 19:06 ?10次下載
    6行代碼實現對<b class='flag-5'>TF</b>卡的讀寫<b class='flag-5'>功能</b>

    支持動態并行的CUDA擴展功能最佳應用實踐

      本文檔描述了支持動態并行的 CUDA 的擴展功能,包括為利用這些功能而對 CUDA 編程模型進行必要的修改和添加,以及利用此附加功能的指南和最佳
    的頭像 發表于 04-28 09:31 ?1266次閱讀
    支持動態并行的CUDA擴展<b class='flag-5'>功能</b>和<b class='flag-5'>最佳</b>應用<b class='flag-5'>實踐</b>

    local-data-api-gateway本地數據API網關

    ./oschina_soft/gitee-local-data-api-gateway.zip
    發表于 06-14 10:27 ?2次下載
    local-<b class='flag-5'>data-api</b>-gateway本地數據<b class='flag-5'>API</b>網關

    使用Postman成功實現API測試自動化的最佳實踐

      API 測試自動化支持兩個獨立軟件系統之間的通信和數據交換。實現 API 的軟件系統包含可由另一個軟件系統執行的功能/子例程。它通過增加測試覆蓋率和頻率來幫助創建更健壯和抗錯誤的程序。
    的頭像 發表于 06-20 10:19 ?927次閱讀

    使用Postman成功實現API測試自動化的最佳實踐

      API 測試自動化支持兩個獨立軟件系統之間的通信和數據交換。實現 API 的軟件系統包含可由另一個軟件系統執行的功能/子例程。它通過增加測試覆蓋率和頻率來幫助創建更健壯和抗錯誤的程序。
    的頭像 發表于 07-05 10:46 ?952次閱讀

    使用tf.data進行數據集處理

    在進行AI模型訓練過程前,需要對數據集進行處理, Tensorflow提供了tf.data數據集處理模塊,通過該接口能夠輕松實現數據集預處理。tf.data支持對數據集進行大量處理,如圖片裁剪、圖片打亂、圖片分批次處理等操作
    的頭像 發表于 11-29 15:34 ?1238次閱讀

    簡述API版本控制最佳實踐

    無論下一次迭代是一個完整的版本升級還是一個功能擴展,重要的是要考慮你如何讓你的開發人員知道它的優缺點。與傳統的軟件版本控制相比,API版本控制可能會對下游使用它的產品產生復雜的影響。
    的頭像 發表于 02-22 10:42 ?550次閱讀
    主站蜘蛛池模板: chinesetoilet美女沟| 成人区在线观看免费视频| 日产国产欧美韩国在线| 国产亚洲视频精彩在线播放| 中文在线日韩亚洲制服| 网友自拍区视频精品| 免费乱理伦片在线观看夜| 国产在线aaa片一区二区99| 宝贝好紧好爽再搔一点试視頻| 亚洲午夜精品aaa级久久久久| 日本无码人妻丰满熟妇5G影院| 久久re视频这里精品免费1| 国产精品99久久久久久AV| avove主播| 中文在线日韩亚洲制服| 亚洲 欧美 日韩 精品 自拍| 日本三级床震| 欧美人与禽zoz0性伦交app| 久久亚洲A片COM人成A| 黑丝美女被人操| 国产精品无码久久av| 补课H湿 1V1 PLAY| 97人妻精品全国免费视频| 亚洲永久在线观看| 久久婷婷电影网| 国产精品人妻系列21P| 大香伊人久久精品一区二区| 97在线精品视频| 综合精品欧美日韩国产在线 | 漂亮的保姆6在线观看中文 | 男女免费观看在线爽爽爽视频| 九九热这里只有精品2| 国产中文在线| 国内自拍 在线 亚洲 欧美| 国产色综合色产在线视频| 国产国产成人人免费影院| 第一次处破女高清电影| 国产 交换 丝雨 巅峰| 国产极品美女视频福利| 国产精品久久久久久人妻香蕉| 国产传媒18精品免费1区|