
# 安装并使用XGPU
本章节介绍如何安装和使用XGPU服务。
#### 约束限制
- XGPU功能仅在Nvidia Tesla T4、V100、L2上支持。
- HCE内核版本为5.10及以上版本。
- XGPU功能支持cuda 12.2.0至13.2.0版本。
- GPU实例已安装535.54.03、535.216.03、570.86.15或580.126.20版本的NVIDIA驱动。
- GPU实例已安装18.09.0-300或更高版本的docker。
- 受GPU虚拟化技术的限制，XGPU的算力隔离功能在渲染场景无法使用，渲染场景请使用原生调度策略。
- 受GPU虚拟化技术的限制，容器内应用程序初始化时，通过nvidia-smi监测工具监测到的实时算力可能超过容器可用的算力上限。
- 当CUDA应用程序创建时，会在GPU卡上申请一小部分UVM显存（在Nvidia Tesla T4上大约为3 MiB），这部分显存属于管理开销，不受XGPU服务管控。
- 暂不支持同时在裸机环境以及该环境直通卡的虚拟机中同时使用。
- XGPU服务的隔离功能不支持以UVM的方式申请显存，即调用CUDA API cudaMallocManaged()，更多信息，请参见[NVIDIA官方文档](https://developer.nvidia.com/blog/unified-memory-cuda-beginners/?spm=a2c4g.171786.0.0.46432fcbxOCZqv)。请使用其他方式申请显存，例如调用cudaMalloc()等。
  ![](https://support.huaweicloud.com/usermanual-hce/public_sys-resources/note_3.0-zh-cn.png)
  - XGPU允许用户动态禁用UVM的方式申请显存，禁用方法参考uvm_disable接口说明。
  
  - HCE3.0不支持535.54.03版本的NVIDIA驱动。
    
 
#### 安装XGPU服务
安装XGPU服务请联系技术支持。
推荐您通过云容器引擎服务使用XGPU虚拟化服务，相关操作请参见[GPU虚拟化](https://support.huaweicloud.com/usermanual-cce/cce_10_0643.html)。
#### XGPU服务使用示例
影响XGPU服务的环境变量如下表所示，您可以在创建容器时指定环境变量的值。容器引擎可以通过XGPU服务获得算力和显存。
表1影响XGPU服务的环境变量 
| 环境变量名称                      | 取值类型    | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | 示例                                                                            |
|:---|:---|:---|:---|
| GPU_IDX                     | Integer | 指定容器可使用的GPU显卡。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | 为容器分第一张显卡： GPU_IDX=0                           |
| GPU_CONTAINER_MEM           | Integer | 设置容器内可使用的显存大小，单位 MiB。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | 为容器分配的显存大小为5120MiB： GPU_CONTAINER_MEM=5120      |
| GPU_CONTAINER_QUOTA_PERCENT | Integer | 指定显卡算力分配百分比。 算力支持最小1%粒度的划分，推荐最小算力不低于4%。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | 为容器分配50%的算力比例： GPU_CONTAINER_QUOTA_PERCEN=50 |
| GPU_POLICY                  | Integer | 指定GPU使用的算力隔离的策略。 - 0：不隔离算力，即原生调度。  - 1：固定算力调度。  - 2：平均调度。  - 3：抢占调度。  - 4：权重抢占调度。  - 5：混合调度。  - 6：权重弱调度。   算力隔离策略示例详见[XGPU算力调度示例](https://support.huaweicloud.com/usermanual-hce/hce_xgpu_0003.html)。 | 设置算力隔离策略为固定算力调度：GPU_POLICY=1                                                  |
| GPU_CONTAINER_PRIORITY      | Integer | 指定容器的优先级。 - 0：低优先级  - 1：高优先级                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | 创建高优先级容器： GPU_CONTAINER_PRIORITY=1            |
   
NVIDIA Docker是一个可以使用GPU的docker，用于在容器中支持 NVIDIA GPU，下面以使用NVIDIA Docker创建两个容器为例，介绍XGPU服务的使用方法，数据规划如下。
表2数据规划 
| 参数                          | 容器1  | 容器2  | 说明                               |
|:---|:---|:---|:---|
| GPU_IDX                     | 0    | 0    | 指定两个容器使用第一张显卡。                   |
| GPU_CONTAINER_QUOTA_PERCENT | 50   | 30   | 为容器1分配50%算力，为容器2分配30%算力。         |
| GPU_CONTAINER_MEM           | 5120 | 1024 | 为容器1分配5120MiB显存，为容器2分配1024MiB显存。 |
| GPU_POLICY                  | 1    | 1    | 设置第一张显卡使用固定算力调度策略。               |
| GPU_CONTAINER_PRIORITY      | 1    | 0    | 指定容器1为高优先级容器，容器2为低优先级容器。         |
   
配置示例：
```
docker run --rm -it --runtime=nvidia -e GPU_CONTAINER_QUOTA_PERCENT=50 -e GPU_CONTAINER_MEM=5120 -e GPU_IDX=0 -e GPU_POLICY=1 -e GPU_CONTAINER_PRIORITY=1 --shm-size 16g -v /mnt/:/mnt nvcr.io/nvidia/tensorrt:19.07-py3 bash 
docker run --rm -it --runtime=nvidia -e GPU_CONTAINER_QUOTA_PERCENT=30 -e GPU_CONTAINER_MEM=1024 -e GPU_IDX=0 -e GPU_POLICY=1 -e GPU_CONTAINER_PRIORITY=0 --shm-size 16g -v /mnt/:/mnt nvcr.io/nvidia/tensorrt:19.07-py3 bash
```
#### 查看procfs节点
XGPU服务运行时会在/proc/xgpu下生成并自动管理多个procfs节点，您可以通过procfs节点查看和配置XGPU服务相关的信息。下面介绍各procfs节点的用途。
1. 执行以下命令，查看节点信息，目录内容说明请参考：[表3]。
   ```
   ls /proc/xgpu/
   0 container version uvm_disable
   ```
    表3目录内容说明 
   | 目录          | 读写类型 | 说明                                                                                                                                                                                                                                              |
   |:---|:---|:---|
   | 0           | 读写   | XGPU服务会针对GPU实例中的每张显卡生成一个的目录，并使用数字作为目录名称，例如0、1、2。本示例中只有一张显卡，对应的目录ID为0。                                                                                                                                                                           |
   | container   | 读写   | XGPU服务会针对运行在GPU实例中的每个容器生成一个的目录。                                                                                                                                                                                                                 |
   | version     | 只读   | XGPU的版本。                                                                                                                                                                                                                                        |
   | uvm_disable | 读写   | 是否禁用UVM的方式申请显存，全局粒度，默认值为0。 - 0：不禁用  - 1：禁用   |
      
   
2. 执行以下命令，查看第一张显卡对应的目录内容，目录内容说明请参考：[表4]。
   ```
   ls /proc/xgpu/0/
   max_inst meminfo policy quota utilization_line utilization_rate xgpu1 xgpu2
   ```
    表4目录内容说明 
   | 目录               | 读写类型 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   |:---|:---|:---|
   | max_inst         | 读写   | 用于设置容器的最大数量，取值范围为1\~25。仅在没有容器运行的情况下可修改。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | meminfo          | 只读   | 此显卡总共可用的显存大小。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   | policy           | 读写   | 指定GPU使用的算力隔离的策略，默认值为1。 - 0：不隔离算力，即原生调度。  - 1：固定算力调度。  - 2：平均调度。  - 3：抢占调度。  - 4：权重抢占调度。  - 5：混合调度。  - 6：权重弱调度。   算力隔离策略示例详见[XGPU算力调度示例](https://support.huaweicloud.com/usermanual-hce/hce_xgpu_0003.html)。 |
   | quota            | 只读   | 算力总权重。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   | utilization_line | 读写   | 在离线混部的算力压制水位线。 当GPU整卡利用率超过该值时，在线容器完全压制离线容器，否则在线容器部分压制离线容器。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | utilization_rate | 只读   | GPU整卡利用率。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | xgpuIndex        | 读写   | 属于此显卡的xgpu子目录。 本示例中，属于第1张显卡的xgpu为xgpu1和xgpu2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
      
   
3. 执行以下命令，查看container目录内容，目录内容说明请参考：[表5]。
   ```
   ls /proc/xgpu/container/
   9418 9582
   ```
    表5目录内容说明 
   | 目录          | 读写类型 | 说明                                                                    |
   |:---|:---|:---|
   | containerID | 读写   | 容器的ID。 使用XGPU创建容器的时候分配的ID，每个容器对应一个ID。 |
      
   
4. 执行以下命令，查看containerID目录内容，目录内容说明请参考：[表6]。
   ```
   ls /proc/xgpu/container/9418/
   xgpu1 uvm_disable
   ls /proc/xgpu/container/9582/
   xgpu2 uvm_disable
   ```
    表6目录内容说明 
   | 目录          | 读写类型 | 说明                                                                                                                                                                                                                                            |
   |:---|:---|:---|
   | xgpuIndex   | 读写   | 属于此容器的xgpu子目录。 本示例中，属于容器9418的xgpu为xgpu1，属于容器9582的xgpu为xgpu2。                                                                                                                                                 |
   | uvm_disable | 读写   | 是否禁用UVM的方式申请显存，容器粒度，默认值为0。 - 0：不禁用  - 1：禁用   |
      
   
5. 执行以下命令，查看xgpuIndex目录内容，目录内容说明请参考：[表7]。
   ```
   ls /proc/xgpu/container/9418/xgpu1/
   meminfo priority quota
   ```
    表7目录内容说明 
   | 目录       | 读写类型 | 说明                                                                                                                                                                                                                                                                                    |
   |:---|:---|:---|
   | meminfo  | 只读   | 此XGPU分配的可见显存大小和当前剩余可用显存大小。 如3308MiB/5120MiB, 64% free，指分配了5120MiB，剩余64%可使用。                                                                                                                                                                            |
   | priority | 读写   | 用于设置容器的优先级，默认值为0。 - 0：低优先级  - 1：高优先级   该功能用于在线离线混合使用场景，高优先级容器可以抢占低优先级容器的算力。 |
   | quota    | 只读   | 此XGPU分配的算力百分比。 如50，指此XGPU分配了显卡50%的算力。                                                                                                                                                                                                                 |
      
   
了解procfs节点的用途后，您可以在GPU实例中执行命令进行切换调度策略、查看权重等操作，示例命令如[表8]所示。
 表8示例命令 
| 命令                                                              | 效果                        |
|:---|:---|
| echo 1 \> /proc/xgpu/0/policy                                   | 修改第一张显卡的调度策略为权重调度。        |
| cat /proc/xgpu/container/$containerID/$xgpuIndex/meminfo        | 查看指定容器里xgpu分配的显存大小。       |
| cat /proc/xgpu/container/$containerID/$xgpuIndex/quota          | 查看指定容器里xgpu分配的算力权重。       |
| cat /proc/xgpu/0/quota                                          | 查看第一张显卡上剩余可用的算力权重。        |
| echo 20 \> /proc/xgpu/0/max_inst                                | 设置第一张显卡最多可以创建20个容器。       |
| echo 1 \> /proc/xgpu/container/$containerID/$xgpuIndex/priority | 设置指定容器里xgpu的优先级为高优先级。     |
| echo 40 \> /proc/xgpu/0/utilization_line                        | 设置第一张显卡的在离线混部算力压制水位线为40%。 |
| echo 1 \> /proc/xgpu/container/$containerID/uvm_disable         | 设置指定容器里xgpu禁用UVM的方式申请显存   |
   
#### 升级XGPU服务
XGPU服务采用冷升级的方式。
1. 关闭所有运行中的容器。 **docker ps -q \| xargs -I {} docker stop {}**
   
2. 升级xgpu的RPM包。 **rpm -U hce_xgpu**
   
 
#### 卸载XGPU服务
1. 关闭所有运行中的容器。 **docker ps -q \| xargs -I {} docker stop {}**
   
2. 卸载xgpu的RPM包。 **rpm -e hce_xgpu**
   
 
#### 通过xgpu-smi工具监控容器
您可以通过xgpu-smi工具查看XGPU容器的相关信息，包括容器ID、算力使用、分配情况、显存使用及分配情况等。
xgpu-smi的监控展示信息如下所示：
图1xgpu-smi的监控展示信息   
![](https://support.huaweicloud.com/usermanual-hce/zh-cn_image_0000002512088855.png "点击放大")
您可使用**xgpu-smi -h**命令查看xgpu-smi工具的帮助信息。
图2xgpu-smi工具的帮助信息   
![](https://support.huaweicloud.com/usermanual-hce/zh-cn_image_0000002479928986.png "点击放大")
