關於 GKE 中的 GPU 共用策略


本頁面說明 Google Kubernetes Engine (GKE) 中每種 GPU 共用策略的特性和最佳工作負載類型,例如多例項 GPU、GPU 時分多工和 NVIDIA MPS。GPU 共用功能可協助您盡量減少叢集中未充分運用的容量,並為工作負載提供足夠的容量來完成工作。

本頁面適用於平台管理員和營運人員,以及希望盡可能有效率地執行 GPU 工作負載,並消耗 GPU 容量的資料和 AI 專家。如要進一步瞭解我們在 Google Cloud 內容中提及的常見角色,請參閱「常見的 GKE Enterprise 使用者角色和工作」。

閱讀本頁面之前,請務必熟悉下列概念:

Kubernetes 中的 GPU 要求運作方式

Kubernetes 可讓工作負載準確要求運作所需的資源量。雖然您可以為工作負載要求部分 CPU 單位,但無法要求部分 GPU 單位。Pod 資訊清單必須以整數要求 GPU 資源,也就是說,即使容器只需要一小部分資源才能正常運作,系統也會將整個實體 GPU 分配給一個容器。這不僅效率不彰,還可能造成高昂的費用,尤其是當您執行多個 GPU 需求相近的工作負載時。

最佳做法

如果工作負載不需要所有 GPU 資源,請使用 GPU 共用策略來提升 GPU 使用率。

GPU 共用策略有哪些?

GPU 共用策略可讓多個容器有效運用附加的 GPU,並節省執行費用。GKE 提供下列 GPU 共用策略:

  • 多執行個體 GPU:GKE 會將單一支援的 GPU 分成最多七個切片。每個切片可獨立分配給節點上的容器,每個 GPU 最多可分配給七個容器。多執行個體 GPU 可在工作負載之間提供硬體隔離,並為 GPU 上執行的所有容器提供一致且可預測的服務品質 (QoS)。
  • GPU 分時:GKE 會使用 NVIDIA GPU 和軟體堆疊提供的內建分時功能。從 Pascal 架構開始,NVIDIA GPU 支援指令層級搶占。在 GPU 上執行的程序之間進行內容切換時,指令層級搶占可確保每個程序都能獲得公平的時間片段。GPU 時分多工技術可在軟體層面隔離工作負載,包括位址空間、效能和錯誤隔離。
  • NVIDIA MPS:GKE 使用 NVIDIA 的多重程序服務 (MPS)。NVIDIA MPS 是 CUDA API 的替代方案,與二進位檔相容,可透明地讓多程序 CUDA 工作負載在單一 GPU 裝置上同時執行。使用 NVIDIA MPS 的 GPU 可在資源限制方面提供軟體層級的隔離 (作用中執行緒百分比釘選的裝置記憶體)。

要使用的 GPU 共用策略

下表匯總並比較了可用 GPU 共用策略的特性:

多執行個體 GPU GPU 分時 NVIDIA MPS
一般 在容器之間平行共用 GPU 快速切換情境 在容器之間平行共用 GPU
隔離 單一 GPU 最多可劃分為七個切片,同一實體 GPU 上的每個容器都有專屬的運算、記憶體和頻寬。因此,即使其他容器使其他分割區達到飽和,分割區中的容器仍可維持可預測的輸送量和延遲時間。

每個容器都會在 GPU 上執行的程序之間切換環境,藉此存取基礎實體 GPU 的完整容量。

不過,時分多工不會在共用作業之間強制執行記憶體限制,而且共用存取的快速環境切換可能會造成額外負擔。

NVIDIA MPS 的資源隔離功能有限,但在其他層面更具彈性,例如 GPU 類型和共用單元上限,可簡化資源分配作業。
適用於下列工作負載 建議用於平行執行的工作負載,且需要特定韌性和服務品質。舉例來說,執行 AI 推論工作負載時,多執行個體 GPU 可讓多個推論查詢同時執行,快速回應,不會互相拖累。

建議用於有閒置期的突發和互動式工作負載。如果使用完全專屬的 GPU,這些工作負載的成本效益不高。使用分時功能時,工作負載在活動階段可快速存取 GPU。

