Tensorflow 2.0到底好在哪裏?

TensorFlow現在已經不僅是一個單純的工具包了,而是發展成爲了一個平臺,在易用性、分佈式訓練和部署等方面都取得了長足的進步。

如今已經沒有人質疑機器學習和深度學習的重要性了。數十年來這一行業讓人們見識過無數承諾、騙局和失望,時至今日兩大技術終於帶來了衆多實際應用。機器學習或深度學習應用離充分完善還有很長的路要走,但現有的成果已經非常喜人了。

在所有優秀的機器學習和深度學習框架中,TensorFlow是最成熟的,在研究論文中被引用最多(就算排除谷歌員工的引用也是如此),也有着最出色的生產實踐案例。它可能不是最容易學習的框架,但比起它2016年剛發佈時的情況,現在的TensorFlow對新人要友好得多。TensorFlow還是許多谷歌服務的基礎。

TensorFlow 2.0網站將該項目描述爲“端到端開源機器學習平臺”。實際上TensorFlow已進化成爲一個更全面的“工具、庫和社區資源生態系統”,可幫助研究人員構建和部署人工智能助力的應用。

TensorFlow 2.0有四大組成部分:

  • TensorFlow核心,一個用於開發和訓練機器學習模型的開源庫;

  • TensorFlow.js,一個用於在瀏覽器和Node.js上訓練和部署模型的JavaScript庫;

  • TensorFlow Lite,一個輕量級庫,用於在移動和嵌入式設備上部署模型;

  • TensorFlow Extended,一個在大型生產環境中準備數據、訓練、驗證和部署模型的平臺。

TensorFlow 2.0生態系統包括對Python、JavaScript和Swift的支持,以及對雲、瀏覽器和邊緣設備的部署支持。TensorBoard(可視化)和TensorFlow Hub(模型庫)都是很有用的工具。TensorFlow Extended(TFX)則支持端到端生產流水線。

