# NPU整卡调度
NPU整卡调度是指在调度NPU资源时，以NPU芯卡为单位进行资源分配的调度策略。每个Pod在运行时会独占一个或多个完整的NPU芯片，不会与其他任务共享NPU芯片的计算资源。使用NPU整卡调度存在以下优势：
- 性能稳定：独占整个物理NPU芯片，可以有效避免多任务竞争带来的资源抖动，保障模型训练/推理的稳定性和一致性。
- 提升训练效率：对于大规模模型或计算密集型任务，整卡调度可以避免上下文切换和带宽干扰，从而提升训练效率和吞吐能力。
本文将进一步为您介绍如何使用NPU整卡调度。
#### 注意事项
在集群中使用Kubernetes默认NPU调度时，需要遵循本文中标准的K8s扩展资源申请方式使用NPU资源，具体注意事项如下：
- 请勿直接在节点上运行使用NPU资源的应用程序。
- 请勿直接在NPU节点上通过docker、podman、nerdctl等容器工具单独创建容器来运行NPU业务。
- 在Pod的securityContext中配置privileged: true后，容器可访问节点上所有NPU，可能影响同节点其他容器使用。
上述非标操作可能带来以下隐患：
- 调度器无法精确掌握每个节点的NPU使用情况，任务可能会被调度到资源已用满的节点，出现资源争抢、运行失败的情况。
 
#### 前提条件
- 已创建NPU类型节点，具体请参见[创建节点](https://support.huaweicloud.com/usermanual-cce/cce_10_0363.html)。
- 已安装CCE AI套件（Ascend NPU）插件，具体请参见[CCE AI套件（Ascend NPU）](https://support.huaweicloud.com/usermanual-cce/cce_10_0239.html)。
 
#### 创建NPU整卡调度工作负载
创建NPU整卡调度工作负载时，支持使用控制台和kubectl命令行的方式，具体如下：
- [控制台方式]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。在左侧导航栏单击"工作负载"，右上角单击"创建工作负载"。
  
  2. 在"容器配置 \> 基本信息 \>NPU配额"中选择"整卡调度"。选择"整卡调度"后，请在下方选择申请的芯片类型和个数，系统将根据该信息为容器分配对应NPU资源。 
     图1NPU整卡调度   
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002649034078.png "点击放大")
     
     
     
  
  3. 其他参数请参考[创建工作负载](https://support.huaweicloud.com/usermanual-cce/cce_10_0673.html)进行配置，参数配置完成后，在右下角单击"创建工作负载"。待工作负载变为运行中后，则表示创建成功。
   
- [kubectl命令行方式]
  1. 使用kubectl连接集群。
  
  2. 执行以下命令，创建YAML文件，用于创建一个使用NPU整卡调度的工作负载。 
     ```
     vim npu-app.yaml
     ```
     文件内容如下：
     ```
     kind: Deployment
     apiVersion: apps/v1
     metadata:
       name: npu-test
       namespace: default
     spec:
       replicas: 1
       selector:
         matchLabels:
           app: npu-test
       template:
         metadata:
           labels:
             app: npu-test
         spec:
           nodeSelector:      # 可选参数，指定该参数后，可为当前负载绑定特定类型的NPU资源，使Pod调度至具备相应资源的节点
             accelerator/huawei-npu: ascend-310
           containers:
             - name: container-0
               image: nginx:perl
               env:
               - name: LD_LIBRARY_PATH  # 配置环境变量，用于指定动态链接库的搜索路径，确保在运行与NPU相关的应用时，系统能够正确加载所需的动态库文件。
                 value: "/usr/local/HiAI/driver/lib64:/usr/local/Ascend/driver/lib64/common:/usr/local/Ascend/driver/lib64/driver:/usr/local/Ascend/driver/lib64"
               resources:
                 limits:
                   cpu: 250m
                   huawei.com/ascend-310: '1' 
                   memory: 512Mi
                 requests:
                   cpu: 250m
                   huawei.com/ascend-310: '1'
                   memory: 512Mi        
           imagePullSecrets:
           - name: default-secret
     ```
     - nodeSelector：可选参数，表示节点选择器。指定该参数后，可为当前负载绑定特定类型的NPU资源，使Pod调度至具备相应资源的节点。若未指定，系统将自动为Pod分配可用的NPU节点。 您可以通过以下命令查询节点的标签：
       ```
       kubectl get node -L accelerator/huawei-npu
       ```
       回显结果如下，加粗部分即为对应标签值：
       ```
       NAME           STATUS   ROLES    AGE     VERSION                                    HUAWEI-NPU
       10.100.2.59    Ready    <none>   2m18s   v1.19.10-r0-CCE21.11.1.B006-21.11.1.B006   ascend-310
       ```
       
     
     - 容器支持选择以下类型NPU芯片。如YAML文件所示，您可以在resources.limits中指定对应的芯片类型和芯片个数，芯片个数必须为正整数。
       - 昇腾Snt3：由**huawei.com/ascend-310**字段表示。
       
       - 昇腾Snt9：由**huawei.com/ascend-1980** 字段表示，使用该类型芯片时需提前安装Volcano插件，具体请参见[Volcano调度器](https://support.huaweicloud.com/usermanual-cce/cce_10_0193.html)。
         ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
         指定NPU芯片数量时，requests和limits值需要保持一致。
         
        
     
     
     
     
  
  3. 执行以下命令，创建工作负载。 
     ```
     kubectl apply -f npu-app.yaml
     ```
     回显结果如下，则说明工作负载已创建。
     ```
     deployment.apps/npu-test created
     ```
     
     
  
  4. 执行以下命令，查看已创建的Pod名称。 
     ```
     kubectl get pod -n default
     ```
     回显结果如下：
     ```
     NAME                      READY   STATUS    RESTARTS   AGE
     npu-test-6bdb4d7cb-pmtc2   1/1     Running   0          21s
     ```
     
     
  
  5. 执行以下命令，登录容器内部。 
     ```
     kubectl -n default exec -it npu-test-6bdb4d7cb-pmtc2 -c container-0 -- /bin/bash
     ```
     
     
  
  6. 在容器内执行以下命令，查看NPU是否分配成功。 
     ```
     npu-smi info
     ```
     由回显结果可知，该容器已挂载Chip ID为13的NPU芯片**。**
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002357588609.png "点击放大")
     
     
   
#### NPU故障隔离
CCE AI套件（Ascend NPU）插件支持检测NPU卡的健康状态。当设备处于不健康状态时，插件会将设备健康状态上报至Kubelet，Kubelet会自动将不健康设备从可用列表中剔除，对应的NPU资源将无法被调度。当设备恢复健康状态时，插件会重新上报健康状态，使设备在CCE中恢复可用。
#### 相关文档
- 如果需要使用NPU虚拟化功能，请参见[NPU静态虚拟化](https://support.huaweicloud.com/usermanual-cce/cce_10_1008.html)。
- 如果需要对NPU指标进行监控，请参见[NPU监控](https://support.huaweicloud.com/usermanual-cce/cce_10_1018.html)。
 
