?
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 將為模型構建開辟新的可能性。
作者:Martin Heller
譯者:王強
原文鏈接: https://www.infoworld.com/article/3405641/tensorflow-2-review-easier-end-to-end-machine-learning.html








