TFX 使用手冊

簡介

TFX 是奠基於 TensorFlow 的機器學習平台,具備 Google 的實際工作環境規模。這個平台提供了設定架構和共用程式庫,可用來整合定義、啟動及監控機器學習系統所需的通用元件。

安裝

Python PyPI

pip install tensorflow
pip install tfx

核心概念

TFX 管線

TFX 管線透過數個元件定義資料流程,目標是實作特定的機器學習工作,例如建構及部署特定資料的迴歸模型。管線元件是根據 TFX 程式庫建構而成。管線的結果會是 TFX 部署目標和/或推論要求的服務。

Artifact

在管線中,Artifact 是資料在元件之間傳遞的單位。一般而言,元件至少會有一個輸入 Artifact 和一個輸出 Artifact。所有 Artifact 都必須有相關聯的中繼資料,用於定義 Artifact 的類型屬性。Artifact 必須使用在機器學習中繼資料儲存區中註冊的 Artifact 類型設定強型類別。Artifact Artifact 類型的概念源自於機器學習中繼資料定義的資料模型,詳情請參閱這份文件。TFX 會定義並實作自己的 Artifact 類型本體,藉此實現更高階的功能。自 TFX 0.15 起,TFX 系統已定義並使用 11 種已知的 Artifact 類型

Artifact 類型擁有專屬名稱,以及其執行個體屬性的結構定義。TFX 會根據元件在管線中使用 Artifact 的方式來運用 Artifact 類型,但不一定會用於決定檔案系統上具體的 Artifact 內容。

舉例來說,「Example」這種 Artifact 類型可能代表以 tensorflow::Example 通訊協定緩衝區、CSV、JSON 或任何其他實體格式 TFRecord 所具體化的範例。儘管如此,Example 在管線中的使用方式完全相同:分析以產生統計資料、根據預期結構定義進行驗證、在訓練之前預先處理,以及提供給訓練程式以訓練模型等等。同樣地,「Model」這種 Artifact 類型可能代表以各種實體格式匯出的訓練模型物件,例如 TensorFlow SavedModel、ONNX、PMML 或 PKL (屬於 Python 中各種類型的模型物件) 等格式。系統一律會評估、分析和部署模型,以便在管線中提供。

注意:自 TFX 0.15 起,TFX 元件的實作會將「Examples」類型的 Artifact 假設為 tensorflow::Example 通訊協定緩衝區 (使用 gzip 壓縮的 TFRecord 格式)。同樣地,系統會將「Model」類型的 Artifact 假設為 TensorFlow SavedModel。TFX 的未來版本可能會擴充這些 Artifact 類型,以支援更多變化版本。

為區分這種相同 Artifact 類型可能出現的變化版本,機器學習中繼資料定義了一組 Artifact 屬性。舉例來說,「Examples」Artifact 的其中一種 Artifact 屬性可能是「格式」,值可能是 TFRecordJSONCSV 等等。「Examples」類型的 Artifact 一律可傳送給設計用來將 Examples 做為輸入 Artifact 的元件 (例如 Trainer)。然而,使用元件的實際實作可能會根據「格式」屬性的特定值來調整其行為,如果沒有用來處理特定 Examples 格式的實作,則會直接提出執行階段錯誤。

簡而言之,Artifact 類型定義了整個 TFX 管線系統中 Artifact 的本體;而 Artifact 屬性定義了 Artifact 類型特定的本體。管線系統的使用者可透過定義及填入新的自訂屬性,在本機環境中將這類本體擴充至自己的管線應用程式。使用者也可以導入新的 Artifact 類型,和/或修改預先定義的類型屬性,藉此擴充整個系統的本體。在此情況下,這類擴充會反饋至管線系統的主要存放區 (TTF 存放區)。

TFX 管線元件

TFX 管線是實作機器學習管線的一系列元件,專門用於可擴充的高效能機器學習工作,包括建立模型、進行訓練、提供推論,以及管理線上、原生行動裝置和 JavaScript 目標的部署。

TFX 管線通常包含下列元件:

  • ExampleGen 是擷取輸入資料集並視需要加以分割的管線的初始輸入元件。

  • StatisticsGen 可計算資料集的統計資料。

  • SchemaGen 可檢驗統計資料並建立資料結構定義。

  • ExampleValidator 可查看資料集內是否有異常狀況和遺漏的值。

  • Transform 可對資料集執行特徵工程。

  • Trainer 可訓練模型。

  • Evaluator 可針對訓練結果執行深入分析,並協助您驗證匯出的模型,確保這些模型達到要求,可推送至生產環境。

  • Pusher 可在提供的基礎架構上部署模型。

