5. shared-gpu介绍
shared-gpu 是一种允许多个 Pod 容器共享同一块物理 GPU 实例的资源调度方案。其核心目标是解决 GPU 资源利用率低下的问题。 在实际任务调度中,单个轻量级推理或训练任务往往仅占用物理 GPU 实例的一小部分算力,导致大量计算资源闲置。 通过支持物理 GPU 的实例超额分配,shared-gpu 可显著提升单卡资源利用率,实现更高效的资源复用与成本优化。
5.1. 在K8s场景下使用shared-gpu
5.1.1. 安装 GPU Operator
备注
关于 GPU Operator 所依赖的前置资源,参见《曦云系列通用GPU云原生参考手册》中“安装与维护”章节。
获取安装包
以 0.13.0 版本为例,从 沐曦软件中心 下载离线安装包 metax-gpu-k8s-package.0.13.0.tar.gz,解压后获取以下文件:
metax-k8s-images.0.13.0.run:镜像资源包
metax-operator-0.13.0.tgz:Operator Helm Chart
metax-gpu-extensions-0.13.0.tgz:Extensions Helm Chart
准备内核驱动和 MXMACA® SDK 镜像
GPU Operator 会自动管理节点上的内核驱动及 MXMACA® SDK 的部署与更新,需确保所有工作节点均可正常拉取相关镜像资源。
内核驱动与 MXMACA® SDK 可从 沐曦软件中心 下载。
资源包格式:
内核驱动镜像包
metax-k8s-driver-image.<VERSION>-<ARCH>.run:包含内核态驱动和配套 mx-smi 工具的资源包
MXMACA® SDK 镜像包
随 MXMACA® 的发布包发布,例如 maca-native:<VERSION>-<DISTRO>-<ARCH>.container.xz 或者 maca-c500-container-*.xz
推送镜像
# 假设容器仓库服务器域名为 DOMAIN ,用于存放沐曦Kubernetes组件镜像的项目名为 PROJECT。 # 默认使用docker进行镜像推送 metax-k8s-images.0.13.0.run push DOMAIN/PROJECT # 使用nerdctl进行镜像推送 metax-k8s-images.0.13.0.run nerdctl push DOMAIN/PROJECT
备注
自 0.13.0 起,该工具支持多种运行时:
docker、nerdctl、ctr。若未显式指定,默认使用
docker。若主机未安装docker,系统将自动检测可用运行时并执行镜像推送。
推送 Helm Charts
helm push ./k8s/metax-operator-0.13.0.tgz oci://DOMAIN/PROJECT
5.1.2. 启动shared-gpu模式
安装 GPU Operator
以容器镜像仓库地址为
DOMAIN/PROJECT为例,在 Kubernetes 管理节点执行以下命令安装 GPU Operator 。helm install ./k8s/metax-operator-0.13.0.tgz \ --create-namespace -n metax-operator \ --generate-name \ --wait \ --set registry=DOMAIN/PROJECT
验证安装状态
在 Kubernetes 管理节点执行以下命令检查 Pod 是否处于
Running状态。kubectl get pod -n metax-operator NAME READY STATUS RESTARTS AGE metax-container-runtime-4lsd7 1/1 Running 0 31s metax-gpu-device-7774b 1/1 Running 0 31s metax-gpu-label-l5tkf 1/1 Running 0 31s metax-operator-1755847288-77bfc94568-7wqlh 1/1 Running 0 31s ...
创建ConfigMap配置
在 Kubernetes 管理节点执行以下命令创建
ConfigMap配置集群级别和节点级别的 gpu-device 的运行模式。 配置为shared-gpu模式的节点将启用 GPU 实例超额分配功能。cat << "EOF" | kubectl apply -f - apiVersion: v1 kind: ConfigMap metadata: name: metax-device-config namespace: metax-operator data: version: v1 cluster-config: | mode: "shared" shareNums: 8 nodes-config: | - nodeName: "sample-node1" mode: "shared" shareNums: 8 EOF
检查节点资源配置
以 sample-node1 节点为例,在 Kubernetes 管理节点执行以下命令检查配置为
shared-gpu模式的节点资源。kubectl get node sample-node1 -o json | jq '.status.allocatable | with_entries(select(.key | startswith("metax-tech.com/shared-gpu")))' # 示例输出 { "metax-tech.com/shared-gpu": "8" }
5.1.3. 编写任务 YAML
创建 sample.yaml,用户可参考以下示例编写任务文件。
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
spec:
containers:
- name: ubuntu
image: ubuntu:22.04
imagePullPolicy: IfNotPresent
command: ['bash', '-c']
args: ["sleep infinity"]
resources:
limits:
metax-tech.com/shared-gpu: 1 # requesting 1 GPU
备注
实例超额分配目前仅支持单卡任务分配。
5.1.4. 提交任务
在 Kubernetes 管理节点执行以下命令提交任务。
kubectl create -f sample.yaml
5.1.5. 检查调度结果
在 Kubernetes 管理节点执行以下命令检查任务的调度节点。
kubectl get pod -owide
NAME READY STATUS RESTARTS AGE NODE
sample-pod 1/1 Running 0 31s shared-gpu-node