TensorFlow 2.4來了:上線對分布式訓練和混合精度的新功能支持

2021-02-15 機器之心

選自TensorFlow Blog

機器之心編譯
編輯:小舟、蛋醬

今天,谷歌正式發布了 TensorFlow 2.4,帶來了多項新特性和功能改進。

TensorFlow 2.4 的更新包括對於分布式訓練和混合精度的新功能支持,對 NumPy API 子集的試驗性支持以及一些用於監測性能瓶頸的新工具。根據 TensorFlow 官方博客,本次更新的主要內容整理如下:在 TensorFlow 2.4 中,tf.distribute 模塊引入了對使用 ParameterServerStrategy 和自定義訓練循環進行模型異步訓練的試驗性支持。和 MultiWorkerMirroredStrategy 類似,ParameterServerStrategy 是一種多工作器(multi-worker)數據並行策略,但梯度更新是異步的。參數伺服器訓練集群由工作伺服器和參數伺服器組成。變量在參數伺服器上創建,然後在每個步驟中由工作器讀取和更新。變量的讀取和更新在工作器之間是獨立進行的,不存在任何同步。由於工作器彼此不依賴,因此該策略具有工作器容錯的優勢,如果使用可搶佔 VM,該策略將很有用。MultiWorkerMirroredStrategy 已經脫離試驗階段,成為穩定的 API。像單工作器的 MirroredStrategy 一樣,MultiWorkerMirroredStrategy 通過同步數據並行實現分布式訓練,顧名思義,藉助 MultiWorkerMirroredStrategy 可以在多臺機器上進行訓練,每臺機器都可能具有多個 GPU。

在 TensorFlow 2.4 中,Keras 混合精度 API 已經脫離試驗階段,成為穩定的 API。大多數 TensorFlow 模型使用 float32 dtype,但現在有些低精度數據類型佔用的內存更少,比如 float16。混合精度指的是在同一模型中使用 16 位和 32 位浮點數以進行更快的訓練。這一 API 可將模型性能在 GPU 上提高到 3 倍,在 TPU 上提高 60%。要使用混合精度 API,必須使用 Keras 層和優化器,但不一定需要使用其他 Keras 類。本次更新包括重構 tf.keras.optimizers.Optimizer 類,讓 model.fit 的用戶和自定義訓練循環的用戶能夠編寫可與任何優化器一起使用的訓練代碼。所有內置 tf.keras.optimizer.Optimizer 子類都可接受 gradient_transformers 和 gradient_aggregator 參數,輕鬆定義自定義梯度變換。重構之後,使用者可以在編寫自定義訓練循環時直接將損失張量傳遞給 Optimizer.minimize:
tape = tf.GradientTape()with tape:  y_pred = model(x, training=True)  loss = loss_fn(y_pred, y_true)
optimizer.minimize(loss, model.trainable_variables, tape=tape)

這些更新的目標是讓 Model.fit 和自定義訓練循環與優化器細節更加不相關,從而讓使用者無需修改即可編寫出與任何優化器共同使用的訓練代碼。最後,TensorFlow 2.4 的更新還包括 Keras Functional API 內部的重構,改善了函數式模型構造所產生的內存消耗並簡化了觸發邏輯。這種重構可以保證 TensorFlowOpLayers 的行為可預測,並且可以使用 CompositeTensor 類型籤名(type signature)。TensorFlow 2.4 引入了對 NumPy API 子集的試驗性支持。該模塊可以運行由 TensorFlow 加速的 NumPy 代碼,由於這一 API 是基於 TensorFlow 構建的,因此可與 TensorFlow 無縫銜接,允許訪問所有 TensorFlow API 並通過編譯和自動矢量化提供優化後的運行。例如,TensorFlow ND 數組可以與 NumPy 函數互通,類似地,TensorFlow NumPy 函數可以接受包括 tf.Tensor 和 np.ndarray 在內的不同類型輸入。
import tensorflow.experimental.numpy as tnp# Use NumPy code in input pipelines
dataset = tf.data.Dataset.from_tensor_slices( tnp.random.randn(1000, 1024)).map(lambda z: z.clip(-1,1)).batch(100)# Compute gradients through NumPy codedef grad(x, wt):with tf.GradientTape() as tape: tape.watch(wt) output = tnp.dot(x, wt) output = tf.sigmoid(output)return tape.gradient(tnp.sum(output), wt)

TensorFlow Profiler 是度量 TensorFlow 模型的訓練性能和資源消耗情況的工具,用來診斷性能瓶頸,最終加快訓練速度。此前,TensorFlow Profiler 支持多 GPU 單主機訓練。到了 2.4 版本,使用者可以測試 MultiWorkerMirroredStrategy 的訓練工作了,比如使用採樣模式 API 按需配置,並連接到 MultiWorkerMirroredStrategy 工作器正在使用的同一伺服器。
# Start a profiler server before your model runs.