這些元件之間的資料流向如下圖所示:

元件流程

元件剖析

TFX 元件由三大部分組成:

  • 驅動程式
  • 執行程式
  • 發布程式

元件剖析

驅動程式和發布程式

驅動程式會透過查詢中繼資料儲存庫,將中繼資料提供給執行程式,而發布程式會接收執行程式的結果,並將結果儲存至中繼資料。開發人員通常不需要直接與驅動程式和發布程式互動,但驅動程式和發布程式記錄的訊息可能有助於偵測錯誤。請參閱疑難排解頁面。

執行程式

執行程式是元件執行處理作業的位置。開發人員可依據實作使用元件類型的類別需求,撰寫在執行程式中執行的程式碼。舉例來說,如果您是使用 Transform 元件,則需要開發 preprocessing_fn

TFX 程式庫

TFX 包含程式庫和管線元件。TFX 程式庫與管線元件之間的關係如下圖所示:

程式庫與元件

TFX 提供多個 Python 套件,這些套件是用來建立管線元件的程式庫。您將使用這些程式庫來建立管線元件,如此一來,便可將程式碼的重點放在管線的特點。

TFX 程式庫包含:

  • TensorFlow Data Validation (TFDV) 是用於分析及驗證機器學習資料的程式庫,其設計具備高擴充性,適合與 TensorFlow 和 TFX 搭配使用。TFDV 包含:

    • 可擴充的訓練和測試資料統計資料摘要計算功能。
    • 整合資料分布和統計資料的檢視器,以及資料集組合 (Facet) 的多面向比較。

    • 自動產生資料結構定義以描述對於資料的預期,例如所需值、範圍和詞彙等。

    • 可協助您檢查結構定義的結構定義檢視器。

    • 可識別異常情況的異常偵測功能,例如:識別遺漏特徵、超出範圍的值或錯誤特徵類型等等。

    • 異常狀況檢視器,讓您查看有異常狀況的特徵,並進一步瞭解以修正問題。

  • TensorFlow Transform (TFT) 是使用 TensorFlow 預先處理資料的程式庫。TensorFlow Transform 很適合用於需要完整傳送的資料,例如:

    • 依平均值和標準差將輸入值正規化。
    • 產生所有輸入值的詞彙,藉此將字串轉換為整數。
    • 根據觀測的資料分布將浮點數指派至特徵分塊,以將浮點數轉換為整數。
  • TensorFlow 是用於使用 TFX 訓練模型。TensorFlow 可擷取訓練資料和建模程式碼,並建立 SavedModel 結果。此外,TensorFlow 還整合了 TensorFlow Transform 為預先處理輸入資料所建立的特徵工程管線。

  • TensorFlow Model Analysis (TFMA) 是用來評估 TensorFlow 模型的程式庫,可搭配 TensorFlow 來建立 EvalSavedModel,做為分析的依據。使用者可透過這個程式庫,使用訓練程式中定義的相同指標,以分散的方式評估大量資料的模型。這些指標可根據不同的資料部分進行運算,並在 Jupyter 筆記本中以視覺化的方式呈現。

  • TensorFlow Metadata (TFMD) 提供中繼資料的標準表示法,在使用 TensorFlow 訓練機器學習模型時相當實用。中繼資料可由手動產生,也可以在輸入資料分析期間自動產生,並可用於資料驗證、探索和轉換。中繼資料序列化格式包括:

    • 說明表格資料的結構定義 (例如 tf.Examples)。
    • 這類資料集的統計資料摘要集合。
  • ML Metadata (MLMD) 程式庫是用於記錄和擷取有關機器學習開發人員和數據資料學家工作流程的中繼資料。多數中繼資料都使用 TFMD 表示法。MLMD 使用 SQL-LiteMySQL 以及其他類似的資料儲存庫來管理穩定性。

支援技術

必要

  • Apache Beam 是開放原始碼形式的整合式模型,用於定義批次和串流資料平行處理管線。TFX 使用 Apache Beam 來實作資料平行管線。然後,管線會由 Beam 支援的其中一個分散式處理後端執行,這些後端包括 Apache Flink、Apache Spark、Google Cloud Dataflow 等等。

選用

