譯者 | 李睿
審校 | 重樓
如今,人工智能服務的迅速崛起創(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. 人工智能模型推理
人工智能工作負載與高性能計算(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