6. shared-gpu介绍

shared-gpu 是一种允许多个 Pod 容器共享同一块物理 GPU 实例的资源调度方案。其核心目标是解决 GPU 资源利用率低下的问题。 在实际任务调度中,单个轻量级推理或训练任务往往仅占用物理 GPU 实例的一小部分算力,导致大量计算资源闲置。 通过支持物理 GPU 的实例超额分配,shared-gpu 可显著提升单卡资源利用率,实现更高效的资源复用与成本优化。

6.1. 在K8s场景下使用shared-gpu

6.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 工具的资源包

      • Docker pull 获取镜像:沐曦软件中心 → 软件下载 → 镜像 → Cloud-Tools。

      • 从页面下载或 wget 获取 .run 文件:沐曦软件中心 → 软件下载 → 软件栈 → 工具包 → 云平台工具 → metax-k8s-driver-image。

    • MXMACA® SDK 镜像包

      Docker pull 获取镜像、从页面下载或 wget 获取 SDK 离线包:沐曦软件中心 → 软件下载 → 镜像 → MXMACA。

      离线包名称随 SDK 版本变化,实际文件名以软件下载页面为准。后文均以 maca-native-<VERSION>-<DISTRO>-<ARCH>.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
      
    • 推送内核驱动镜像

      根据内核驱动镜像的获取方式,选择以下任一方式推送:

      • Docker pull 方式

        通过 Docker pull 获取的镜像无需导入,重新打标并推送到私有镜像仓库。其中, <DRIVER-IMAGE> 为 Docker pull 获取的完整镜像名称。

        docker tag <DRIVER-IMAGE> DOMAIN/PROJECT/driver-image:<VERSION>-<ARCH>
        docker push DOMAIN/PROJECT/driver-image:<VERSION>-<ARCH>
        
      • .run 文件方式

        通过从页面下载或 wget 获取 .run 文件后,执行:

        chmod a+x metax-k8s-driver-image.<VERSION>-<ARCH>.run
        ./metax-k8s-driver-image.<VERSION>-<ARCH>.run push DOMAIN/PROJECT
        
    • 导入并推送 MXMACA® SDK 镜像

      通过 Docker pull 获取的镜像无需执行 docker load;通过从页面下载或 wget 获取 SDK 离线包后,执行以下命令导入镜像:

      docker load < maca-native-<VERSION>-<DISTRO>-<ARCH>.container.xz
      

      无论通过 Docker 直接拉取还是从离线包导入,均可执行以下命令,将 MXMACA® SDK 镜像推送到私有镜像仓库。其中, <MACA-IMAGE> 为 Docker 拉取或导入后的完整镜像名称。

      # 给镜像重新打tag
      docker tag <MACA-IMAGE> <DOMAIN/PROJECT/MACA-IMAGE>
      
      # 推送镜像到仓库
      docker push <DOMAIN/PROJECT/MACA-IMAGE>
      

    备注

    • 自 0.13.0 起,镜像资源包(例如本节使用的 metax-k8s-images.0.13.0.run)支持多种运行时:docker、nerdctl、ctr。

    • 使用镜像资源包推送核心组件镜像时,若未显式指定运行时,默认使用docker。若主机未安装 docker,该工具将自动检测可用运行时并执行镜像推送。

    • 若远程registry为http协议registry,push方式参见《沐曦通用GPU云原生参考手册》中“支持”章节。

  4. 推送 Helm Charts

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

6.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"
    }
    

6.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

备注

实例超额分配目前仅支持单卡任务分配。

6.1.4. 提交任务

在 Kubernetes 管理节点执行以下命令提交任务。

kubectl create -f sample.yaml

6.1.5. 检查调度结果

在 Kubernetes 管理节点执行以下命令检查任务的调度节点。

kubectl get pod -owide
NAME                        READY   STATUS      RESTARTS   AGE   NODE
sample-pod                  1/1     Running     0          31s   shared-gpu-node