乾貨丨 在 Kubernetes 上擴展 TensorFlow 模型

2021-02-18 AI數據派


本文介紹了Kubernetes 和 Kubeflow 如何能夠滿足 TensorFlow 的機器學習模型的這些擴展性需求。通過實際的例子介紹如何在 Kubernetes 上使用 Kubeflow 擴展機器學習模型。

由於人工智慧 / 機器學習日益集成到應用和業務流程中,因此生產級機器學習模型需要更多可擴展的基礎設施和計算能力,以用於訓練和部署。現代機器學習算法在大量數據上進行訓練,並且需要數十億次迭代才能使成本函數最小化。這類模型的垂直擴展會遇到作業系統級別的瓶頸,包括可提供的 CPU、GPU 和存儲的數量,而且對於這種類型的模型,已經證明效率並不高。更為高效的並行處理算法,例如異步訓練和 allreduce 式訓練,需要一個分布式集群系統,由不同的 worker (工作器)以協調的方式同時學習。可擴展性對於在生產環境中服務深度學習模型也非常重要。將單個 API 請求處理到模型預測端點可能會觸發複雜的處理邏輯,這將花費大量時間。由於更多用戶訪問模型的端點,為了有效地處理客戶端請求,需要更多服務實例。在機器學習模型中,以分布式、可擴展的方式提供服務的能力成為保證其應用有效性的關鍵。要解決分布式雲環境中的這些擴展性問題非常困難。在確保容錯、高可用性和應用健康的同時, MLOps 工程師要配置多個節點和推理服務之間的交互。本文將討論 Kubernetes 和 Kubeflow 如何能夠滿足 TensorFlow 的機器學習模型的這些擴展性需求。通過實際的例子介紹如何在 Kubernetes 上使用 Kubeflow 擴展機器學習模型。首先,我將討論如何使用 TensorFlow  training jobs(TensorFlow 訓練作業,TFJobs)抽象,通過 Kubeflow 在 Kubernetes 上協調 TensorFlow 模型的分布式訓練。然後,我將介紹如何實現同步和異步分布式訓練的 TensorFlow 分發策略。最後,我將討論用於擴展在 Kubernetes 中服務的 TensorFlow 模型的各種選項,包括 KFServing、Seldon Core 和 BentoML。在本文的最後,你將更好地理解基本的 Kubernetes 和 Kubeflow 抽象,並了解 TensorFlow 模型的可擴展工具,用於訓練和生產級服務。用 Kubernetes 和 Kubeflow 擴展 TensorFlow 模型Kubeflow是一個 Kubernetes 的機器學習框架,最初由谷歌開發。它建立在 Kubernetes 資源和編排服務之上,實現複雜的自動化機器學習管道,用於訓練和服務機器學習模型。可以結合使用 Kubernetes 和 Kubeflow 來有效地擴展 TensorFlow 模型。為使 TensorFlow 模型具有可擴展性,主要的資源和特性如下:使用 kubectl手動擴展 Kubernetes 部署和 StatefulSets。使用Pod 水平自動伸縮(Horizontal Pod Autoscaler)進行自動擴展,它基於一組計算指標(CPU、GPU、內存)或用戶定義的指標(如每秒請求)。通過 TFJob 和 MPI Operator 對 TensorFlow 模型進行分布式訓練。使用 KFServing、Seldon Core 和 BentoML 擴展已部署的 TensorFlow 模型。接下來,我將提供一些例子,說明如何使用這些解決方案中的一些,有效地在 Kubernetes 上擴展 TensorFlow 模型。使用 TFJob 進行可擴展的 TensorFlow 訓練TFJob 可以在 Kubernetes 中擴展,方法是使用TensorFlow 分發策略實現分布式訓練。在機器學習中有兩種常用的分布式策略:同步和異步。在同步訓練中,worker 對特定批次的訓練數據進行並行訓練。每個 worker 都會進行自己的前向傳播步驟,並對迭代的整體結果進行匯總。相比之下,在異步訓練中,worker 對相同的數據進行並行學習。在這種方法中,有一個稱為Parameter Server(參數伺服器)的中央實體,它負責聚合和計算梯度,並將更新的參數傳遞給每個 worker。在分布式集群中實現這樣的策略並非易事。特別是,worker 應該能夠在不同節點之間進行數據和權重的溝通,並有效協調它們的學習,同時避免錯誤。TensorFlow 在tf.distribut.Strategy模塊中實現了各種分布式訓練策略,以節省開發人員的時間。有了這個模塊,機器學習開發人員只要對他們的代碼做最少的修改,就可以在多個節點和 GPU 之間分發訓練。這個模塊實現了幾種同步策略,包括 MirroredStrategy、TPUStrategy 和 MultiworkerMirroredStrategy。它還實現了一個異步的 ParameterServerStrategy。你可以在這篇文章《使用 TensorFlow 進行分布式訓練》(Distributed training with TensorFlow**)中閱讀更多關於可用的 TensorFlow 分布策略以及如何在你的 TensorFlow 代碼中實現這些策略。Kubeflow 隨附了TF Operator和一個自定義的TFJob資源,可以輕鬆創建上面提到的 TensorFlow 分布式策略。TFJob 可以識別容器化的 TensorFlow 代碼中定義的分布式策略,並可以使用一組內置組件和控制邏輯對其進行管理。使得在 Kubeflow 中實現 TensorFlow 的分布式訓練成為可能的組件包括:Parameter Server:協調異步分布式訓練和計算梯度。上述組件可以在 TFJob 中配置,TFJob 是一個用於 TensorFlow 訓練的 Kubeflow CRD。這裡是一個分布式訓練作業的基本例子,它依賴於兩個 worker,在沒有 Chief 和 Parameter Server 的情況下進行訓練。這種方法適用於實現 TensorFlow 同步訓練策略,如 MirroredStrategy。你看,除了標準的 Kubernetes 資源和服務(例如卷、容器、重啟策略)之外,規範還包括一個 tfReplicaSpecs,其中你定義了一個 worker。在容器化的 TensorFlow 代碼中,將 worker 副本計數設置為 2,並定義相關的分發策略,就足以實現 Kubeflow 的同步策略。初始化 TFJob 後,將會在每個 worker 節點上創建一個新的 TF_CONFIG 環境變量。其中包含了關於訓練批次、當前訓練迭代以及 TFJob 用於執行分布式訓練的其他參數的信息。通過與各種 Kubernetes 控制器、 API 進行交互,Tf-operator 協調訓練過程,並維護在清單中定義的預期狀態。另外,通過 tf-operator,異步訓練模式可以使用 ParameterServerStrategy。在這裡(以及下面),你將看到一個由 tf-operator 管理的異步策略的分布式訓練作業的例子。TFJob 並不是用 Kubeflow 實現 TensorFlow 模型分布式訓練的唯一方法。MPI Operator提供了另一種解決方案。在後臺,MPI Operator 使用消息傳遞接口(Message Passing Interface,MPI),它可以在異構網絡環境中,在 worker 之間通過不同的通信層進行跨節點通信。在 Kubernetes 中, MPI Operator 可用於實現 Allreduce 式的 TensorFlow 模型同步訓練。TensorFlow 模型在 Kubernetes 上的可擴展服務


