MOFFETT Device Plugin 用户手册

MOFFETT Device Plugin 基于 Kubernetes 设备插件框架实现,以 DaemonSet 形式部署,向 Kubelet 注册稀疏处理单元 SPU(Sparse Processing Unit)设备资源并跟踪设备状态,支持工作负载申请和使用 SPU 设备。其容器镜像同时包含 SPU Feature Discovery(SFD)。

须知

Device Plugin 仅用于 Kubernetes 环境,可通过 SPU Operator 统一部署(推荐),或按照本文单独部署。同一环境中两种方式任选其一,避免重复部署。SFD 仅支持通过 SPU Operator 部署。

部署 Device Plugin

前提条件

操作步骤

  1. 选择以下任一方式获取 Device Plugin 容器镜像。

    • 在线拉取

      docker pull moffett/k8s-device-plugin:v0.4.0
      
    • 离线导入

      wget https://moffett-oss-bucket.tos-cn-shanghai.volces.com/macs/v1.14/device-plugin/moffett-k8s-device-plugin-v0.4.0.tar
      docker load -i moffett-k8s-device-plugin-v0.4.0.tar
      
  2. 创建 moffett-device-plugin.yaml 部署文件。

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: moffett-device-plugin-daemonset
      namespace: kube-system
    spec:
      selector:
        matchLabels:
          name: moffett-device-plugin-ds
      updateStrategy:
        type: RollingUpdate
      template:
        metadata:
          labels:
            name: moffett-device-plugin-ds
        spec:
          tolerations:
          - key: moffett.ai/spu
            operator: Exists
            effect: NoSchedule
          priorityClassName: "system-node-critical"
          containers:
          - image: moffett/k8s-device-plugin:v0.4.0
            name: moffett-device-plugin-ctr
            securityContext:
              privileged: true
            volumeMounts:
            - name: device-plugin
              mountPath: /var/lib/kubelet/device-plugins
          volumes:
          - name: device-plugin
            hostPath:
              path: /var/lib/kubelet/device-plugins
    
  3. 部署 Device Plugin。

    kubectl create -f moffett-device-plugin.yaml
    
  4. 查看 Device Plugin 部署状态。

    kubectl get pod -n kube-system -l name=moffett-device-plugin-ds # STATUS = Running(READY = 1/1)表示 Pod 正常启动
    

运行示例

以下示例基于 Docker 容器运行时。

  1. 创建 Pod 配置文件 mx-qual-list.yml,定义请求 2 个 SPU 设备并执行 mx-qual list 命令的 Pod。

    apiVersion: v1
    kind: Pod
    metadata:
      name: qual-list-pod
    spec:
      restartPolicy: Never
      containers:
      - name: sola-container
        image: moffett/macs-base:sola-3.12.0 # 自定义镜像,包含 SOLA Toolkit 3.12.0 版本
        args: ['mx-qual', 'list'] # 容器启动参数,即运行 mx-qual list 命令
        resources:
          requests:
            moffett.ai/spu: 2 # 申请使用 2 个 device
          limits:
            moffett.ai/spu: 2 # 限制最多使用 2 个 device
      tolerations:
      - key: moffett.ai/spu
        operator: Exists
        effect: NoSchedule
    
  2. 创建并运行 Pod。

    kubectl create -f mx-qual-list.yml
    
  3. 查看 Pod 状态。

    kubectl get pod qual-list-pod
    
    # STATUS = Completed 表示任务已完成
    NAME            READY   STATUS      RESTARTS   AGE
    qual-list-pod   0/1     Completed   0          11m
    
  4. 查看 Pod 日志中 mx-qual list 命令运行的结果。

    kubectl logs qual-list-pod
    
  5. 删除 Pod。

    kubectl delete pod qual-list-pod
    

卸载 Device Plugin

kubectl delete -f moffett-device-plugin.yaml

更新 SOLA Toolkit 时停用节点上的 Device Plugin

当更新 SOLA Toolkit 时,Device Plugin 服务会影响 SOLA Toolkit 卸载,需通过以下步骤在指定节点停用 Device Plugin:

  1. 查询集群中部署的 Device Plugin 所有 Pod 的详细信息。

    kubectl get pod -l name=moffett-device-plugin-ds -n kube-system -o wide
    
  2. 为集群的指定节点添加污点(Taint)并删除该节点上 Device Plugin 相关 Pod。

    kubectl taint nodes <node_name> NeedFix=true:NoSchedule   # 为指定节点添加 Taint,标记为不可调度
    kubectl describe node <node_name> | grep Taints           # 验证节点 Taint 是否生效
    kubectl get pod -n kube-system -o wide                    # 查看指定节点上的 Pod 信息
    kubectl delete pod <pod_name> -n kube-system              # 删除指定节点上 Device Plugin 的 Pod
    
  3. 当 SOLA Toolkit 更新完成后,如需 Kubernetes 重新调度 Device Plugin 的 Pod,移除 Taint。

    kubectl taint nodes <node_name> NeedFix=true:NoSchedule-