如果不需要完全隔離和持續存取 GPU,例如多位使用者測試或製作工作負載原型時,GPU 時分多工是避免閒置昂貴 GPU 的最佳做法。

使用分時的作業負載必須容許效能和延遲方面的某些妥協。

建議用於小型工作的批次處理,因為 MPS 可盡量提高 GPU 的總處理量和並行使用率。MPS 可讓批次工作並行處理,有效處理小型到中型的工作負載。

NVIDIA MPS 最適合做為單一應用程式的協作程序。舉例來說,具有 MPI 之間等級平行處理的 MPI 工作。使用這些工作時,每個小型 CUDA 程序 (通常是 MPI 等級) 都可以在 GPU 上並行執行,充分運用整個 GPU 的效能。

使用 CUDA MPS 的工作負載必須容許記憶體保護和錯誤遏止限制

監控 多執行個體 GPU 不支援 GPU 使用率指標。 使用 Cloud Monitoring 監控 GPU 時段共用的效能。如要進一步瞭解可用指標,請參閱「監控 GPU 時分或 NVIDIA MPS 節點」。 使用 Cloud Monitoring 監控 NVIDIA MPS 的效能。如要進一步瞭解可用指標,請參閱「監控 GPU 時分或 NVIDIA MPS 節點」。
在工作負載中要求共用 GPU 執行多執行個體 GPU 以分時方式執行 GPU 使用 NVIDIA MPS 執行 GPU
最佳做法

如要盡量提高 GPU 使用率,請結合 GPU 共用策略。針對每個多例項 GPU 分割區,使用分時或 NVIDIA MPS。接著,您可以在每個分割區上執行多個容器,這些容器會共用該分割區上資源的存取權。建議使用下列任一組合:

  • 多執行個體 GPU 和 GPU 分時。
  • 多執行個體 GPU 和 NVIDIA MPS。

GPU 共用策略的運作方式

您可以指定允許共用實體 GPU 的容器數量上限:

  • 在 Autopilot 叢集上,這項設定是在工作負載規格中設定。
  • 在標準叢集上,您建立附加 GPU 的新節點集區時,系統會設定這項功能。節點集區中的每個 GPU 都會根據您在節點集區層級指定的設定共用。

以下各節說明每種 GPU 共用策略的排程行為和運作方式。

多執行個體 GPU

如要在工作負載中要求多例項 GPU,請在 spec: nodeSelector 底下的 Pod 規格 cloud.google.com/gke-gpu-partition-size 欄位中指定 nodeSelector 標籤。

GKE 會比對這些標籤,將工作負載排定至適當的可用節點。如果沒有適用的可用節點,GKE 會使用自動調整規模和節點自動佈建功能,建立符合這個標籤的新節點或節點集區。

GPU 分時或 NVIDIA MPS

如要在工作負載中要求 GPU 分時或 NVIDIA MPS,請在 Pod 規格 nodeSelector 欄位中,於 spec:nodeSelector 下方指定下列標籤。

  • cloud.google.com/gke-max-shared-clients-per-gpu:選取節點,允許特定數量的用戶端共用基礎 GPU。
  • cloud.google.com/gke-gpu-sharing-strategy:選取使用 GPU 分時或 NVIDIA MPS 策略的節點。

下表說明排程行為如何根據您在資訊清單中指定的節點標籤組合而異。

節點標籤
cloud.google.com/gke-max-shared-clients-per-gpu



cloud.google.com/gke-gpu-sharing-strategy

GKE 會在符合這兩個標籤的可用節點中排定工作負載。

如果沒有可用節點,GKE 會使用自動調整規模和節點自動佈建功能,建立符合這兩個標籤的新節點或節點集區。

只要 cloud.google.com/gke-max-shared-clients-per-gpu

Autopilot:GKE 會拒絕工作負載。