由於處理客戶端對推理服務的請求是一項非常耗時耗力的任務,因此可擴展服務對於機器學習工作負載的生產部署至關重要。在這種情況下,部署的模型應該能夠擴展到多個副本,並為多個並發的請求提供服務。


Kubeflow 支持 TensorFlow 模型的幾種服務選項。這裡要注意以下幾點:


TFServing 是 TFX Serving 模塊的 Kubeflow 實現。通過 TFServing,你可以創建機器學習模型 REST API,並提供許多有用的功能,包括服務交付、自動生命周期管理、流量分割和版本管理。然而,這個選項並沒有提供自動擴展功能。

Seldon Core 是一款第三方工具,可用於 Kubeflow 抽象和資源。它支持多種機器學習框架,包括 TensorFlow,並允許將訓練好的 TensorFlow 模型轉換為 REST/gRPC 微服務,運行在 Kubernetes 中。Seldon Core 默認支持模型自動擴展。

BentoML 是 Kubeflow 使用的另一個第三方工具,它提供高級的模型服務功能,包括自動擴展,以及支持微批處理的高性能 API 模型伺服器。


在下一節中,我將展示如何使用 KFServing 對訓練好的 TensorFlow 模型進行自動擴展,KFServing 是默認的 Kubeflow 安裝中的一個模塊。


用 KFServing 自動擴展 TensorFlow 模型


KFServing 是一種無伺服器平臺,它可以輕鬆地將訓練好的 TensorFlow 模型轉換為從 Kubernetes 集群外部訪問的推理服務。通過 Istio, KFServing 可以實現網絡和入口、健康檢查、金絲雀發布(canary rollouts)、時間點快照、流量路由以及針對你部署的 TensorFlow 模型靈活地配置伺服器。


同時,KFServing 還支持開箱即用的訓練 TensorFlow 模型的自動擴展。在底層,KFServing 依賴於 Knative Serving 的自動擴展能力。Knative 提供了兩個自動擴展的實現。一種是基於 Knative Pod Autoscaler(KPA)工具,另一種個是基於 Kubernetes Horizontal Pod Autoscaler(HPA)。


通過 KFServing 部署 InferenceService 時,KPA 將默認啟用。它支持擴展到零的功能,即在沒有流量時,可將服務的模型擴展到剩餘副本數量為零。KPA 的主要限制在於它不支持基於 CPU 的自動擴展。


