本文介紹了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。它們都支持自動擴展,並為自動化服務模型版本、金絲雀發布、更新和生命周期管理提供了許多有用的功能。