tf.profiler.experimental.server.start(6009)# Model code goes here....# E.g. your worker IP addresses are 10.0.0.2, 10.0.0.3, 10.0.0.4, and you# would like to profile for a duration of 2 seconds. The profiling data will# be saved to the Google Cloud Storage path 「your_tb_logdir」.
tf.profiler.experimental.client.trace('grpc://10.0.0.2:6009,grpc://10.0.0.3:6009,grpc://10.0.0.4:6009','gs://your_tb_logdir',2000)

另外,你可以通過向捕獲配置文件工具提供工作器地址來使用 TensorBoard 配置文件插件。配置之後,你可以使用新的 Pod Viewer tool 來選擇訓練步驟,並查看所有工作器上該步驟的 step-time 的細分。TFLite Profiler 則支持在 Android 中跟蹤 TFLite 內部信息,以識別性能瓶頸。TensorFlow 2.4 與 CUDA 11 和 cuDNN 8 配合運行,支持最新發布的英偉達安培架構 GPU,對於 CUDA 11 的新特性,可以參考英偉達開發者博客:https://developer.nvidia.com/blog/cuda-11-features-revealed/在新版本中,默認情況下會啟用安培 GPU 的新特性——對 TensorFloat-32 的支持。TensorFloat-32 又簡稱為 TF32,是英偉達 Ampere GPU 的一種數學精度模式,可導致某些 float32 運算(如矩陣乘法和卷積)在安培架構 GPU 上運行得更快,但精度略有降低。https://www.tensorflow.org/api_docs/python/tf/config/experimental/enable_tensor_float_32_execution「三小時AI開發進階」公開課上線!本周四(12月17日)20:00,百度高級研發工程師可樂老師將在第一課《小目標檢測技術詳解》中介紹:技術講解:小目標檢測場景定義、難點分析與相應算法講解現場實戰:基於EasyDL完成物體檢測模型開發與部署掃碼進群聽課,還有機會贏取100元京東卡、《智能經濟》實體書、限量百度滑鼠墊多重好獎!

© THE END 

轉載請聯繫本公眾號獲得授權

投稿或尋求報導:content@jiqizhixin.com