Apache Airflow 和 Kubeflow 等自動化調度管理工具可讓您更輕鬆地設定、操作、監控及維護機器學習管線。

  • Apache Airflow 是一個可透過程式輔助編寫、排程及監控工作流程的平台。TFX 使用 Airflow 將工作流程編寫為工作的有向非循環圖 (DAG),而 Airflow 排程器會執行工作站陣列的工作,並且遵循指定的相依性。多樣化的指令列公用程式可讓您輕鬆在 DAG 上執行複雜的程序。豐富的使用者介面方便您以視覺化的方式呈現在生產環境中執行的管線、監控進度,並視需要進行疑難排解。將工作流程定義為程式碼,即可更輕鬆地進行維護、建立版本、測試和協同合作。

  • Kubeflow 致力於簡化在 Kubernetes 中部署機器學習 (ML) 工作流程的作業,並提高其可攜性與可擴充性。Kubeflow 的目標並非重新建立其他服務,而是讓您能以輕鬆直接的方式,將業界最佳的機器學習開放原始碼系統部署至不同基礎架構。Kubeflow Pipelines 可讓您在 Kubeflow 上撰寫和執行可重現的工作流程,並整合實驗功能和筆記本式的體驗。Kubernetes 上的 Kubeflow Pipelines 服務包括託管中繼資料儲存庫、容器型自動化調度管理引擎、筆記本伺服器和使用者介面,可協助使用者大規模開發、執行及管理複雜的機器學習管線。Kubeflow Pipelines SDK 可讓您透過程式輔助的方式,來建立和共用管線的元件與組合。

可攜性和互通性

TFX 的設計可攜至多種環境和自動化調度管理架構,包括 Apache AirflowApache BeamKubeflow。此外,TFX 還能攜至不同的運算平台,包括內部部署平台和 Google Cloud Platform (GCP) 等雲端平台。特別的是,TFX 可與多個受管理的 GCP 服務互通,例如用於訓練和預測Cloud AI 平台,以及用於分散式資料處理的 Cloud Dataflow (適用於機器學習生命週期的其他多個層面)。

模型與 SavedModel 的比較

模型

模型是訓練程序的輸出內容,是在訓練過程中學習到的權重序列化記錄。這些權重之後可用於計算新輸入範例的預測結果。對於 TFX 和 TensorFlow 而言,「模型」是指包含到目前為止所學權重的查核點。

請注意,「模型」也可能是指 TensorFlow 運算圖形 (即 Python 檔案) 的定義,用於表示預測結果的運算方式。這兩種意思可能會根據情境交替使用。

SavedModel

  • SavedModel 的定義:TensorFlow 模型通用、適用於各語言、密封且可復原的序列化格式。
  • 重要性:可讓更高階的系統使用單一抽象層來產生、轉換及使用 TensorFlow 模型。

SavedModel 是我們推薦使用的序列化格式,適用於在生產環境中提供 TensorFlow 模型,或是為原生行動裝置或 JavaScript 應用程式匯出經過訓練的模型。舉例來說,如果您要將模型轉換為 REST 服務進行預測,可以將模型序列化為 SavedModel,並透過 Tensorflow Serving 來提供。詳情請參閱提供 TensorFlow 模型

結構定義

部分 TFX 元件會使用名為「結構定義」的輸入資料說明。結構定義是 schema.proto 的執行個體,屬於一種通訊協定緩衝區,通常稱為「protobuf」。結構定義可以指定特徵值的資料類型、是否要在所有範例中顯示特徵、允許的值範圍以及其他屬性。使用 TensorFlow Data Validation (TFDV) 的其中一項優點是,它會根據訓練資料推論出類型、類別和範圍,進而自動產生結構定義。

以下是結構定義 protobuf 的摘錄:

...
feature {
  name: "age"
  value_count {
    min: 1
    max: 1
  }
  type: FLOAT
  presence {
    min_fraction: 1
    min_count: 1
  }
}
feature {
  name: "capital-gain"
  value_count {
    min: 1
    max: 1
  }
  type: FLOAT
  presence {
    min_fraction: 1
    min_count: 1
  }
}
...

下列元件使用結構定義:

  • TensorFlow Data Validation
  • TensorFlow Transform

在一般 TFX 管線中,TensorFlow Data Validation 會產生結構定義,並提供其他元件使用。

使用 TFX 進行開發

