常见问题

安装或卸载 SOLA-toolkit 时,moffett 模块被占用

现象

rmmod: ERROR: Module moffett is in use
Error, uninstall moffett driver fail

处理步骤

  1. 查看是否有进程占用设备。

    mx-smi list  
    
  2. 查看打开的文件及进程。

    sudo lsof | grep mf- 
    
  3. 结束正在运行的用卡任务/进程。

    kill -9 <process_id>
    
  4. 检查 moffett 的系统 module 的个数是否为 0。

    lsmod | grep moffett
    moffett               278528  1
    
  5. 移除已加载的 moffett 系统 module。

    sudo rmmod moffett
    
  6. 重试尝试卸载 SOLA Toolkit,若仍无法正常安装或卸载 SOLA Toolkit,请重启服务器后再次卸载。

卸载 SOLA Toolkit 时提示被占用

现象

There is a program in use and can not be uninstalled. Please try again later.

处理步骤

  1. 检查并结束占用设备的进程。

    mx-smi list  
    
  2. 检查是否有 DCSM、MOFFETT Device Plugin、DCSM Exporter 服务在运行,如果服务在运行,停止相应服务。

    • MOFFETT Device Plugin 使用设备场景

      # 查询 Kubernetes 中是否部署 MOFFETT Device Plugin
      kubectl get pods -l name=moffett-device-plugin-ds -n kube-system -o wide
      
      # Kubernetes 中卸载 MOFFETT Device Plugin
      kubectl delete daemonset moffett-device-plugin-daemonset -n kube-system
      
      # 只驱逐特定节点上的 MOFFETT Device Plugin,为该节点添加 Taint,避免调度器启动新的 DaemonSet
      kubectl taint nodes <node_name> NeedFix=true:NoSchedule
      kubectl describe node <node_name> | grep Taints 
      kubectl delete pod -l name=moffett-device-plugin-ds -n kube-system --field-selector spec.nodeName= <node_name>
      kubectl get pod -n kube-system -o wide
      
      # 移除 Taint,让 Kubernetes 重新调度
      kubectl taint nodes <node_name> NeedFix=true:NoSchedule-
      
    • DCSM 使用设备场景

      # 查询 mx-hostengine 是否正在运行
      ps -ef | grep mx-hostengine
      
      # 查询是否以 systemd service 的方式启动
      systemctl status dcsm
      
      # 暂停 DCSM 服务
      sudo systemctl stop dcsm
      
      # 若涉及系统重启的操作,避免 DCSM 开机自启,停止并禁止 DCSM 开机自启
      # 非 systemd service 启动的 mx-hostengine,可以通过 kill 命令终止进程
      sudo systemctl --now disable dcsm
      
    • DCSM Exporter 使用设备场景

      • 解决方案一:通过标记节点为 Taint

        # 检查是否单机容器化启动,以 docker 为例
        docker ps | grep dcsm-exporter
        
        # 使用 docker stop 命令停掉 DCSM exporter 容器
        # 查询集群中是否部署 DCSM exporter
        kubectl get pods -l app.kubernetes.io/name=dcsm-exporter -n moffett-monitoring -o wide
        
        # 集群中卸载 DCSM exporter
        kubectl delete daemonset dcsm-exporter -n moffett-monitoring
        
        # 只驱逐特定节点 <node_name> 上的 DCSM exporter,为该节点添加 Taint,避免调度器启动新的 DaemonSet
        kubectl taint nodes <node_name> NeedFix=true:NoSchedule
        kubectl describe node <node_name> |grep Taints
        kubectl delete pod -l app.kubernetes.io/name=dcsm-exporter -n moffett-monitoring --field-selector spec.nodeName= <node_name>
        kubectl get pod -n moffett-monitoring -o wide
        
        # 移除 Taint,让 Kubernetes 重新调度
        kubectl taint nodes <node_name> NeedFix=true:NoSchedule-
        
      • 解决方案二:通过节点亲和性

        如果需要仅删除某个节点上的 dcsm-exporter 而不影响集群中其他服务,可通过给节点添加 Taint 的方式。推荐使用通过添加给节点打特殊标签并使用 nodeSelector 方式。

        a. 给需要移除 dcsm-exporter 的节点打标签。

        # <node_name> 替换为实际节点名称       
        kubectl label node <node_name> dcsm-exporter-disabled=true    
        

        b. 查看标签。

        # <node_name> 替换为实际节点名称  
        kubectl get nodes --show-labels |grep <node_name>  
        

        c. 在 dcsm-exporter.yaml 文件 spec 中添加如下配置:

        affinity:
           nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                 - key: dcsm-exporter-disabled
                    operator: NotIn
                    values:
                    - "true"
        

        d. 更新 DCSM Exporter 的 DaemonSet 配置。

        kubectl apply -f dcsm-exporter.yaml
        

        e. 检查目标节点上的 dcsm-exporter Pod 是否被删除。

        kubectl get pods -o wide -n moffett-monitoring
        

        f. 恢复该节点运行 dcsm-exporter,删除标签即可。

        kubectl label node <node_name> dcsm-exporter-disabled-
        

设备节点或 SOLA Toolkit 版本变更后,使用 MOFFETT Container Toolkit 报错

现象

docker run --rm -ti --device moffett.ai/spu=all ubuntu:22.04 mx-smi
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: failed to fulfil mount request: open /usr/local/sola-3.8.1.2/lib/libsola.so: no such file or directory: unknown.

原因

MOFFETT Container Toolkit 的安装配置时间早于设备或驱动库软件的版本变更时间,因此它仍沿用了旧的静态配置。

处理步骤

当容器中的设备节点或 SOLA Toolkit 版本发生变化时,执行以下命令重新生成 CDI 配置文件:

sudo moffett-ctk cdi generate --output=/etc/cdi/moffett.yaml