自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何使用Kubernetes合理調整GPU和CPU資源以訓練和推理AI模型?

譯文 精選
云計算 人工智能
本文將探索如何使用Kubernetes的先進功能,根據(jù)需要動態(tài)高效地對工作負載進行優(yōu)先級排序,從而優(yōu)化GPU和CPU資源的分配。

譯者 | 李睿

審校 | 重樓

如今,人工智能服務的迅速崛起創(chuàng)造了對計算資源的巨大需求,而如何有效管理這些資源成為一項關鍵挑戰(zhàn)。雖然使用Kubernetes運行人工智能工作負載已經取得了長足的進步,但基于動態(tài)需求優(yōu)化調度仍然是一個亟待改進的領域。在全球范圍內,許多組織面臨與GPU集群的成本和可用性相關的限制,并且通常依賴于這些計算集群來進行推理工作負載和持續(xù)的模型訓練和微調。

Kubernetes中的人工智能模型訓練和模型推理

與推理相比,訓練通常需要更多的計算能力。另一方面,使用推理的頻率遠高于訓練,這是因為它被用于在許多應用程序中反復進行預測。本文將探索如何利用Kubernetes的先進功能,通過根據(jù)需要動態(tài)高效地對工作負載進行優(yōu)先級排序來優(yōu)化資源分配。

圖1展示了訓練與推理的過程。對于人工智能模型的訓練,工作負載運行的頻率可能較低,但需要更多的計算資源,因為實際上是在“教”它如何響應新數(shù)據(jù)。一旦經過訓練,就會部署人工智能模型,并經常在GPU計算實例上運行,以提供低延遲的最佳結果。因此,推理將更頻繁地運行,但強度不會那么大。與此同時,開發(fā)人員可能需要重新訓練模型以容納新數(shù)據(jù),甚至嘗試使用其他需要在部署前進行訓練的模型。

圖1 人工智能模型訓練vs. 人工智能模型推理圖1 人工智能模型訓練vs. 人工智能模型推理

人工智能工作負載與高性能計算(HPC)工作負載類似,尤其是在訓練方面。Kubernetes并不是為HPC設計的,但是由于Kubernetes是開源的,并且很大程度上是由社區(qū)推動的,因此在這個領域出現(xiàn)了快速的創(chuàng)新。而對優(yōu)化的需求推動了KubeFlow和Kueue等工具的開發(fā)。

Kubernetes的人工智能工作負載

KubeFlow使用管道將數(shù)據(jù)科學中的步驟簡化為邏輯操作塊,并提供了許多可以插入這些步驟的庫,從而幫助開發(fā)人員快速上手并順利運行。

Kueue提供了多種資源“風格”,使其能夠根據(jù)當時可用的硬件配置定制工作負載,并相應地調度相應的工作負載(當然,其功能遠不止于此)。社區(qū)在這些工具及其他工具方面出色地解決了擴展、效率、分發(fā)和調度等問題。

以下是一個示例,展示了如何使用Kubernetes在支持遠程直接內存訪問RDMA (RoCEv2)的GPU集群上調度和優(yōu)先考慮訓練和推理任務。創(chuàng)建一些示例代碼來演示這個概念。注:在代碼中,使用了虛構的網站gpuconfig.com表示GPU制造商。此外,<gpu name>是希望指定的特定GPU的占位符。

Shell 
 apiVersion: scheduling.k8s.io/v1

 kind: PriorityClass

 metadata:

 name: high-priority-<gpu name>

 value: 1000000

 globalDefault: false

 description: "This priority class should be used for high priority <GPU NAME> GPU jobs only."

 ---

 apiVersion: scheduling.k8s.io/v1

 kind: PriorityClass

 metadata:

 name: medium-priority-<gpu name>

 value: 100000

 globalDefault: false

 description: "This priority class should be used for medium priority <GPU NAME> GPU jobs."

 ---

 apiVersion: v1

 kind: Pod

 metadata:

 name: high-priority-gpu-job

 spec:

 priorityClassName: high-priority-<gpu name>

 containers:

 - name: gpu-container

 image: gpu/<gpu image>

 command: [" <gpu vendor>-smi"]

 resources:

 limits:

 gpuconfig.com/gpu: 1

 nodeSelector:

 gpu-type: <gpu name>

 rdma: "true"