TFX 是適用於機器學習專案所有階段的強大平台,協助您在本機上研究、實驗、開發並進行部署。為了避免程式碼重複,並排除發生訓練/應用偏差的可能,我們強烈建議您為模型訓練和訓練模型部署實作 TFX 管線,並透過運用 TensorFlow Transform 程式庫的 Transform 元件來進行訓練和推論。如此一來,您就能一致地使用相同的預先處理和分析程式碼,避免用於訓練的資料與在生產環境中提供給訓練模型的資料有差異,而且只需撰寫一次程式碼即可。

資料探索、視覺化和清除

資料探索、視覺化和清除

TFX 管線通常會以 ExampleGen 元件做為開頭,這個元件接受輸入資料,並將資料轉換為 tf.Examples 的格式。這項作業一般是在資料分割成訓練資料集和評估資料集後才進行,因此實際上會有兩個 ExampleGen 元件副本,分別用於訓練和評估。通常後面會接著 StatisticsGen 元件和 SchemaGen 元件,負責檢查您的資料並推論資料結構定義和統計資料。ExampleValidator 元件將會使用結構定義和統計資料,藉此查看資料中是否有異常情況、遺漏的值以及不正確的資料類型。所有上述元件都會運用 TensorFlow Data Validation 程式庫的功能。

TensorFlow Data Validation (TFDV) 是初始探索、視覺化及清除資料集的重要工具。TFDV 會檢驗您的資料並推論資料類型、類別和範圍,然後自動協助您識別異常狀況和遺漏的值。TFDV 也提供了視覺化工具,協助您檢查及瞭解資料集。管線建立完成後,您可以從 MLMD 讀取中繼資料,並在 Jupyter 筆記本中使用 TFDV 視覺化工具來分析資料。

在您完成初始模型訓練和部署作業之後,可以使用 TFDV 監控部署模型推論要求的新資料,並查看是否有異常狀況和/或偏移。這項功能特別適合用於隨著趨勢或季節而變化的時間序列資料,可協助您掌握資料問題,或是需要使用新資料重新訓練模型的時機。

資料視覺化

在您透過使用 TFDV 的管線區段 (一般是 StatisticsGen、SchemaGen 及 ExampleValidator) 完成第一次資料執行後,即可在 Jupyter 樣式筆記本中以視覺化的方式呈現結果。對於之後的執行作業,您可以一邊進行調整一邊對照結果,直到資料符合模型和應用程式的需求為止。

您必須先查詢 ML Metadata (MLMD),來找出這些元件的執行結果,然後使用 TFDV 中的視覺化支援 API 在筆記本中建立視覺化內容,其中包括 tfdv.load_statstats()tfdv.videoize_statstats()。透過這項視覺化呈現,您可以進一步瞭解資料集的特性,並視需要進行修改。

開發及訓練模型

特徵工程

一般 TFX 管線會包含 Transform 元件,這個元件會運用 TensorFlow Transform (TFT) 程式庫的功能執行特徵工程。Transform 元件會使用由 SchemaGene 元件建立的結構定義,並套用資料轉換來建立、組合及轉換將用於訓練模型的特徵。如果傳送至推論要求的資料可能一併顯示遺漏的值和轉換類型,那麼您就也必須在 Transform 元件中清除這些資料。在 TFX 中設計用於訓練的 TensorFlow 程式碼時,必須將某些重要因素納入考量

模型設計和訓練

Transform 元件會產生 SavedModel,在 Trainer 元件執行期間,匯入 TensorFlow 中並用於建模程式碼。這個 SavedModel 包含所有在 Transform 元件中建立的資料工程轉換,因此在訓練和推論期間都會使用完全一樣的程式碼執行相同的轉換。您可以使用建模程式碼 (包括 Transform 元件中的 SavedModel) 來使用訓練資料和評估資料,並訓練您的模型。

在建模程式碼的最後部分,您應該將模型儲存為 SavedModel 和 EvalSavedModel。您必須在 Trainer 元件中匯入並套用 TensorFlow Model Analysis (TFMA) 程式庫,才能將模型儲存為 EvalSavedModel。

import tensorflow_model_analysis as tfma
...

tfma.export.export_eval_savedmodel(
        estimator=estimator,
        export_dir_base=eval_model_dir,
        eval_input_receiver_fn=receiver_fn)

分析及瞭解模型成效

模型分析

