在 Kubernetes 中使用阿里云调度器实现 GPU 份额划分
这篇博客详细介绍了如何在 Kubernetes 环境中使用开源框架,将单个 GPU 划分为最多七个较小的 GPU,每个都拥有自己的内存、缓存和流多处理器。
本指南对于希望优化 GPU 资源以满足特定工作负载需求的机器学习工程师、数据科学家和人工智能研究人员尤其有益。
核心要点
- 部署多个共享 GPU 资源的容器。
- 理解各种方法的优缺点。
- 阿里云 Gpushare Scheduler Extender 的分步使用指南。
目录
理解 Nvidia MIG 及其局限性
Nvidia Multi-Instance GPU (MIG) 功能,在 NVIDIA 的 A100 及后续 GPU 中提供,允许将单个 A100 GPU 划分为最多七个较小的 GPU,每个都拥有自己的内存、缓存和流多处理器。此功能旨在根据特定的工作负载需求(如机器学习、数据分析或图形处理)提高 GPU 资源的利用率。MIG 技术在云和数据中心环境中特别有价值,它有助于高效利用 GPU 资源,在各种计算任务中提供灵活性和改进的性能。然而,我们发现 Nvidia MIG 驱动程序存在以下局限性:
- 资源分区:在实例之间划分内存和计算核心可能会限制每个实例的资源,从而影响高需求任务的性能。
- 潜在的资源未充分利用:工作负载和资源分区之间可能存在不匹配的风险,导致资源未充分利用。
- 兼容性和支持:MIG 技术仅限于某些 NVIDIA GPU,如 A100,不包括旧型号。
- 管理复杂性:管理多个 GPU 实例增加了复杂性,尤其是在大规模部署中。
- 实例间通信:由于 GPU 实例的逻辑隔离,可能会出现通信挑战。
我们的建议:阿里云 Gpushare Scheduler Extender
我们强烈推荐 阿里云 Gpushare Scheduler Extender,可在 Aliyun Gpushare Scheduler Extender 获取。尽管它需要在 Kubernetes 中进行高级配置,但它被证明是更优的选择。针对 AKS(Azure Kubernetes Service)概述的步骤很容易适应其他云提供商。
分步教程
以下是设置它的分步指南,以 AKS(Azure Kubernetes Service)为例,但也适用于其他云提供商:
步骤 1:配置 Docker 运行时(Azure/GCP 环境可跳过)
对于非 Azure/GCP 环境,请确保您的 /etc/docker/daemon.json
配置正确
sudo vi /etc/docker/daemon.json
验证 JSON 是否包含以下配置
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}
步骤 2:设置调度器
SSH 连接到 GPU 节点并准备调度器配置(只需在一个 GPU 节点中操作)
cd /etc/kubernetes
sudo curl -O https://raw.githubusercontent.com/AliyunContainerService/gpushare-scheduler-extender/master/config/scheduler-policy-config.json
更新 kube-scheduler.yaml
以使用新配置
sudo cd /tmp/
sudo wget https://github.com/AliyunContainerService/gpushare-scheduler-extender/blob/master/config/kube-scheduler-v1.23+.yaml
sudo cp /tmp/kube-scheduler.yaml /etc/kubernetes/manifests/kube-scheduler.yaml
步骤 3:部署设备插件和调度器控制器
退出 GPU,使用 kubectl 在已配置集群的环境中部署必要的组件
curl -O https://raw.githubusercontent.com/AliyunContainerService/gpushare-scheduler-extender/master/config/gpushare-schd-extender.yaml
wget https://raw.githubusercontent.com/AliyunContainerService/gpushare-device-plugin/master/device-plugin-rbac.yaml
wget https://raw.githubusercontent.com/AliyunContainerService/gpushare-device-plugin/master/device-plugin-ds.yaml
kubectl create -f gpushare-schd-extender.yaml
kubectl create -f device-plugin-rbac.yaml
kubectl create -f device-plugin-ds.yaml
标记节点以自动包含在 NodePool 中
kubectl label node aks-<your_node_name>-xxxxxxxx-vmss000000 gpushare=true
步骤 4:验证 GPU 状态
安装并运行 kubectl 插件以检查 GPU 状态
sudo wget https://github.com/AliyunContainerService/gpushare-device-plugin/releases/download/v0.3.0/kubectl-inspect-gpushare
sudo chmod 755 ./kubectl-inspect-gpushare
./kubectl-inspect-gpushare
步骤 5:配置节点调度器
修改 gpushare-schd-extender.yaml
以在特定节点上运行调度器
vi gpushare-schd-extender.yaml
更新 nodeSelector
nodeSelector:
kubernetes.io/hostname: aks-<your_node_pool_name>-xxxxxxxx-vmss00000<node_number>
重新部署调度器
kubectl delete -f gpushare-schd-extender.yaml
kubectl apply -f gpushare-schd-extender.yaml
要显示更多节点,请继续使用此命令标记其他 GPU 节点
kubectl label node aks-<your_node_name>-xxxxxxxx-vmss00000<X> gpushare=true
步骤 6:部署测试 Pod
创建并部署一个测试 Pod 以监控利用率
apiVersion: v1
kind: Pod
metadata:
name: gpushare-test-pod
spec:
restartPolicy: OnFailure
containers:
- name: gpushare-test-pod
image: "cheyang/gpu-player:v2"
env:
- name: NVIDIA_VISIBLE_DEVICES
value: "all"
resources:
limits:
aliyun.com/gpu-mem: 5
使用以下命令部署:
kubectl apply -f test-pods.yaml
使用阿里云 GPU 调度器的优势
- 灵活性和可扩展性:此调度器擅长根据虚拟机的即时需求动态分配 GPU 资源。在工作负载和需求频繁变化的环境中,它尤其有用。
- 性能:性能水平可能因共享 GPU 的工作负载数量以及每个虚拟机的特定工作负载而异。然而,其优势在于所有模型都能利用核心,从而实现更高的整体利用率。
- 资源分配:调度器有助于 GPU 资源的动态分配和平衡。这种适应性至关重要,因为它允许根据不断变化的工作负载需求进行调整。它的装箱方法不受分区大小的限制,提供了更大的灵活性。
- 兼容性和支持:它支持更广泛的 GPU,并且通常与各种虚拟化软件集成,增强了其适用性和通用性。
结论
阿里云插件是 Kubernetes 环境中共享 GPU 资源的极其有效的解决方案。本指南提供了详细的分步设置说明,并阐明了阿里云提供的增强的灵活性、效率和兼容性。这些特性使其成为管理复杂云和数据中心基础设施中不可或缺的工具。
对于那些渴望扩展理解的人,我乐于分享我们的见解。我的专业领域侧重于帮助组织扩展 GPU 工作负载。
在我的职业生涯中,我在 Kubernetes 上设置各种大型语言模型 (LLM) 和扩散模型方面积累了丰富的专业知识。这包括特别关注实现 GPU 份额划分,这种策略显著有助于这些工作负载的经济高效部署。