若集群中沒有 GPU,則可以使用 HPA autoscaler,它支持基於 CPU 的自動擴展。然而,它不屬於 KFServing 安裝,應該在 KFServing 安裝完成後啟用。


如前所述,KFServing 在預設情況下使用 KPA,因此你的 InferenceService 在部署後立即獲得自動擴展。使用 InferenceService 清單可以自定義 KPA 行為。



默認情況下,KPA 基於每個 pod 的平均傳入請求數對模型進行擴展。KFServing 將默認的並發的目標數量設置為 1,這意味著如果服務收到三個請求,KPA 將把它擴展到三個 pod 副本。你可以通過更改 autoscaling.knative.dev/target 注釋來定製這個行為,就像上面的例子一樣,你把它設置為 10。一旦啟用此設置,只有當並發的請求數增加到 10 時,KPA 才會增加副本數。


通過 KFServing,你可以配置其他自動擴展目標。舉例來說,你可以使用 requests-per-second-target-default 註解來擴展基於每秒平均請求量(Request per second,RPS)的模型。


總結


正如我在本文中所展示的那樣,Kubeflow 為擴展 TensorFlow 模型訓練和 Kubernetes 的服務提供了許多有用的工具。你可以使用 Kubeflow 來實現 TensorFlow 分布策略的同步和異步訓練。


為了在 Kubernetes 集群中高效地執行分布式訓練,Tf-operator 可以輕鬆定義你所需要的各種組件。另外,Kubeflow 還支持 MPI Operator,這是一個絕佳解決方案,可以使用 MPI 來實現 Allreduce 式的多節點訓練。


在擴展訓練好的 TensorFlow 模型時,Kubeflow 也有很好的功能集。諸如 KFServing 這樣的工具可以讓你根據需要定製擴展邏輯,包括 RPS 和請求並行目標。


你也可以使用 Kubernetes-native 工具,比如 HPA,根據用戶定義的指標對模型進行擴展。你可以研究一下其他很棒的服務工具,比如 Seldon Core 和 BentoML。它們都支持自動擴展,並為自動化服務模型版本、金絲雀發布、更新和生命周期管理提供了許多有用的功能。

