云服务器内容精选

  • 约束与限制 init容器不支持进行GPU虚拟化。 对于单张GPU卡: 最多虚拟化为20个GPU虚拟设备。 最多调度20个使用隔离能力的Pod。 仅支持调度相同隔离模式(GPU虚拟化支持显存隔离、显存与算力隔离两种隔离模式。)的工作负载。 对于同一工作负载中的不同容器: 仅支持配置单一显卡型号,不支持混合配置两种及以上GPU显卡型号。 仅支持配置一致GPU使用模式,不支持混合配置虚拟化和非虚拟化模式。 使用GPU虚拟化后,该GPU节点不再支持调度使用共享GPU资源的工作负载。
  • 验证GPU虚拟化隔离能力 工作负载创建成功后,您可以尝试验证GPU虚拟化的隔离能力。 登录容器查看容器被分配显存总量 kubectl exec -it gpu-app -- nvidia-smi 预期输出: Wed Apr 12 07:54:59 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.141.03 Driver Version: 470.141.03 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 | 4792MiB / 5000MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| +-----------------------------------------------------------------------------+ 预期输出表明,该容器被分配显存总量为5000 MiB,实际使用了4792MiB。 查看所在节点的GPU显存隔离情况(在节点上执行)。 export PATH=$PATH:/usr/local/nvidia/bin;nvidia-smi 预期输出: Wed Apr 12 09:31:10 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.141.03 Driver Version: 470.141.03 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 | 4837MiB / 16160MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 760445 C python 4835MiB | +-----------------------------------------------------------------------------+ 预期输出表明,GPU节点上的显存总量为16160 MiB,其中示例Pod使用了4837MiB。
  • 前提条件 创建GPU类型节点,具体请参见创建节点。 安装gpu-device-plugin(原gpu-beta)插件,安装时注意要选择节点上GPU对应的驱动,具体请参见CCE AI套件(NVIDIA GPU)。 gpu-device-plugin(原gpu-beta)插件会把驱动的目录挂载到/usr/local/nvidia/lib64,在容器中使用GPU资源需要将/usr/local/nvidia/lib64追加到LD_LIBRARY_PATH环境变量中。 通常可以通过如下三种方式追加。 制作镜像的Dockerfile中配置LD_LIBRARY_PATH。(推荐) ENV LD_LIBRARY_PATH /usr/local/nvidia/lib64:$LD_LIBRARY_PATH 镜像的启动命令中配置LD_LIBRARY_PATH。 /bin/bash -c "export LD_LIBRARY_PATH=/usr/local/nvidia/lib64:$LD_LIBRARY_PATH && ..." 创建工作负载时定义LD_LIBRARY_PATH环境变量(需确保容器内未配置该变量,不然会被覆盖)。 ... env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64 ...
  • 使用GPU 创建工作负载申请GPU资源,可按如下方法配置,指定显卡的数量。 apiVersion: apps/v1 kind: Deployment metadata: name: gpu-test namespace: default spec: replicas: 1 selector: matchLabels: app: gpu-test template: metadata: labels: app: gpu-test spec: containers: - image: nginx:perl name: container-0 resources: requests: cpu: 250m memory: 512Mi nvidia.com/gpu: 1 # 申请GPU的数量 limits: cpu: 250m memory: 512Mi nvidia.com/gpu: 1 # GPU数量的使用上限 imagePullSecrets: - name: default-secret 通过nvidia.com/gpu指定申请GPU的数量,支持申请设置为小于1的数量,比如nvidia.com/gpu: 0.5,这样可以多个Pod共享使用GPU。GPU数量小于1时,不支持跨GPU分配,如0.5 GPU只会分配到一张卡上。 使用nvidia.com/gpu参数指定GPU数量时,requests和limits值需要保持一致。 指定nvidia.com/gpu后,在调度时不会将负载调度到没有GPU的节点。如果缺乏GPU资源,会报类似如下的Kubernetes事件。 0/2 nodes are available: 2 Insufficient nvidia.com/gpu. 0/4 nodes are available: 1 InsufficientResourceOnSingleGPU, 3 Insufficient nvidia.com/gpu. 在CCE控制台使用GPU资源,只需在创建工作负载时,选择使用的GPU配额即可。 图1 使用GPU
  • 访问Grafana Prometheus插件同时安装了Grafana(一款开源可视化工具),并且与Prometheus进行了对接。您可以创建一个公网LoadBalancer类型Service,这样就可以从公网访问Grafana,从Grafana中看到Prometheus的监控数据。 单击访问地址,访问Grafana,选择合适的DashBoard,即可以查到相应的聚合内容。 登录CCE控制台,选择一个已安装Prometheus插件的集群,在左侧导航栏中选择“服务”。 单击右上角“YAML创建”,为Grafana创建一个公网LoadBalancer类型Service。 apiVersion: v1 kind: Service metadata: name: grafana-lb #服务名称,可自定义 namespace: monitoring labels: app: grafana annotations: kubernetes.io/elb.id: 038ff*** #请替换为集群所在VPC下的ELB实例ID,且ELB实例为公网访问类型 spec: ports: - name: cce-service-0 protocol: TCP port: 80 #服务端口号,可自定义 targetPort: 3000 #Grafana的默认端口号,无需更改 selector: app: grafana type: LoadBalancer 创建完成后在浏览器访问“负载均衡公网IP地址:服务端口”,访问Grafana并选择合适的DashBoard,即可查看GPU资源状态。 图4 查看GPU虚拟化资源
  • 监控GPU指标 创建一个使用GPU的工作负载,等工作负载正常运行后,访问Prometheus,在“Graph”页面中,查看GPU指标。 图3 查看GPU监控指标 表1 GPU基础监控指标 类型 指标 监控级别 说明 利用率指标 cce_gpu_utilization GPU卡 GPU卡算力使用率 cce_gpu_memory_utilization GPU卡 GPU卡显存使用率 cce_gpu_encoder_utilization GPU卡 GPU卡编码使用率 cce_gpu_decoder_utilization GPU卡 GPU卡解码使用率 cce_gpu_utilization_process GPU进程 GPU各进程算力使用率 cce_gpu_memory_utilization_process GPU进程 GPU各进程显存使用率 cce_gpu_encoder_utilization_process GPU进程 GPU各进程编码使用率 cce_gpu_decoder_utilization_process GPU进程 GPU各进程解码使用率 内存指标 cce_gpu_memory_used GPU卡 GPU显存使用量 cce_gpu_memory_total GPU卡 GPU显存总量 cce_gpu_memory_free GPU卡 GPU显存空闲量 cce_gpu_bar1_memory_used GPU卡 GPU bar1 内存使用量 cce_gpu_bar1_memory_total GPU卡 GPU bar1 内存总量 频率 cce_gpu_clock GPU卡 GPU时钟频率 cce_gpu_memory_clock GPU卡 GPU显存频率 cce_gpu_graphics_clock GPU卡 GPU图形处理器频率 cce_gpu_video_clock GPU卡 GPU视频处理器频率 物理状态数据 cce_gpu_temperature GPU卡 GPU温度 cce_gpu_power_usage GPU卡 GPU功率 cce_gpu_total_energy_consumption GPU卡 GPU总能耗 带宽数据 cce_gpu_pcie_link_bandwidth GPU卡 GPU PCIE 带宽 cce_gpu_nvlink_bandwidth GPU卡 GPU nvlink 带宽 cce_gpu_pcie_throughput_rx GPU卡 GPU PCIE 接收带宽 cce_gpu_pcie_throughput_tx GPU卡 GPU PCIE 发送带宽 cce_gpu_nvlink_utilization_counter_rx GPU卡 GPU nvlink 接收带宽 cce_gpu_nvlink_utilization_counter_tx GPU卡 GPU nvlink 发送带宽 隔离内存页面 cce_gpu_retired_pages_sbe GPU卡 GPU单比特错误隔离页数量 cce_gpu_retired_pages_dbe GPU卡 GPU双比特错误隔离页数量 表2 GPU虚拟化监控指标 指标 监控级别 说明 xgpu_memory_total GPU进程 GPU虚拟化显存总量。 xgpu_memory_used GPU进程 GPU虚拟化显存使用量。 xgpu_core_percentage_total GPU进程 GPU虚拟化算力总量。 xgpu_core_percentage_used GPU进程 GPU虚拟化算力使用量。 gpu_schedule_policy GPU卡 GPU虚拟化分三种模式: 0:显存隔离算力共享模式 1:显存算力隔离模式 2:默认模式,表示当前卡还没被用于GPU虚拟化设备分配。 xgpu_device_health GPU卡 GPU虚拟化设备的健康情况。 0:表示GPU虚拟化设备为健康状态。 1:表示GPU虚拟化设备为非健康状态。
  • 故障定位步骤 NVML显存重映射行数查询异常 GPU驱动或GPU设备存在异常,请根据GPU设备所在的节点类型(E CS 或BMS),联系对应的客服进行处理。 GPU设备DBE错误与SBE错误总数过高 GPU驱动或GPU设备存在异常,请根据GPU设备所在的节点类型(ECS或BMS),联系对应的客服进行处理。 GPU设备存在Uncorrectable ECC错误 登录GPU隔离事件发生的节点。 进入/usr/local/nvidia/bin目录,执行nvidia-smi -q命令。 若nvidia-smi命令不存在或执行失败,有可能是驱动安装未就绪导致,可以重新安装GPU驱动后,再重试。 观察执行结果中的ECC ERROR(发生ECC故障的记录)。 Correctable Error:不会影响业务,不会触发GPU隔离。 Uncorrectable Error:会导致业务中断,会触发GPU隔离。 若存在Uncorrectable Error,可以尝试通过以下手段恢复: 配置目标节点污点(taints),驱逐目标节点存量的业务负载。 重启目标节点。 若重启后仍有该现象,则需要收集nvidia-smi -q命令的输出,然后根据GPU设备所在的节点类型(ECS或BMS),联系对应的客服进行处理。 NVML获取设备UUID异常 登录GPU隔离事件发生的节点。 进入/usr/local/nvidia/bin目录。 执行nvidia-smi,观察执行结果中的设备ID,例如:00:0D.0。 若nvidia-smi命令不存在或执行失败,有可能是驱动安装未就绪导致,可以重新安装GPU驱动后,再重试。 执行lspci | grep NVIDIA,观察执行结果中的设备ID。 比对上述两者结果,若存在不匹配的现象,收集两者输出结果,然后根据GPU设备所在的节点类型(ECS或BMS),联系对应的客服进行处理。 GPU设备存在Xid错误 登录GPU隔离事件发生的节点。 执行dmesg -T | grep -i NVRM,观察结果输出。 假如存在Xid(PCI:0000:00:0x): xx格式的信息,则需要收集错误码,根据Nvidia Xid Error页面中确认详细原因。然后将详细原因和错误信息,根据GPU设备所在的节点类型(ECS或BMS),联系对应的客服进行处理。 GPU虚拟化设备可用内存远小于GPU物理显存 登录GPU虚拟化节点。 执行/usr/local/nvidia/bin/nvidia-smi,观测目标GPU卡的物理显存,记录其序号。 执行cat /proc/xgpu/{GPU卡序号}/meminfo,注意替换命令中的{GPU卡序号}为步骤2获取的GPU卡序号,观测GPU虚拟化的可用显存。 比较步骤2和步骤3的可用显存。 由于GPU厂商的驱动程序,本身就会占用一定量的物理显存,量级在300MB左右,这属于正常现象。例如Tesla T4配套510.47.03,驱动程序默认会占用280MiB;而该显存占用与厂商的驱动程序版本也有一定相关性,例如535系列驱动比470系列占用更多。 若发现GPU虚拟化的可用显存远小于GPU卡的物理显存,一般是因为存在一些非GPU虚拟化发放的容器,占用了显存。 通过CCE控制台或kubectl命令,将目标节点的GPU负载排空。 执行rmmod xgpu_km,进行GPU虚拟化模块的删除。 通过CCE控制台或kubectl命令,将目标节点的nvidia-gpu-device-plugin Pod进行删除。 等待nvidia-gpu-device-plugin Pod重建完成后,重新按照步骤2和步骤3进行结果核验。