在完成初始模型開發及訓練之後,分析及確實瞭解模型的效能非常重要。一般的 TFX 管線會包含 Evaluator 元件,這個元件運用 TensorFlow Model Analysis (TFMA) 程式庫的功能,藉由其電力工具集來協助這個階段的開發。Evaluator 元件會使用您先前匯出的 EvalSavedModel,並讓您指定在視覺化及分析模型效能時可使用的 SliceSpecs 清單。您可以透過每個 SliceSpec 來定義要檢驗的訓練資料部分,例如類別特徵的特定類別,或是數值特徵的特定範圍。

舉例來說,如果您想瞭解模型用於不同客層的成效 (例如依照年度消費、地理區域資料、年齡層或性別來區分的客層),這項做法就非常重要。這對於具有長尾的資料集而言尤其重要,因為主要群體的成效可能會掩蓋小型重要群體的極端成效。例如,您的模型可能在一般員工群體的成效還不錯,但完全不適用於高階主管,這對您而言可能是重要資訊。

模型分析與視覺化

在您透過訓練模型以及在訓練結果上執行 Evaluator 元件完成第一次的資料執行後 (該元件運用 TFMA),即可在 Jupyter 樣式筆記本中以視覺化的方式呈現結果。對於之後的執行作業,您可以一邊進行調整一邊對照結果,直到資料符合模型和應用程式的需求為止。

您必須先查詢 ML Metadata (MLMD),來找出這些元件的執行結果,然後使用 TFMA 中的視覺化支援 API 在筆記本中建立視覺化內容,其中包括 tfma.load_eval_results()tfma.view.render_slicing_metrics()。透過這項視覺化呈現,您可以進一步瞭解模型的特性,並視需要進行修改。

部署目標

當您完成模型開發,並訓練出令人滿意的結果後,便可將模型部署到一個以上的部署目標以接收推論要求。TFX 支援三種類型的部署目標。匯出為 SavedModel 的已訓練模型可部署至這其中任一個或所有的部署目標。

元件流程

推論:Tensorflow Serving

Tensorflow Serving (TFS) 是有彈性且高效能的機器學習模型提供系統,專為生產環境而設計。這個系統使用了 SavedModel,並且會接受透過 REST 或 gRPC 介面提出的推論要求。TFS 會在一個以上的網路伺服器上,以一組程序的形式執行,並使用其中一種進階架構來處理同步和分散式運算。請參閱 TFS 說明文件,進一步瞭解如何開發及部署 TFS 解決方案。

在一般管線中,Pusher 元件會使用已在 Trainer 元件中訓練過的 SavedModel,並將這些模組部署至您的 TFS 基礎架構,其中包括處理多個版本和模型更新。

原生行動應用程式和 IoT 應用程式的推論:TensorFlow Lite

TensorFlow Lite 這套工具專門用來協助開發人員在原生行動應用程式和 IoT 應用程式中,使用經過訓練的 TensorFlow 模型。這套工具使用了與 TensorFlow Serving 相同的 SavedModel,並套用量化和修剪等最佳化功能,來改善成品模型的大小和效能,以因應在行動裝置和 IoT 裝置上執行模型的挑戰。請參閱 TensorFlow Lite 說明文件,進一步瞭解如何使用 TensorFlow Lite。

使用 JavaScript 執行推論:TensorFlow JS

TensorFlow JS 是 JavaScript 程式庫,用於在瀏覽器和 Node.js 中訓練及部署機器學習模型。這個程式庫使用了與 TensorFlow Serving 和 TensorFlow Lite 相同的 SavedModel,並且將這些模組轉換成 TensorFlow.js 網頁格式。請參閱 TensorFlow JS 說明文件,進一步瞭解如何使用 TensorFlow JS。

使用 Airflow 建立 TFX 管線

詳情請參閱 Airflow 工作坊

使用 Kubeflow 建立 TFX 管線

設定

Kubeflow 需要 Kubernetes 叢集才能大規模執行管線。請參閱 Kubeflow 部署指南,進一步瞭解部署 Kubeflow 叢集的選項。

設定並執行 TFX 管線

請按照 Cloud AI 平台管線上的 TFX 教學課程的說明,在 Kubeflow 上執行 TFX 管線範例。TFX 元件已容器化以組成 Kubeflow 管線。範例中展現了如何設定管線,以讀取大型公開資料集,並在雲端執行大規模的訓練和資料處理步驟。

管線動作的指令列介面

TFX 提供統一的 CLI,可協助您執行各種管線動作,例如在 Apache Airflow、Apache Beam 和 Kubeflow 等多個自動化調度管理工具上建立、更新、執行、列出和刪除管線。詳情請參閱這些指示