---

 apiVersion: v1

 kind: Pod

 metadata:

 name: medium-priority-gpu-job

 spec:

 priorityClassName: medium-priority-<gpu name>

 containers:

 - name: gpu-container

 image: gpu/<gpu image>

 command: [" <gpu vendor>-smi"]

 resources:

 limits:

 gpuconfig.com/gpu: 1

 nodeSelector:

 gpu-type: <gpu name>

 rdma: "true"

這個Kubernetes配置演示了如何使用RDMA主干網對GPU節(jié)點上的作業(yè)進行優(yōu)先級排序。以下分解其中的關鍵組件:

1. PriorityClasses:為GPU的任務定義了兩個優(yōu)先級類:

  • high-priority-<gpu name>:用于需要立即執(zhí)行的關鍵任務。
  • medium-priority-<gpu name>:用于重要但必要時可以等待的任務。

2. Pod規(guī)范:創(chuàng)建了兩個示例Pod來展示如何使用這些優(yōu)先級類:

  • high-priority-gpu-job:使用high-priority-<gpu name>類。
  • medium-priority-gpu-job:使用medium-priority-<gpu name>類。

3.節(jié)點選擇:兩個pod都使用nodeSelector來確保它們被調度到具有RDMA的特定GPU節(jié)點上。

Shell 
 nodeSelector:

 gpu-type: <gpu name>

 rdma: "true"

4.資源請求:每個pod請求一個GPU:

Shell 
 resources:

 limits:

 gpuconfig.com/gpu: 1

Kubernetes使用優(yōu)先級類別來決定Pod的調度順序,以及在系統(tǒng)資源緊張時決定哪些Pod應被優(yōu)先移除。以下是一個使用高優(yōu)先級類別創(chuàng)建CronJob的示例:

Shell 
 apiVersion: batch/v1beta1

 kind: CronJob

 metadata:

 name: high-priority-ml-training

 spec:

 schedule: "0 2 * * *"

 jobTemplate:

 spec:

 template:

 metadata:

 name: ml-training-job

 spec:

 priorityClassName: high-priority-<gpu name>

 containers:

 - name: ml-training

 image: your-ml-image:latest

 resources:

 limits:

 gpuconfig.com/gpu: 2

 restartPolicy: OnFailure

 nodeSelector:

 gpu-type: <gpu name>

 rdma: "true"

Kubernetes中的GPU資源管理

以下是Kubernetes中GPU資源管理的一些示例。

Shell 
 

 apiVersion: v1

 kind: ResourceQuota

 metadata:

 name: gpu-quota

 namespace: ml-workloads

 spec:

 hard:

 requests.gpuconfig.com/gpu: 8

 limits.gpuconfig.com/gpu: 8

 ---

 apiVersion: v1

 kind: LimitRange

 metadata:

 name: gpu-limits

 namespace: ml-workloads

 spec:

 limits:

 - default:

 gpuconfig.com/gpu: 1

 defaultRequest:

 gpuconfig.com/gpu: 1

 max:

 gpuconfig.com/gpu: 4

 min:

 gpuconfig.com/gpu: 1

 type: Container

 ---

 apiVersion: scheduling.k8s.io/v1

 kind: PriorityClass

 metadata:

 name: gpu-burst

 value: 1000000

 globalDefault: false

 description: "This priority class allows for burst GPU usage, but may be preempted."

 ---

 apiVersion: v1

 kind: Pod

 metadata:

 name: gpu-burst-job

 namespace: ml-workloads

 spec:

 priorityClassName: gpu-burst

 containers:

 - name: gpu-job

 image: gpu/<gpu image>

 command: [" <gpu vendor>-smi"]

 resources:

 limits:

 gpuconfig.com/gpu: 2

 nodeSelector:

 gpu-type: <gpu name>

在過去,了解硬件的當前狀態(tài)以確定工作負載的優(yōu)先級可能是一挑戰(zhàn),但得益于開源工具,現(xiàn)在已有了解決方案。為了監(jiān)控GPU利用率,采用了諸如Prometheus和Grafana等工具。以下是一個用于抓取GPU指標的Prometheus配置示例:

Shell 
 global:

 scrape_interval: 15s

 

 scrape_configs:

 - job_name: 'gpu_gpu_exporter'

 static_configs:

 - targets: ['localhost:9835']

以下是一個簡單的Python腳本,使用它來根據(jù)利用率指標優(yōu)化GPU分配:

