# MOFFETT Device Plugin 用户手册 MOFFETT Device Plugin 基于 Kubernetes 设备插件框架实现,用于将墨芯 SPU 设备资源注册到 Kubelet。该组件以 DaemonSet 的形式部署,可以在 Kubernetes 集群的各个节点注册墨芯 SPU 设备,跟踪 SPU 设备状态,并运行支持 SPU 设备的容器。 ```{admonition} 须知 :class: note Device Plugin 可单独部署或通过 SPU Operator 统一部署,任选一种方式以避免冲突。通过 SPU Operator 部署的详细操作请参见 [MOFFETT SPU Operator 用户手册](./k8s-spu-operator.md)。 ``` ## 部署 Device Plugin ### 前提条件 - 安装 SOLA Toolkit,具体请参见 [SOLA Toolkit 安装指南](../installation/sola-toolkit-installation-guide.md)。 - 部署可用的 Kubernetes 集群 ≥ 1.10,具体请参见 使用部署工具安装 Kubernetes。如需使用 CDI 功能,Kubernetes 集群 ≥ 1.28。 - 安装 Kubernetes 命令行工具 `kubectl`,具体请参见 安装工具 - kubectl。 - 安装容器运行时,具体请参见容器运行时。 ### 操作步骤 1. 选择以下任一方式获取 Device Plugin 容器镜像。 - 在线拉取 ````{tabs} ```{tab} S4/S30/S40/S40AC ```bash docker pull moffett/k8s-device-plugin:v0.3.0 ``` ```{tab} S40Lite ```bash docker pull moffett/k8s-device-plugin:v0.3.0-lite ``` ```` - 离线导入 ````{tabs} ```{tab} S4/S30/S40/S40AC ```bash wget https://moffett-oss-bucket.tos-cn-shanghai.volces.com/macs/v1.11/device-plugin/moffett-k8s-device-plugin-v0.3.0.tar docker load -i moffett-k8s-device-plugin-v0.3.0.tar ``` ```{tab} S40Lite ```bash wget https://moffett-oss-bucket.tos-cn-shanghai.volces.com/macs/v1.11/device-plugin/moffett-k8s-device-plugin_v0.3.0-lite.tar docker load -i moffett-k8s-device-plugin-v0.3.0-lite.tar ``` ```` 2. 创建 `moffett-device-plugin.yaml` 部署文件。 ```{admonition} 须知 :class: note 以下配置适用于 S4/S30/S40/S40AC 计算卡。使用 S40Lite 计算卡时,请使用容器镜像 `moffett/k8s-device-plugin:v0.3.0-lite`。 ``` ```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.3.0 # 使用 S40Lite 计算卡时,请使用:moffett/k8s-device-plugin:v0.3.0-lite 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。 ```bash kubectl create -f moffett-device-plugin.yml ``` 4. 查看 Device Plugin 部署状态。 ```bash 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。 ```yaml 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。 ```bash kubectl create -f mx-qual-list.yml ``` 3. 查看 Pod 状态。 ```bash kubectl get pod qual-list-pod ``` ```bash # STATUS = Completed 表示任务已完成 NAME READY STATUS RESTARTS AGE qual-list-pod 0/1 Completed 0 11m ``` 4. 查看 Pod 日志中 `mx-qual list` 命令运行的结果。 ```bash kubectl logs qual-list-pod ``` 5. 删除 Pod。 ```bash kubectl delete pod qual-list-pod ``` ## 卸载 Device Plugin ````{tabs} ```{tab} 通过部署文件卸载 ```bash kubectl delete -f moffett-device-plugin.yml ``` ```{tab} 通过资源名称卸载 ```bash kubectl delete daemonset moffett-device-plugin-daemonset -n kube-system ``` ```` ## 更新 SOLA Toolkit 时停用节点上的 Device Plugin 当更新 SOLA Toolkit 时,Device Plugin 服务会影响 SOLA Toolkit 卸载,需通过以下步骤在指定节点停用 Device Plugin: 1. 查询集群中部署的 Device Plugin 所有 Pod 的详细信息。 ```bash kubectl get pod -l name=moffett-device-plugin-ds -n kube-system -o wide ``` 2. 为集群的指定节点添加污点(Taint)并删除该节点上 Device Plugin 相关 Pod。 ```bash kubectl taint nodes NeedFix=true:NoSchedule # 为指定节点添加 Taint,标记为不可调度 kubectl describe node | grep Taints # 验证节点 Taint 是否生效 kubectl get pod -n kube-system -o wide # 查看指定节点上的 Pod 信息 kubectl delete pod -n kube-system # 删除指定节点上 Device Plugin 的 Pod ``` 3. 当 SOLA Toolkit 更新完成后,如需 Kubernetes 重新调度 Device Plugin 的 Pod,移除 Taint。 ```bash kubectl taint nodes NeedFix=true:NoSchedule- ```