相關焦點

  • TensorFlow 2.4 來了:上線對分布式訓練和混合精度的新功能支持
    近日,谷歌正式發布了 TensorFlow 2.4,帶來了多項新特性和功能改進。TensorFlow 2.4 的更新包括對於分布式訓練和混合精度的新功能支持,對 NumPy API 子集的試驗性支持以及一些用於監測性能瓶頸的新工具。
  • 步履不停:TensorFlow 2.4 新功能一覽!
    隨著對分布式訓練和混合精度提供更多支持,加入新的 Numpy 前端及用於監控和診斷性能瓶頸的工具,這個版本的亮點在於推出新功能,以及對性能和擴展方面的增強。在版本 2.4 中,實驗性引入了 tf.distribute 模塊的支持,可通過 ParameterServerStrategy 和自定義訓練循環對 Keras 模型進行異步訓練。
  • TensorFlow 2.0 分布式訓練
    tf.distribute.MirroredStrategy 是一種簡潔且高性能的,數據並行的同步式分布式策略,主要支持多個 GPU 在同一臺主機上訓練。以下代碼展示了使用 MirroredStrategy 策略,在 TensorFlow Datasets 中的部分圖像數據集上使用 Keras 訓練 MobileNetV2 的過程:import tensorflow as tfimport tensorflow_datasets as tfdsnum_epochs = 5batch_size_per_replica
  • TensorFlow為M1晶片提供7倍加速,還新增了GPU支持
    與此同時,蘋果也在GitHub上發布了名為「tensorflow_macos」的項目,包含forked版本的TensorFlow 2.4和新的ML Compute框架,其針對MacBook上的TensorFlow進行了優化。
  • 模型壓縮一半,精度幾乎無損,TensorFlow推出半精度浮點量化工具包,還有在線Demo
    有了它,就能在幾乎不損失模型精度的情況下,將模型壓縮至一半大小,還能改善CPU和硬體加速器延遲。這一套工具囊括混合量化,全整數量化和修剪。壓縮大小,不減精度雙精度是64位,單精度是32位,所謂的半精度浮點數就是使用2個字節(16位)來存儲。比起8位或16位整數,半精度浮點數具有動態範圍高的優點;而與單精度浮點數相比,它能節省一半的儲存空間和帶寬。
  • Object Detection API 現已支持 TensorFlow 2
    COCO 預訓練權重:可用於所有以基於對象的檢查點(TF2 代碼風格)形式提供的模型。訪問分布策略 (DistributionStrategies) 進行分布式訓練:以往,TF1 模型主要依靠異步訓練。而現在我們支持將同步訓練作為主要策略;我們的 TF2 模型可使用同步多 GPU 和 TPU 平臺進行訓練。與 Eager 模式兼容的小樣本訓練和推理的 Colab 演示。
  • 分布式TensorFlow入門教程
    深度學習在各個領域實現突破的一部分原因是我們使用了更多的數據(大數據)來訓練更複雜的模型(深度神經網絡),並且可以利用一些高性能並行計算設備如GPU和FPGA來加速模型訓練。作為使用人數最多的深度學習框架,TensorFlow從version 0.8開始支持模型的分布式訓練,現在的TensorFlow支持模型的多機多卡(GPUs和 CPUs)訓練。在這篇文章裡面,我將簡單介紹分布式TensorFlow的基礎知識,並通過實例來講解如何使用分布式TensorFlow來訓練模型。
  • Tensorflow Object Detection API 終於支持tensorflow1.x與tensorflow2.x了
    基於tensorflow框架構建的快速對象檢測模型構建、訓練、部署框架,是針對計算機視覺領域對象檢測任務的深度學習框架。之前tensorflow2.x一直不支持該框架,最近Tensorflow Object Detection API框架最近更新了,同時支持tensorflow1.x與tensorflow2.x。
  • 分布式訓練的方案和效率對比
    加快訓練速度的 trick 以及實現中需要注意的點。FP16 帶來的增益2019.11.6 注: tensorflow 2.0 已出,官方推薦使用 distributed strategy。但本文的實現在 tensorflow 1.X 版本仍然有效。另: pytorch 真香!
  • 基於tensorflow的深度學習MultiGPU訓練實戰
    下面主要基於tensorflow講一個數據並行化的實例。1、  單機多卡訓練:給個例子,比如一臺機器上裝有4個GPU卡,以cpu做為PS(master),主要保存一下參數和變量,進行梯度平均。其餘4個GPU訓練模型(worker),進行一些計算量比加大的操作。
  • TensorFlow 2.0 教程 01:基本圖形分類
    我們按照以下方式來實例化一個表示CIFAR-10數據集的tensorflow.data.Dataset對象:在訓練過程中,存儲在train_dataset中的實際上,Tensorflow 2已經使您可以很容易地將您的單GPU實現轉換成使用多個GPU運行。
  • 社區分享 | Spark 玩轉 TensorFlow 2.0
    本文來自社區投稿與徵集,作者梁雲,轉自:https://github.com/lyhue1991/eat_tensorflow2_in_30_days本篇文章介紹在 Spark 中調用訓練好的 TensorFlow 模型進行預測的方法。本文內容的學習需要一定的 Spark 和 Scala 基礎。
  • TensorFlow Serving入門
    、驗證和預測,但模型完善之後的生產上線流程,就變得五花八門了。服務框架基於TF Serving的持續集成框架還是挺簡明的,基本分三個步驟:模型訓練這是大家最熟悉的部分,主要包括數據的收集和清洗、模型的訓練、評測和優化;模型上線前一個步驟訓練好的模型在TF Server中上線;服務使用客戶端通過gRPC和RESTfull API兩種方式同
  • 資源 | TensorFlow分布式計算機制解讀:以數據並行為重
    在這個框架中,計算流程通過數據流程圖(data flow graph)設計,這為更改操作結構與安置提供了很大靈活性。TensorFlow 允許多個 worker 並行計算,這對必須通過處理的大量訓練數據訓練的神經網絡是有益的。此外,如果模型足夠大,這種並行化有時可能是必須的。在本文中,我們將探討 TensorFlow 的分布式計算機制。
  • 詳解Tensorflow模型量化(Quantization)原理及其實現方法
    五、tensorflow訓練後量化(Post-training quantization)介紹及其實現方法tensorflow訓練後量化是針對已訓練好的模型來說的,針對大部分我們已訓練未做任何處理的模型來說均可用此方法進行模型量化,而tensorflow提供了一整套完整的模型量化工具,如TensorFlow
  • TensorFlow 基礎學習 - 4
    import tensorflow as tfmodel = tf.keras.models.Sequential([        tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150,3)),
  • PyTorch 分布式訓練簡明教程
    然而,由於它使用一個進程來計算模型權重,然後在每個批處理期間將分發到每個GPU,因此通信很快成為一個瓶頸,GPU利用率通常很低。而且,nn.DataParallel要求所有的GPU都在同一個節點上(不支持分布式),而且不能使用Apex進行混合精度訓練。
  • PyTorch分布式訓練簡明教程
    然而,由於它使用一個進程來計算模型權重,然後在每個批處理期間將分發到每個GPU,因此通信很快成為一個瓶頸,GPU利用率通常很低。而且,nn.DataParallel要求所有的GPU都在同一個節點上(不支持分布式),而且不能使用Apex進行混合精度訓練。
  • 基於UAI-Train平臺的分布式訓練
    但訓練這些神經網絡模型需要大量浮點計算能力。雖然,近年來 GPU 硬體算力和訓練方法上均取得了重大進步,但在單一機器上,網絡訓練所需要的時間仍然長得不切實際,因此需要藉助分布式GPU環境來提升神經網絡訓練系統的浮點計算能力。TensorFlow 採用了數據流範式, 使用節點和邊的有向圖來表示計算。
  • TensorFlow 決策森林來啦!
    TF-DF 是用於訓練、解釋並服務於決策森林模型(包括隨機森林和梯度提升樹)的最先進算法集,可用於生產環境。得益於 TensorFlow 和 Keras 的靈活性和可組合性,您現在可以將這些模型用於分類、回歸和任務排序。 隨機森林是一種主流的決策森林模型。