相關焦點

  • 擴展之Tensorflow2.0 | 19 TF2模型的存儲與載入
    擴展之Tensorflow2.0 | 18 TF2構建自定義模型擴展之Tensorflow2.0
  • tensorflow機器學習模型的跨平臺上線
    ,這個方法當然也適用於tensorflow生成的模型,但是由於tensorflow模型往往較大,使用無法優化的PMML文件大多數時候很笨拙,因此本文我們專門討論下tensorflow機器學習模型的跨平臺上線的方法。
  • TensorFlow圖像分類教程
    (本文使用預先標記好的數據以提高效率)訓練:將標記好的數據(圖像)提供給模型。有一個工具將隨機抓取一批圖像,使用模型猜測每種花的類型,測試猜測的準確性,重複執行,直到使用了大部分訓練數據為止。最後一批未被使用的圖像用於計算該訓練模型的準確性。分類:在新的圖像上使用模型。例如,輸入:IMG207.JPG,輸出:雛菊。這個步驟快速簡單,且衡量的代價小。
  • TensorFlow安裝與卷積模型
    前言本文主要介紹簡單的TensorFlow安裝以及一個卷積模型的小例子
  • 如何從Tensorflow中創建CNN,並在GPU上運行該模型(附代碼)
    最後,您將學習如何在GPU上運行該模型,以便您可以花時間創建更好的模型,而不是等待它們匯聚。Tensorflow的模型圖以下是訓練模型的代碼。在AMI屏幕上,選擇社區並輸入此AMI ID:ami-5e853c48。此AMI配有Tensorflow和Nvidia驅動程序,預裝了CUDA。
  • SkyForm ECP基於Kubernetes構建AIaaS平臺
    作者在之前的文章《在SkyForm ECP上運行深度學習框架》中介紹過深度學習框架運行在kubernetes上的優勢,以及這種實踐方式的基本架構
  • TensorFlow 模型優化工具包:模型大小減半,精度幾乎不變!
    訓練後的 float16 quantization 是量化 TensorFlow Lite 模型很好的方法,因為它對精度的影響極小並且能夠使得模型大小顯著減小。在這裡可以通過查看該文檔(包括一個新的浮動圖表,https://www.tensorflow.org/lite/performance/post_training_quantization),以幫助你了解不同的量化選項和場景。
  • 玩轉TensorFlow?你需要知道這30功能
    2)TensorFlow hub如果你想在小型數據集上訓練你的模型,或者提高泛化能力,你會需要使用遷移學習。對於線上訓練來說,這是一個量很大的工作!https://www.tensorflow.org/tfx/data_validation/?hl=zh-cn
  • TensorFlow.js 進行模型訓練
    TensorFlow.js使用tf.layers API創建模型的語法。如何使用tfjs-vis庫監控瀏覽器內培訓。你需要什麼最新版本的Chrome或其他現代瀏覽器。一個文本編輯器,可以在您的機器上本地運行,也可以通過Codepen或Glitch等在Web上運行。了解HTML,CSS,JavaScript和Chrome DevTools(或您首選的瀏覽器開發工具)。
  • 在TensorFlow中使用模型剪枝將機器學習模型變得更小
    導入常見問題我們的第一步導入一些工具、包:Os和Zipfile可以幫助我們評估模型的大小。tensorflow_model_optimization用來修剪模型。load_model用於加載保存的模型。當然還有tensorflow和keras。
  • TensorFlow極速入門
    最後給出了在 tensorflow 中建立一個機器學習模型步驟,並用一個手寫數字識別的例子進行演示。1、tensorflow是什麼?tensorflow 是 google 開源的機器學習工具,在2015年11月其實現正式開源,開源協議Apache 2.0。
  • tensorflow極速入門
    最後給出了在 tensorflow 中建立一個機器學習模型步驟,並用一個手寫數字識別的例子進行演示。1、 tensorflow是什麼?tensorflow 是 google 開源的機器學習工具,在2015年11月其實現正式開源,開源協議Apache 2.0。下圖是 query 詞頻時序圖,從中可以看出 tensorflow 的火爆程度。
  • 如何使用TensorFlow Hub的ESRGAN模型來在安卓app中生成超分圖片
    深度學習,尤其是對抗生成網絡 GAN,已經被成功應用在超分任務上,比如 SRGAN 和 ESRGAN 都可以生成比較真實的超分圖片。那麼在本文裡,我們將介紹一下如何使用TensorFlow Hub上的一個預訓練的 ESRGAN 模型來在一個安卓 app 中生成超分圖片。最終的 app 效果如下圖,我們也已經將完整代碼開源給大家參考。
  • tensorflow安裝教程
    tensorflow是谷歌開源的人工智慧庫,有最完善的生態支持。是進行人工智慧領域開發和科研的必備工具。本文在windows10下,藉助anaconda建立成功進入tf2.0環境conda activate tf2.0安裝tensorflow2.0 pip install tensorflow==2.0.0-beta1下載的東西挺多,多等一會,最後成功如下命令行運行python,執行import
  • 玩轉TensorFlow Lite:有道雲筆記實操案例分享
    如果只想編譯庫文件,可以編譯 "//tensorflow/contrib/lite/java:tensorflowlite" 這個 target,得到的是 libtensorflowlite_jni.so 庫和相應的 java 層接口。
  • TensorFlow發布JavaScript開發者的機器學習框架TensorFlow.js
    此外 Node.js 很快就會發布,它能為網站模型提供 GPU、TPU 等快速訓練與推斷的方法。在 TensorFlow.js 中,我們可以使用最底層的 JavaScript 線性代數庫或最高級的 API 在瀏覽器上開發模型,也能基於瀏覽器運行已訓練的模型。因此,它可以充分利用瀏覽器和計算機的計算資源實現非常多機器學習應用。
  • 教程| 如何用TensorFlow在安卓設備上實現深度學習推斷
    這種小型關鍵詞檢測(small-footprint keyword-spotting,KWS)推斷通常在本地設備上運行,所以你不必擔心服務提供商隨時監聽你的聲音。而雲服務只在你發出指令後才啟動。類似的概念可以擴展到智能家用電器或其他物聯網設備上的應用,在這些應用中我們需要不依靠網際網路進行免提語音控制。
  • Python安裝TensorFlow 2、tf.keras和深度學習模型的定義
    在工作站上安裝TensorFlow的最常見,也許也是最簡單的方法是使用pip。例如,在命令行上,您可以輸入:sudo pip install tensorflow本教程中的所有示例都可以在現代CPU上正常工作。
  • 瀏覽器上跑:TensorFlow發布實時人物分割模型,秒速25幀24個部位
    這個模型,在瀏覽器上用TensorFlow.js就能跑。而且,幀率還很可觀,在默認設定下:用2018版15吋MacBook Pro跑,每秒25幀。第一部分:導入用npm install @tensorflow-models/body-pix安裝,然後用es6模塊來導入:1import * as bodyPix from '@tensorflow-models/
  • 10 個TensorFlow 2.x 使用技巧
    雖然這是數據增強的實際定義,但是在ImageDataGenerator中,數據集中的圖像在訓練的不同步驟被動態地變換,使模型可以在未見過的有噪數據上進行訓練。, tf.data.Dataset)tensorflow-datasets中可用的數據集的詳細列表可以在:https://www.tensorflow.org/datasets/catalog/overview中找到。