Python 
 import kubernetes

 from prometheus_api_client import PrometheusConnect

 

 def get_gpu_utilization(prometheus_url, pod_name):

 prom = PrometheusConnect(url=prometheus_url, disable_ssl=True)

 query = f'gpu_gpu_utilization{{pod="{pod_name}"}}'

 result = prom.custom_query(query)

 return float(result[0]['value'][1]) if result else 0

 

  def optimize_gpu_allocation():

 kubernetes.config.load_kube_config()

 v1 = kubernetes.client.CoreV1Api()

 

 pods = v1.list_pod_for_all_namespaces(label_selector='gpu=true').items

 for pod in pods:

 utilization = get_gpu_utilization('http://prometheus:9090', pod.metadata.name)

 if utilization < 30: # If GPU utilization is less than 30%

 # Reduce GPU allocation

 patch = {

 "spec": {

 "containers": [{

 "name": pod.spec.containers[0].name,

 "resources": {

 "limits": {

 "gpuconfig.com/gpu": "1"

 }

 }

 }]

 }

 }

 v1.patch_namespaced_pod(name=pod.metadata.name, namespace=pod.metadata.namespace, body=patch)

 print(f"Reduced GPU allocation for pod {pod.metadata.name}")



 if __name__ == "__main__":

 optimize_gpu_allocation()

腳本用于檢查Pod的GPU利用率,并在利用率較低時減少資源分配。該腳本作為優(yōu)化資源使用的一項功能運行。

利用Kubernetes管理GPU和CPU資源

因此,利用Kubernetes和OCI Kubernetes引擎(OKE)在人工智能模型的訓練和推理工作負載中動態(tài)管理GPU和CPU資源。具體來說,專注于利用RDMA(RoCEv2)功能調整GPU分配的大小。開發(fā)人員開發(fā)了Kubernetes配置、Helm圖,包括自定義優(yōu)先級類、節(jié)點選擇器和資源配額,以確保高優(yōu)先級和中優(yōu)先級人工智能任務的最佳調度和資源優(yōu)先級。

通過利用Kubernetes的靈活性和OKE在Oracle Cloud Infrastructure(OCI)上的管理能力,平衡了訓練的繁重計算需求和推理的較輕計算需求。這確保了資源的動態(tài)分配,減少了資源浪費,同時保持了關鍵任務的高性能。此外,還集成了Prometheus等監(jiān)控工具以跟蹤GPU利用率,并使用Python腳本自動調整分配。這種自動化有助于優(yōu)化性能,同時管理成本和可用性。

結語

在這里概述的解決方案普遍適用于使用Kubernetes進行AI/ML工作負載的云平臺和內部部署平臺。而無論是硬件還是任何其他計算平臺,使用Kubernetes進行動態(tài)調度和資源管理的關鍵原則都是相同的。Kubernetes允許組織有效地對工作負載進行優(yōu)先級排序,優(yōu)化他們對任何可用硬件資源的使用。通過采用相同的方法,組織可以微調其基礎設施,減少瓶頸,降低資源閑置率,從而實現(xiàn)更高效、更具成本效益的運營。

原文標題:Right-Sizing GPU and CPU Resources For Training and Inferencing Using Kubernetes,作者:Sanjay Basu,Victor Agreda

責任編輯:華軒 來源: 51CTO
相關推薦

2023-01-05 09:33:37

視覺模型訓練

2022-03-24 08:04:50

Kubernetes資源限制

2024-09-19 18:49:54

完全同態(tài)加密FHE機器學習

2024-03-20 11:07:57

AI計算CPUGPU

2024-03-26 00:10:08

預測AI泛化

2023-05-12 18:42:13

得物AI平臺

2020-05-29 15:40:40

NVIDIA

2025-01-09 08:01:10

2024-07-26 08:59:33

2025-02-07 14:04:44

2017-11-01 15:13:49

TensorFlow神經網絡深度學習

2024-06-12 09:52:49

2024-02-19 00:21:45

開源圖片

2025-03-05 00:22:00

2024-07-25 08:25:35

2018-12-24 10:53:48

2024-09-29 10:56:58

2021-07-01 16:47:37

NVIDIA

2017-06-23 14:11:56

2025-04-01 09:54:09

AI算法大模型AI
點贊
收藏

51CTO技術棧公眾號