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云原生参考手册》中“安装与维护”章节。

  1. 获取安装包

    以 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

  2. 准备内核驱动和 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

  3. 推送镜像

    # 假设容器仓库服务器域名为 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 起,该工具支持多种运行时:dockernerdctlctr

    • 若未显式指定,默认使用docker。若主机未安装docker,系统将自动检测可用运行时并执行镜像推送。

  4. 推送 Helm Charts

    helm push ./k8s/metax-operator-0.13.0.tgz oci://DOMAIN/PROJECT
    

5.1.2. 启动shared-gpu模式

  1. 安装 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
    
  2. 验证安装状态

    在 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
    ...
    
  3. 创建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
    
  4. 检查节点资源配置

    以 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