
# 使用GPU虚拟化
本文介绍如何使用GPU虚拟化能力实现算力和显存隔离，高效利用GPU设备资源。
#### 前提条件
- 已完成[GPU虚拟化资源准备](https://support.huaweicloud.com/usermanual-cce/cce_10_0645.html)。
- 如果您需要通过命令行创建，需要使用kubectl连接到集群，详情请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
 
#### 约束与限制
- 单个GPU卡最多虚拟化成20个GPU虚拟设备。
- init容器不支持使用GPU虚拟化资源。
- GPU虚拟化支持显存隔离、显存与算力隔离两种隔离模式。单个GPU卡仅支持调度同一种隔离模式的工作负载。
- v1.26及以下的集群中，使用GPU虚拟化后，不支持使用Autoscaler插件自动扩缩容GPU虚拟化节点。
- GPU虚拟化服务的隔离功能不支持以UVM的方式申请显存，即调用CUDA API cudaMallocManaged()，更多信息，请参见[NVIDIA官方文档](https://developer.nvidia.com/blog/unified-memory-cuda-beginners/)。请使用其他方式申请显存，例如调用cudaMalloc()等。
- 受GPU虚拟化技术的限制，容器内应用程序初始化时，通过nvidia-smi监测工具监测到的实时算力可能超过容器可用的算力上限。
- 受GPU虚拟化技术的限制，GPU虚拟化的算显隔离功能在渲染场景无法使用，渲染场景请使用整卡模式或显存隔离模式。
- 节点上开启了GPU虚拟化且有多张GPU卡时，如果GPU资源不足，不支持抢占其他Pod的GPU资源。
 
#### 创建GPU虚拟化应用
**通过控制台创建**
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧选择"工作负载"，在右上角单击"创建工作负载"。
3. 配置工作负载信息。 
   在"容器配置\>基本信息"中设置GPU配额：
   - 显存：显存值单位为MiB，需为正整数，且为128的倍数。若配置的显存超过单张GPU卡的显存，将会出现无法调度状况。
   
   - 算力：算力值单位为%，需为5的倍数，且最大不超过100。
   
   
   ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
   - 当显存设置为单张GPU卡的容量上限或算力设置为100%时，将会使用整张GPU卡。
   
   - 使用GPU虚拟化时，工作负载调度器将默认指定为Volcano且不可更改。
    
   图1设置GPU配额   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001662270862.png "点击放大")
   本文主要为您介绍GPU虚拟化的使用，其他参数详情请参见[工作负载](https://support.huaweicloud.com/usermanual-cce/cce_10_0046.html)。
   其余信息都配置完成后，单击"创建"。
   
   
4. 工作负载创建成功后，您可以尝试验证GPU虚拟化的隔离能力。 
   1. 登录容器查看容器被分配显存总量。
      ```
      kubectl exec -it gpu-app -- nvidia-smi
      ```
      预期输出：
      ```
      Wed Apr 12 07:54:59 2023       
      +-----------------------------------------------------------------------------+
      | NVIDIA-SMI 470.57.02   Driver Version: 470.57.02   CUDA Version: 11.4     |
      |-------------------------------+----------------------+----------------------+
      | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
      | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
      |                               |                      |               MIG M. |
      |===============================+======================+======================|
      |   0  Tesla V100-SXM2...  Off  | 00000000:21:01.0 Off |                    0 |
      | N/A   27C    P0    37W / 300W |   0MiB /  5120MiB |      0%      Default |
      |                               |                      |                  N/A |
      +-------------------------------+----------------------+----------------------+
      +-----------------------------------------------------------------------------+
      | Processes:                                                                  |
      |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
      |        ID   ID                                                   Usage      |
      |=============================================================================|
      +-----------------------------------------------------------------------------+
      ```
      由于该容器暂未使用GPU程序，因此该容器被分配显存总量为5120 MiB，但实际使用量为0MiB。当在该容器上部署相关GPU程序后，实际使用量将不再为0MiB。
      
   
   2. 查看所在节点的GPU显存隔离情况（在节点上执行）。
      ```
      nvidia-smi
      ```
      预期输出：
      ```
      Wed Apr 12 09:31:10 2023        
      +-----------------------------------------------------------------------------+
      | NVIDIA-SMI 470.57.02   Driver Version: 470.57.02   CUDA Version: 11.4     |
      |-------------------------------+----------------------+----------------------+
      | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
      | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
      |                               |                      |               MIG M. |
      |===============================+======================+======================|
      |   0  Tesla V100-SXM2...  Off  | 00000000:21:01.0 Off |                    0 |
      | N/A   27C    P0    37W / 300W |   0MiB / 16160MiB |      0%      Default |
      |                               |                      |                  N/A |
      +-------------------------------+----------------------+----------------------+
      +-----------------------------------------------------------------------------+
      | Processes:                                                                  |
      |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
      |        ID   ID                                                   Usage      |
      |=============================================================================|
      |  No running processes found                                                 |
      +-----------------------------------------------------------------------------+
      ```
      预期输出表明，GPU节点上的显存总量为16160 MiB，由于示例Pod暂未使用GPU程序，因此显存使用量为0MiB。
      
   
   
   
   
**通过kubectl命令行创建**
1. 使用kubectl连接集群。
2. 创建使用GPU虚拟化的应用。 
   ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
   当前支持隔离显存或同时隔离显存与算力，暂不支持设置为仅隔离算力，即不支持单独设置volcano.sh/gpu-core.percentage。
   创建gpu-app.yaml文件，内容如下：
   - 仅隔离显存：
     ```
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: gpu-app
       labels:
         app: gpu-app
     spec:
       replicas: 1
       selector:
         matchLabels:
           app: gpu-app
       template: 
         metadata:
           labels:
             app: gpu-app
         spec:
           containers:
           - name: container-1
             image: <your_image_address>     # 请替换为您的镜像地址
             resources:
               limits:
                 volcano.sh/gpu-mem.128Mi: 40  # 该Pod分配的显存大小，该数值表示128Mi的倍数，即40*128=5120Mi
           imagePullSecrets:
             - name: default-secret
           schedulerName: volcano
     ```
     
   
   - 同时隔离显存与算力：
     ```
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: gpu-app
       labels:
         app: gpu-app
     spec:
       replicas: 1
       selector:
         matchLabels:
           app: gpu-app
       template: 
         metadata:
           labels:
             app: gpu-app
         spec:
           containers:
           - name: container-1
             image: <your_image_address>     # 请替换为您的镜像地址
             resources:
               limits:
                 volcano.sh/gpu-mem.128Mi: 40  # 该Pod分配的显存大小，该数值表示128Mi的倍数，即40*128=5120Mi
                 volcano.sh/gpu-core.percentage: 25    # 该Pod分配的算力大小
           imagePullSecrets:
             - name: default-secret
           schedulerName: volcano
     ```
     
   
   
   表1关键参数说明 
   | 参数                             | 是否必选 | 描述                                                          |
   |:---|:---|:---|
   | volcano.sh/gpu-mem.128Mi       | 否    | 该数值表示128Mi的倍数，需为正整数，显存值单位为MiB。若配置的显存超过单张GPU卡的显存，将会出现无法调度状况。 |
   | volcano.sh/gpu-core.percentage | 否    | 算力值单位为%，需为5的倍数，且最大不超过100。                                   |
      
   ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
   - 当显存设置为单张GPU卡的容量上限或算力设置为100%时，将会使用整张GPU卡。
   
   - 使用GPU虚拟化时，工作负载调度器将默认指定为Volcano且不可更改。
    
   
   
3. 执行以下命令，创建应用。 
   ```
   kubectl apply -f gpu-app.yaml
   ```
   
   
4. 验证GPU虚拟化的隔离能力。 
   1. 登录容器查看容器被分配显存总量。
      ```
      kubectl exec -it gpu-app -- nvidia-smi
      ```
      预期输出：
      ```
      Wed Apr 12 07:54:59 2023       
      +-----------------------------------------------------------------------------+
      | NVIDIA-SMI 470.57.02   Driver Version: 470.57.02   CUDA Version: 11.4     |
      |-------------------------------+----------------------+----------------------+
      | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
      | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
      |                               |                      |               MIG M. |
      |===============================+======================+======================|
      |   0  Tesla V100-SXM2...  Off  | 00000000:21:01.0 Off |                    0 |
      | N/A   27C    P0    37W / 300W |   0MiB /  5120MiB |      0%      Default |
      |                               |                      |                  N/A |
      +-------------------------------+----------------------+----------------------+
      +-----------------------------------------------------------------------------+
      | Processes:                                                                  |
      |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
      |        ID   ID                                                   Usage      |
      |=============================================================================|
      +-----------------------------------------------------------------------------+
      ```
      由于该容器暂未使用GPU程序，因此该容器被分配显存总量为5120 MiB，但实际使用量为0MiB。当在该容器上部署相关GPU程序后，实际使用量将不再为0MiB。
      
   
   2. 查看所在节点的GPU显存隔离情况（在节点上执行）。
      ```
      nvidia-smi
      ```
      预期输出：
      ```
      Wed Apr 12 09:31:10 2023        
      +-----------------------------------------------------------------------------+
      | NVIDIA-SMI 470.57.02   Driver Version: 470.57.02   CUDA Version: 11.4     |
      |-------------------------------+----------------------+----------------------+
      | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
      | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
      |                               |                      |               MIG M. |
      |===============================+======================+======================|
      |   0  Tesla V100-SXM2...  Off  | 00000000:21:01.0 Off |                    0 |
      | N/A   27C    P0    37W / 300W |   0MiB / 16160MiB |      0%      Default |
      |                               |                      |                  N/A |
      +-------------------------------+----------------------+----------------------+
      +-----------------------------------------------------------------------------+
      | Processes:                                                                  |
      |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
      |        ID   ID                                                   Usage      |
      |=============================================================================|
      |  No running processes found                                                 |
      +-----------------------------------------------------------------------------+
      ```
      预期输出表明，GPU节点上的显存总量为16160 MiB，由于示例Pod暂未使用GPU程序，因此显存使用量为0MiB。
      
   
   
   
   
 
#### 相关文档
- [GPU虚拟化兼容Kubernetes默认GPU调度](https://support.huaweicloud.com/usermanual-cce/cce_10_0742.html)
- [GPU虚拟化多卡均分调度](https://support.huaweicloud.com/usermanual-cce/cce_10_0965.html)
- [GPU弹性伸缩](https://support.huaweicloud.com/usermanual-cce/cce_10_1017.html)
- [GPU监控](https://support.huaweicloud.com/usermanual-cce/cce_10_1016.html)
- [GPU故障处理](https://support.huaweicloud.com/usermanual-cce/cce_10_0779.html)
 
