iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 6
2
AI & Data

深度學習裡的冰與火之歌 : Tensorflow vs PyTorch系列 第 6

Day 6 Tensorflow 2.0

Tensorflow 2.0 在今年一月在官方部落格上公告了 2.0 的版本。在官方 "What’s coming in TensorFlow 2.0" 的文章上,可以看到將會把重點放在:

  1. 更容易使用的 High-level API (主要包括 keras 和 eager mode)供使用者作模型建置。(Easy model building with Keras and eager execution.)
  2. 更強健和更容易達到跨平台的模型配置(Robust model deployment in production on any platform)
  3. 能夠使用 High-level API 的情況下建置複雜雜模型並保持效能 (Powerful experimentation for research)
  4. 簡單化 API 並移除已不再使用的 API,以降低重複程度(Simplifying the API by cleaning up deprecated APIs and reducing duplication)

下方則是由 Tensorflow 2.0 官方提供的架構圖。

是誰?是誰不見了!

再會了 tf.Session,讓我們歡迎 tf.function

在過去,Tensorflow 將計算圖建置和 runtime 餵送資料的過程分開來,而這樣的設計便是使用 tf.Session 來處理所有資料的流向。然而,在 2.0 為了能更簡化使用者介面,就是讓 tf.Session 有如使用 python 一般直覺,那就是以 tf.function 取代。

我們在 Jax 的文章中有一小段原始碼例子,解說如何使用 Jax 的 grad 函式。藉著餵入一個 python function 後,Jax 的 grad 函式會輸出另一個 python function 可以計算輸出梯度計算的結果。

我們可以把使用者輸入的 python function 當作是一個計算子圖,透過直接呼叫 tf.function 或用 decorator 的方式包覆在目標 python function ,而動態建立一個 tf.Grpah 物件,除了可供反向傳播時使用,亦可以透過編譯並最佳化計算過程。

另外關於誰在 Tensorflow 2.0 中被移除,最明顯的應該是 tf.contrib 被移除了,而且發生在 1.4,你已經無法使用任何在 contrib module 底下的 code 了。作為一個開源的深度學習框架,tf.contrib module 一項是社群貢獻 Tensorflow 的結晶,依靠社群的貢獻,有許多實驗性的良好設計,最後都被收入在 Tensorflow 的官方函式庫中。Tensorflow 在這個 RFC 中提到,因為 contrib 模組愈變愈加龐大,造成維持不易,最終決定將到 tensorflow addon

以下是從官方取得的原始碼做解說,現在少了 tf.Session 後,我們可以這麼做

# TensorFlow 1.X
outputs = session.run(f(placeholder), feed_dict={placeholder: input})
# TensorFlow 2.0
outputs = f(input)

其他官方提到還有哪些地方被移除,包括了:

  1. 移除 queue runners 以鼓勵使用 tf.data.
  2. 移除 graph collections.

是誰?是誰改變了!

為了達成官方所說的一個「更簡單,且更強大」的 High-level API,Tensorflow 2.0 在 keras 和 eager execution 提出了多項修改。首先,一個為了能達成一個更簡單的 High-level API ---

keras 仍會維持為 Tensorflow 最喜愛的官方 high-level API,而其本身已經擁有許多良好的 features 可供研究者使用,包括了 SequentialFunctional 兩種 API。

為了能讓 keras 和 tensorflow 能夠更無縫地結合,tensorflow 做了以下修改:

關於 eager execution

eager mode 內,仍可以使用 tf.GradientTapetf.custom_gradient 兩個函式可以給予使用者較大的自由度去客制化梯度的計算。

另外一個大改變則是 tf.Variable 的狀態管理。在過去 1.x 的時代,tf.Variable 的狀態是由 tf.Graph 的 graph collection 來管理,而其生命週期則由 tf.Session管理。如今,在 2.0 graph collection 被移除掉後,tf.Variable 會被當成一般 Python 物件處理。

關於 tf.data

tf.data 是專注於巨量資料的 API,為了能夠用在 tf.keras 建置的模型內, Tensorflow 2.0 允許透過tf.keras.Sequentialtf.keras.Functional 類別實體在呼叫 fit 方法進行訓練,以及 evaluatepredict 時使用 tf.Data.Dataset 實例。

關於在 Tensorflow 的框架中使用 keras,仍要注意盡量使用 tf.keras 版本,而非 stand alone keras。這樣可以保證 tensorflow 支援的 keras 版本符合,且在輸出模型時,會保證預設為tensorflow 的 checkpoint 格式,而非 keras 預設所用的 HDF5。

讓我們正式歡迎 Tensorflow 2.0

關於如何使用 Tensorflow 2.0,官方部落格提供了以下的建議 workflow:

  1. 使用 tf.data 來進行資料的餵送,以及使用 tf.feature_column來做手動的簡易 feature engineering,包括了 encoding categorical data,和產生兩特徵關聯(feature cross)。tf.data可以接受 numpy 或是稍後從硬碟讀入。
  2. 使用 tf.kerastf.EstimatorAPI 來實驗模型。tf.Estimator 有許多 pre-made Estimator,包括了 boosted tree 等。若想要用已經訓練好的模型,還可以使用 TensorFlow Hub。
  3. eager mode 除錯和執行實驗性模型。如前所述,新的 eager mode 可以和 tf.Funciton 物件一並服用,tf.Funciton會將你的函式轉為計算圖,並可以透過編譯成為可以在不同裝置執行,宛如 1.x 的計算圖,享有高計算能力,更容易 export 以及 deployment。
  4. 使用 Distribution Strategy API 作異質高速計算系統中配置。異質高速計算系統包括了 CPU, GPU 和 TPU。同時也支援配置到任何 hosting cluster 的 cloud service,包括了配置到 Kubernetes clusters 上
  5. Export 到新的 SavedModel 標準。在 2.0 Tensorflow 定義了新的 Checkpoint 檔案格式,使在不同的 API 之前可以輕鬆完成讀寫。

結論

面對既有以 Tensorflow 1.x 的模型所寫成的,無論已經是 production code 或是模型建置的 research code,Tensorflow 提供自動轉換 script,(希望)能提供無痛轉換。明天,我們將要來 walk through 這個 migration process。以及,如果踢到自動轉換的鐵板,仍然可以使用 tensorflow.compat.v1保持原來的函示。

Reference:

[1]What’s coming in TensorFlow 2.0
[2]Effective Tensorflow 2.0


上一篇
Day 5 Jax 來拯救:numpy-based 的動態計算圖
下一篇
Day 7 邁向 Tensorflow 2.0 之路
系列文
深度學習裡的冰與火之歌 : Tensorflow vs PyTorch31

尚未有邦友留言

立即登入留言