
# 自动实现NPU静态虚拟化
在CCE中，通过CCE AI套件（Ascend NPU）插件的ascend-vnpu-manager组件可以实现节点池粒度的NPU静态虚拟化，以生成虚拟NPU（vNPU），从而实现资源的高效利用。启用NPU虚拟化功能后，系统会根据配置中指定的模板，对节点池内的NPU芯片进行自动切分，从而实现标准化、批量化的虚拟化部署。
#### 前提条件
- 集群中已安装CCE AI套件（Ascend NPU）插件，且版本在2.1.63以上，具体安装步骤请参见[CCE AI套件（Ascend NPU）](https://support.huaweicloud.com/usermanual-cce/cce_10_0239.html)。
- NPU节点上已安装NPU驱动，且驱动版本在23.0.1及以上。
  ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/caution_3.0-zh-cn.png)
  - 驱动升级时要求节点上有配套的NPU固件，**重新安装驱动将涉及节点重启** ，建议在安装驱动前排空节点，具体操作请参见[节点排水](https://support.huaweicloud.com/usermanual-cce/cce_10_0605.html)。虚拟机不支持固件升级。
  
  - 驱动升级时，如需在操作系统范围内为所有用户安装驱动，请配合使用--install-for-all参数，例如./Ascend-hdk-310p-npu-driver_*x.x.x* _linux-*{arch}*.run --full --install-for-all。
  
  - 如果驱动升级失败，请查看文档"常见问题 \> 模板插件 \> NPU驱动升级失败如何解决？"。
    
 
#### 约束与限制
仅Snt3P3芯片支持通过ascend-vnpu-manager实现静态虚拟化。其他型号需通过手动方式实现算力切分，详情请参见[手动实现NPU静态虚拟化](https://support.huaweicloud.com/usermanual-cce/cce_10_0994.html)。各芯片类型对算力切分的支持情况，请参见[虚拟化特性说明](https://www.hiascend.com/document/detail/zh/mindcluster/71RC1/clustersched/dlug/cpaug_0010.html)。
 #### 配置NPU静态虚拟化
开启NPU算力切分静态虚拟化功能前，需要将对应节点池中的NPU负载排空，具体请参见[节点排水](https://support.huaweicloud.com/usermanual-cce/cce_10_0605.html)。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群，在左侧选择"配置中心"。
2. 切换至"异构资源配置"页签，开启NPU静态虚拟化，仅支持配置节点池级别的NPU静态虚拟化。
3. 在NPU静态虚拟化配置中单击"添加"，并配置以下参数。参数配置完成后，系统将根据"虚拟化实例组合"对节点池中的NPU芯片进行自动切分。 
   ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
   某条配置删除后，不会触发对应节点上的管理动作，只有在虚拟化实例组合新增和更改的时候才会触发。即删除某条配置后，该节点池的vNPU资源配置并未消失，需要在虚拟化实例组合更换为all-disabled才能将该节点的vNPU配置删除。
   表1NPU虚拟化配置 
   | 参数      | 说明                                                                                                                                                                                                                                                                                                                                                             |
   |:---|:---|
   | 节点池     | 请选择需要虚拟化的节点池，暂不支持对default节点池进行配置。                                                                                                                                                                                                                                                                                                                              |
   | 芯片类型    | 请选择需要进行虚拟化的芯片类型，目前仅支持对昇腾Snt3P3和昇腾Snt9B3类型的芯片进行虚拟化。                                                                                                                                                                                                                                                                                                             |
   | 虚拟化实例组合 | CCE已提供多种NPU虚拟化模板组合，可以根据需求选择不同的组合，以满足使用要求。**进行节点池的虚拟化实例组合的更改前，请先将对应节点池中的NPU与vNPU负载排空。** 将鼠标悬浮于组合名称之上，可以查看对应的模板名称和数量等信息。例如，all-disabled表示不进行NPU虚拟化，all-7vir01表示将节点池中的对应类型的NPU芯片皆切分成7个模板为vir01的vNPU。关于NPU虚拟化模板的更多信息，请参见[NPU虚拟化模板](https://support.huaweicloud.com/usermanual-cce/cce_10_1009.html#cce_10_1009__section587384103019)。 |
      
   如果您需要为多个节点池和NPU芯片配置NPU算力切分，请单击"添加"，继续添加。
   
   
4. 上述配置完成后，在页面右下角单击"确认配置"。在"确认配置"的弹窗中，单击"保存"。保存后，CCE AI套件（Ascend NPU）插件将自动在符合条件的节点中部署ascend-vnpu-manager组件。该组件将自动监听global-vnpu-configs（ConfigMap）的内容变化，并根据内容触发vNPU管理动作。
5. NPU静态虚拟化配置完成后，您可以通过ascend-vnpu-manager的日志验证NPU算力切分是否配置成功。 
   在左侧导航栏中选择"插件中心"，在右侧找到CCE AI套件（Ascend NPU）插件，单击"插件详情"，切换至"实例列表"，找到对应节点的ascend-vnpu-manager的Pod实例。在右侧操作列单击"更多 \> 日志"。
   - 若日志中存在以下信息，则说明当前节点NPU虚拟化配置成功。
     图1验证NPU虚拟化是否成功   
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002313211073.png "点击放大") 
   
   - 若日志中存在"Error: error applying VNPU configuration: failed to apply func on device1, err: NPU1 has VNPU in use ..."等信息，则说明节点已存在NPU负载或vNPU负载，NPU虚拟化无法配置，您可以通过以下方式进行解决： 在对应节点中清空NPU负载或vNPU负载后，删除对应的ascend-vnpu-manager的Pod实例。待该ascend-vnpu-manager的Pod实例重启且状态变为运行中后，当前节点的NPU虚拟化功能将正常使用。
     
   
   
   
   
 
#### 使用vNPU
您可以采取两种方式为容器指定vNPU资源，即控制台方式和kubectl命令行方式。
- [控制台方式]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。在左侧导航栏单击"工作负载"，右上角单击"创建工作负载"。
  
  2. 在"容器配置 \> 基本信息 \>NPU配额"中选择算力拆分，在虚拟化模板的下拉列表中选择需要的虚拟化模板。此处虚拟化模板名称为"Ascend-芯片类型-虚拟化实例模板"，例如ascend-310-vir01表示昇腾Snt3芯片中以vir01为模板的vNPU。选择模板后，CCE将按照虚拟化模板为容器分配vNPU资源。 
     表2虚拟化模板 
     | 参数    | 说明                                                                                                                                                                                                                                                                                                                                                                                                                        |
     |:---|:---|
     | 虚拟化模板 | 提供已配置模板和未配置模板，具体如下： - 已配置：在"配置中心 \> 异构资源配置"中已配置的虚拟化模板，可以直接使用。  - 未配置：在"配置中心 \> 异构资源配置"中暂未配置的虚拟化模板，无法直接使用。如果选择未配置模板，工作负载将因资源不足而创建失败。此时，请在"NPU虚拟化配置 "中配置相关模板，具体操作请参见[配置NPU静态虚拟化]。配置完成后，该负载将自动调度成功。   |
        
     
     
  
  3. 其他参数请参考[创建工作负载](https://support.huaweicloud.com/usermanual-cce/cce_10_0673.html)进行配置。参数配置完成后，在右下角单击"创建工作负载"。待工作负载变为运行中后，则表示创建成功。
   
- [kubectl命令行方式]
  在创建vNPU之后，工作负载可以通过YAML格式申请vNPU资源，从而实现资源的高效管理和灵活配置。如果需要使用Volcano调度器，则需要安装1.12.1及以上版本的Volcano调度器插件。
  1. 依次执行以下命令，创建工作负载，并申请一个vir02模板的vNPU资源。 
     1. 执行以下命令，创建名为vnpu-worker的YAML文件。
        ```
        vim vnpu-worker.yaml
        ```
        文件内容如下，**容器中只支持申请NPU资源或者vNPU资源，二者不可以同时使用**。
        ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
        使用vNPU资源时，需确保该vNPU资源已存在。如果该vNPU资源未创建，则会报错，例如"0/2 nodes are available: 2 Insufficient huawei.com/ascend-310-2c"。
        ```
        kind: Deployment
        apiVersion: apps/v1
        metadata:
          name: vnpu-test
          namespace: default
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: vnpu-test
          template:
            metadata:
              labels:
                app: vnpu-test
            spec:
              schedulerName: kube-scheduler    # 该工作负载需要使用volcano调度器时，则需要安装volcano插件，且版本在1.12.1及以上
              containers:
                - name: container-0
                  image: nginx:latest
                  resources:
                    limits:
                      cpu: 250m
                      huawei.com/ascend-310-2c: '1'   # 表示申请的vNPU资源，固定为1
                      memory: 512Mi
                    requests:
                      cpu: 250m
                      huawei.com/ascend-310-2c: '1'   # 固定为1
                      memory: 512Mi
        ```
        - 容器只支持申请一个vNPU资源，因此requests和limits里的vNPU资源数量固定为1。
        
        - 指定的vNPU资源请在节点中提前创建，且保证资源充足。当vNPU资源不足时，会出现类似"0/2 nodes are available: 2 Insufficient huawei.com/ascend-310-2c."的报错。
        
        - huawei.com/ascend-310-2c表示申请vNPU资源名称，不同产品和模板对应的vNPU资源名称不同，具体映射关系如下：
          表3vNPU资源名称 
          | **产品类型**                                                                                                   | **虚拟化模板**      | **vNPU资源名称**                        |
          |:---|:---|:---|
          | Atlas推理系列产品（8个AI Core）       | vir01          | huawei.com/ascend-310-1c            |
          | Atlas推理系列产品（8个AI Core）       | vir02          | huawei.com/ascend-310-2c            |
          | Atlas推理系列产品（8个AI Core）       | vir02_1c       | huawei.com/ascend-310-2c.1cpu       |
          | Atlas推理系列产品（8个AI Core）       | vir04          | huawei.com/ascend-310-4c            |
          | Atlas推理系列产品（8个AI Core）       | vir04_3c       | huawei.com/ascend-310-4c.3cpu       |
          | Atlas推理系列产品（8个AI Core）       | vir04_3c_ndvpp | huawei.com/ascend-310-4c.3cpu.ndvpp |
          | Atlas推理系列产品（8个AI Core）       | vir04_4c_dvpp  | huawei.com/ascend-310-4c.4cpu.dvpp  |
          | Ascend训练系列产品（30或32个AI Core）                    | vir16          | huawei.com/ascend-1980-16c          |
          | Ascend训练系列产品（30或32个AI Core）                    | vir08          | huawei.com/ascend-1980-8c           |
          | Ascend训练系列产品（30或32个AI Core）                    | vir04          | huawei.com/ascend-1980-4c           |
          | Ascend训练系列产品（30或32个AI Core）                    | vir02          | huawei.com/ascend-1980-2c           |
          | Ascend训练系列产品（30或32个AI Core）                    | vir10_3c_32g   | huawei.com/ascend-1980-10c.3cpu.32g |
          | Ascend训练系列产品（30或32个AI Core）                    | vir05_1c_16g   | huawei.com/ascend-1980-5c.1cpu.16g  |
             
          
         
     
     2. 执行以下命令，创建上述工作负载。
        ```
        kubectl apply -f vnpu-worker.yaml
        ```
        回显结果如下：
        ```
        deployment/vnpu-test created
        ```
        
     
     3. 执行以下命令，查看Pod是否运行成功。
        ```
        kubectl get pod | grep vnpu-test
        ```
        回显结果如下，则说明工作负载中的Pod运行成功。
        ```
        vnpu-test-6658cd795b-rx76t      1/1     Running     0       59m
        ```
        
     
     
     
     
  
  2. 执行以下命令，登录容器内部。 
     ```
     kubectl -n default exec -it vnpu-test-6658cd795b-rx76t -c container-0 -- /bin/bash
     ```
     
     
  
  3. 在容器内依次执行以下命令，查看vNPU是否挂载成功。 
     1. 执行以下命令，配置环境变量，用于指定动态链接库的搜索路径，确保在运行与NPU相关的应用时，系统能够正确加载所需的动态库文件。
        ```
        export LD_LIBRARY_PATH=/usr/local/HiAI/driver/lib64:/usr/local/Ascend/driver/lib64/common:/usr/local/Ascend/driver/lib64/driver:/usr/local/Ascend/driver/lib64
        ```
        
     
     2. 执行以下命令，查看容器挂载的NPU信息，以确认是否成功挂载vNPU资源。
        ```
        npu-smi info
        ```
        由回显结果可知，该容器已挂载设备ID为104的NPU卡中的vNPU，且虚拟化模板为vir02**。**
        ```
        +--------------------------------------------------------------------------------------------------------+
        | npu-smi 24.1.rc2.3                               Version: 24.1.rc2.3                                   |
        +-------------------------------+-----------------+------------------------------------------------------+
        | NPU     Name                  | Health          | Power(W)     Temp(C)           Hugepages-Usage(page) |
        | Chip    Device                | Bus-Id          | AICore(%)    Memory-Usage(MB)                        |
        +===============================+=================+======================================================+
        | 104     xxx             | OK              | NA           54                0     / 0             |
        | 0       0                     | 0000:00:0D.0    | 0            445  / 5381                             |
        +===============================+=================+======================================================+
        +-------------------------------+-----------------+------------------------------------------------------+
        | NPU     Chip                  | Process id      | Process name             | Process memory(MB)        |
        +===============================+=================+======================================================+
        | No running processes found in NPU 104                                                                  |
        +===============================+=================+======================================================+
        ```
        
     
     
     
     
   
#### 关闭NPU静态虚拟化
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群，在左侧选择"配置中心"，切换至"异构资源配置"页签。
2. 对已启用NPU虚拟化的节点执行vNPU负载排空操作，具体请参见[节点排水](https://support.huaweicloud.com/usermanual-cce/cce_10_0605.html)。
3. 在NPU静态虚拟化中，将所有节点池的虚拟化实例组合设置为"all-disabled"，右下角单击"确认配置"。在"确认配置"的弹窗中，单击"保存"。此时，系统将自动清除节点上的NPU虚拟化实例。
4. 在"异构资源配置"页签，关闭NPU静态虚拟化。在弹窗中单击"确定"，并在右下角单击"确认配置"。在"确认配置"的弹窗中，单击"保存"。此时，系统将清除已有的算力切分配置，并自动删除ascend-vnpu-manager的Pod实例。
 
#### 相关文档
如果需要对NPU相关指标进行监控，请参见[NPU监控](https://support.huaweicloud.com/usermanual-cce/cce_10_1018.html)。