在以前的文章中,我曾評測過TensorFlow r0.10(2016)(https://www.infoworld.com/article/3127397/review-tensorflow-shines-a-light-on-deep-learning.html)和TensorFlow 1.5(2018)(https://www.infoworld.com/article/3250165/tensorflow-review-the-best-deep-learning-library-gets-better.html)。

這些年來,TensorFlow逐漸發展爲基於數據流圖的機器學習和神經網絡庫,擁有較高的學習曲線和一個底層API。對普通人來說TensorFlow 2.0已經不再那麼難學了,2.0版本還擁有一個高級Keras API,支持在JavaScript中運行、在移動和嵌入式設備上部署以及在大型生產環境中運行。

TensorFlow的競爭對手包括Keras(可能使用除TensorFlow之外的其他後端)(https://www.infoworld.com/article/3305058/review-keras-sails-through-deep-learning.html)、MXNet(https://www.infoworld.com/article/3318557/review-mxnet-deep-learning-shines-with-gluon.html)(與Gluon,https://www.infoworld.com/article/3318557/review-mxnet-deep-learning-shines-with-gluon.html)、PyTorch(https://www.infoworld.com/article/3289633/pytorch-review-a-deep-learning-framework-built-for-speed.html)、Scikit-learn(https://www.infoworld.com/article/3158509/review-scikit-learn-shines-for-simpler-machine-learning.html)和Spark MLlib(https://www.infoworld.com/article/3141605/review-spark-lights-up-machine-learning.html)。最後兩個主要是機器學習框架,缺乏深度學習的相關設施。

你可以同時使用多種方案。在單條流水線中同時使用多個框架是非常合理的,例如使用Scikit-learn準備數據並使用TensorFlow訓練模型。

TensorFlow核心

TensorFlow 2.0的設計重點就是簡潔易用,它的新特性包括Eager Execution、直觀的高級API以及在任何平臺上靈活構建模型等更新。前兩個特性值得深入研究。

Eager Execution

Eager Execution意味着TensorFlow代碼被定義後會立即運行,而不是先將節點和邊緣添加一個圖上,稍後再在一個會話中運行——後者是TensorFlow原來使用的模式。例如,TensorFlow r0.10早期版本的“Hello,World!”腳本如下所示:

$ python
...
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>> exit()

注意這裏使用的tf.Session()和sess.run()。在TensorFlow 2.0中,Eager Execution模式是默認的,如下例所示。

TensorFlow 2.0中的Eager Execution示意。這個筆記本可以在谷歌Colab中運行,或者在安裝好預設的Jupyter筆記本中也能運行。

tf.keras

前面的兩個示例都使用了底層TensorFlow API。“活用TensorFlow 2.0指南”(https://www.tensorflow.org/beta/guide/effective_tf2)則使用了高級別的tf.kerasAPI取代了舊的底層API;這將大大減少你需要編寫的代碼量。你只需要每層寫一行代碼就能構建Keras神經網絡,如果能善用循環結構的話需要的代碼就更少了。下面的示例演示了Keras數據集和順序模型API,它們運行在谷歌Colab中;谷歌Colab用來運行TensorFlow樣本和實驗很方便(還是免費的)。請注意,Colab除了CPU外還提供了GPU和TPU實例。

上圖是一個TensorFlow筆記本,用於訓練基本的深度神經網絡對MNIST手寫數字圖像進行分類。這是在谷歌Colab上運行的TensorFlow示例筆記本。注意這裏使用了tf.keras.datasets來提供MNIST圖像。

過渡到TensorFlow 2.0

在撰寫本文時,從TensorFlow 1.14到TensorFlow 2.0的過渡(https://github.com/orgs/tensorflow/projects/4)還在進行中,如下面的截圖所示。目前有兩個待辦事項、23個正在進行的任務以及34個已完成的任務。正在進行的任務中既有完全沒有進展的(可能是因爲當事人退出),也有幾乎完成的(代碼已進入存儲庫主分支,但尚未經過審查和部署)。

從TensorFlow 1.14到TensorFlow 2.0的過渡狀態可通過以下網址跟蹤:https://github.com/orgs/tensorflow/project/4。此截圖生成於6月21日,但請注意該頁面自4月17日以來都未更新。

將模型升級到TensorFlow 2.0

就像很多開源項目的大版本更新一樣,TensorFlow 2.0對API引入了許多重大更改,需要你隨之升級你的代碼(https://www.tensorflow.org/beta/guide/migration_guide)。所幸我們有一個隨TensorFlow 2.0自動安裝的Python代碼升級腳本(https://www.tensorflow.org/beta/guide/upgrade),還有一個給無法升級的API符號用的兼容模塊(compat.v1),只需使用字符串替換即可。運行升級腳本後,你的程序可能會在TensorFlow 2.0上運行,但是會引用tf.compat.v1命名空間,你得在有空的時候處理一下以保持代碼清潔。此外,你可以將GitHub repos上的Jupyter筆記本升級到TensorFlow 2.0(http://tf2up.ml/)。

使用tf.function

Eager Execution模式的缺點是可能會損失一些編譯和執行流程圖的性能。有一種方法可以在不完全關閉Eager Execution模式的情況下恢復性能,它就是tf.function。

基本上,當你使用@tf.function註釋一個函數時後者將被編譯成一個圖,它和它調用的任何函數就(可能)更快地執行、支持在GPU或TPU上運行,還支持導出到SavedModel。tf.function的一項便利的新功能是AutoGraph(https://www.tensorflow.org/beta/guide/autograph),它自動將Python控制流語句編譯爲TensorFlow控制操作。

分佈式訓練

以前我研究TensorFlow時有兩種方法可以運行分佈式訓練:使用異步參數服務器,或使用第三方的Horovod項目——該項目是同步的並使用all-reduce算法。現在新版有五種原生的TensorFlow分佈式策略(https://www.tensorflow.org/beta/guide/distribute_strategy),以及一個用於選擇所需策略的API,tf.distribute.Strategy;它允許你跨多個GPU、多臺計算機或多個TPU分發訓練。此API還可用於在不同平臺上分發評估和預測。

TensorFlow現在支持五種原生分佈式策略,TensorFlow 2.0 beta還對三種訓練API提供不同級別的支持。

TensorFlow.js

TensorFlow.js(https://www.tensorflow.org/js)是一個用於在JavaScript中開發和訓練機器學習模型並在瀏覽器或Node.js中部署它們的庫。還有一個基於TensorFlow.js的高級庫ml5.js(https://ml5js.org/),使用戶無需直接面對複雜的張量和優化器。

TensorFlow.js運行在瀏覽器中(https://www.tensorflow.org/js/guide/platform_environment),支持移動設備和桌面設備。如果你的瀏覽器支持WebGL着色器API,TensorFlow.js就可以使用它們並利用GPU計算能力,帶來相比CPU後端多達100倍的加速效果。在配備GPU的計算機上,TensorFlow.js演示(https://www.tensorflow.org/js/demos/)在瀏覽器中運行得非常快。

在Node.js上,TensorFlow.js可以使用已安裝的TensorFlow版本作爲後端,或者運行基本的CPU後端。CPU後端是純JavaScript的,並行優化不夠充分。

你可以在瀏覽器上運行官方TensorFlow.js模型(https://www.tensorflow.org/js/models/)、轉換Python模型(https://www.tensorflow.org/js/tutorials#convert_pretained_models_to_tensorflowjs)、使用遷移學習來用你自己的數據自定義模型(https://www.tensorflow.org/js/tutorials/transfer/what_is_transfer_learning),以及直接在JavaScript中構建和訓練模型(https://www.tensorflow.org/js/tutorials)。

TensorFlow Lite

TensorFlow Lite(https://www.tensorflow.org/lite/)是一個用於設備上推斷的開源深度學習框架。它目前爲iOS、ARM64和樹莓派構建了模型。

TensorFlow Lite的兩大組件分別是解釋器和轉換器。解釋器用來在許多不同的硬件類型上運行特別針對優化的模型。轉換器則將TensorFlow模型轉換爲高效形式供解釋器使用,並可引入優化以改善程序體積和性能。預先訓練的模型有圖像分類、對象檢測、智能回覆、姿勢估計和語義分割等類型。還有用於手勢識別、圖像分類、對象檢測和語音識別的示例應用。

TensorFlow Extended

TensorFlow Extended(TFX)(https://www.tensorflow.org/tfx/)是用於部署機器學習生產流水線的端到端平臺。你訓練好一個模型就要考慮使用TFX了。其流水線包括數據驗證(https://www.tensorflow.org/tfx/guide/tfdv)、功能設計(https://www.tensorflow.org/tfx/transform/get_started)、建模(https://www.tensorflow.org/tfx/guide/train)、模型評估(https://www.tensorflow.org/tfx/model_analysis/get_started)、服務推斷(https://www.tensorflow.org/tfx/guide/serving)以及在線平臺、移動原生平臺和JavaScript平臺的部署管理。下圖顯示了TFX流水線的組件是如何組合在一起的。

TensorFlow Extended示意圖。

Swift for TensorFlow

Swift for TensorFlow(https://www.tensorflow.org/swift)是一個用於深度學習和可微分編程的下一代(並且仍不穩定)平臺。它有一個用於訓練的高級API,看起來很像Python TensorFlow,但它也支持使用@differentiable屬性自動微分構建到Swift編譯器的一個fork中。Swift for TensorFlow可以導入和調用Python代碼,使開發者更容易從Python TensorFlow過渡過來。

TensorFlow工具

目前有七種工具支持TensorFlow(https://www.tensorflow.org/resources/tools)。它們分別是TensorBoard,TensorFlow圖的一組可視化工具;TensorFlow Playground,一個可調節的在線神經網絡;CoLab,又名Colaboratory,一個免費的在線Jupyter筆記本環境;What-If工具,可用於探索和調試TensorBoard、CoLab或Jupyter筆記本中的模型;ML Perf,流行的機器學習基準測試套件;XLA(加速線性代數),一種用於線性代數的特定領域編譯器,可優化TensorFlow計算;和TFRC(TensorFlow研究雲),一個由1000多個雲TPU組成的集羣,研究人員可以申請免費使用。

總的來說,TensorFlow 2.0測試版已經在很多方面取得了很大進展。在tf.keras API和Eager Execution模式的幫助下,新版核心框架更易於學習、使用和調試。你可以有選擇地將要編譯的函數標記爲圖形。有五種方法可以進行分佈式訓練和推斷。

新版有一套完整的組件,也就是TFX,用於構建從數據驗證到推斷模型管理的全套機器學習流水線。你可以在瀏覽器或Node.js上運行TensorFlow.js,還可以在移動設備和嵌入式設備上運行TensorFlow Lite。最後,Swift for TensorFlow將爲模型構建開闢新的可能性。

原文鏈接https://www.infoworld.com/article/3405641/tensorflow-2-review-easier-end-to-end-machine-learning.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章