標準:GKE 會在符合標籤的可用節點中排定工作負載。如果沒有可用節點,GKE 會使用自動調整功能和節點自動佈建功能,建立符合標籤的新節點或節點集區。根據預設,系統會為自動佈建的節點指派下列標籤和值 (適用於每項策略):

  • GPU 時分多工: cloud.google.com/gke-gpu-sharing-strategy=TIME_SHARING
  • NVIDIA MPS: cloud.google.com/gke-gpu-sharing-strategy=MPS
只要 cloud.google.com/gke-gpu-sharing-strategy

Autopilot:GKE 會拒絕工作負載。

標準:GKE 會在可用的節點中排定工作負載,這些節點使用特定共用策略。

  • 如果有多個共用節點集區的 cloud.google.com/gke-max-shared-clients-per-gpu 值不同,工作負載可以排程在任何可用節點上。
  • 如果任何節點集區都沒有可用節點,叢集自動調度器會調度 cloud.google.com/gke-max-shared-clients-per-gpu 值最低的節點集區。
  • 如果所有節點集區都已達到容量上限,節點自動佈建功能會建立新的節點集區,並將 cloud.google.com/gke-max-shared-clients-per-gpu=2

無論是 GPU 時段共用還是 NVIDIA MPS 策略,您完成的 GPU 要求程序都相同。

如果您開發的 GPU 應用程式在 GPU 分時或 NVIDIA MPS 上執行,每個容器只能要求一個 GPU。為避免發生非預期的行為,GKE 會拒絕在容器中要求多個 GPU 的要求。此外,透過分時和 NVIDIA MPS 要求的 GPU 數量,並非容器可用的運算能力指標。

下表說明要求特定數量的 GPU 時,預期會發生的情況。

適用於 GPU 時段共用和 NVIDIA MPS 的 GPU 要求
每個容器一個 GPU 分時或 NVIDIA MPS 即使節點有一個或多個實體 GPU,GKE 仍允許要求。
每個容器可共用多個 GPU

GKE 會拒絕要求。

在容器中要求多個多執行個體 GPU 執行個體時,也會出現相同行為,因為每個 GPU 執行個體都會視為獨立的實體 GPU。

每個容器超過一個 NVIDIA MPS

GKE 會根據節點中的實體 GPU 數量執行下列操作:

  • 如果節點只有一個實體 GPU,GKE 會允許要求。
  • 如果節點有多個實體 GPU,GKE 會拒絕要求。在容器中要求多個多執行個體 GPU 執行個體時,也會出現相同行為,因為每個 GPU 執行個體都會視為獨立的實體 GPU。

如果 GKE 拒絕工作負載,您會看到類似以下的錯誤訊息:

status:
  message: 'Pod Allocate failed due to rpc error: code = Unknown desc = [invalid request
    for sharing GPU (time-sharing), at most 1 nvidia.com/gpu can be requested on GPU nodes], which is unexpected'
  phase: Failed
  reason: UnexpectedAdmissionError

監控 GPU 分時或 NVIDIA MPS 節點

使用 Cloud Monitoring 監控 GPU 時分多工或 NVIDIA MPS 節點的效能。GKE 會將每個 GPU 節點的指標傳送至 Cloud Monitoring。這些 GPU 分時或 NVIDIA MPS 節點指標適用於節點層級 (node/accelerator/)。

您可以在 Cloud Monitoring 中查看每個 GPU 分時或 NVIDIA MPS 節點的下列指標:

  • 任務週期 (node/accelerator/duty_cycle):在 GPU 節點主動處理期間,過去取樣期間 (10 秒) 的時間百分比。範圍為 1% 到 100%。
  • 「記憶體用量」(node/accelerator/memory_used):每個 GPU 節點分配的加速器記憶體量,以位元組為單位。
  • 記憶體容量 (node/accelerator/memory_total):每個 GPU 節點的加速器記憶體總量,以位元組為單位。

這些指標與一般 GPU 的指標不同,一般 GPU 並非分時或 NVIDIA MPS 節點。一般實體 GPU 的指標適用於容器層級 (container/accelerator),且不會針對排定在 GPU 時間共用或 NVIDIA MPS GPU 上的容器收集指標。

後續步驟