阿里云容器服务GPU监控2.0进阶篇2:学会剖析(Profiling)您的GPU使用情况

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本系列相关文章:阿里云容器服务GPU监控2.0基础篇1:基本功能使用阿里云容器服务GPU监控2.0基础篇2:监控NVLINK带宽阿里云容器服务GPU监控2.0基础篇3:监控NVIDIA XID错误阿里云容器服务GPU监控2.0进阶篇1:剖析(Profiling)GPU使用情况必备知识阿里云容器服务GPU监控2.0进阶篇2:学会剖析(Profiling)GPU使用情况为了能够更深入理解GPU Pro

本系列相关文章:

为了能够更深入理解GPU Profiling,前面用了一整篇文章介绍了CUDA编程和GPU架构相关知识。如果对CDUA编程和GPU架构不太了解,建议先看看之前的文章。本篇文章将继续介绍GPU Profiling。

GPU利用率的局限性

大多数时候,我们都是通过nvidia-smi查询GPU利用率来了解GPU使用情况,如果该值比较高,我们就认为GPU使用得比较好。

GPU利用率的意义可以描述为:在一个周期时间内(1s或1/6s,依GPU产品而定),一个或多个核函数处于active的时间(eg:running)。 但是GPU利用率目前存在如下的局限性:

  • 仅能够展示有核函数在用GPU资源,但用的怎么样无法知道。
  • 无法告知用户有多少个SM在使用。
  • 用户写的代码有多“忙”,到底是真忙还是假忙?
  • 用户写的代码到底在干什么?比如当前是在做单精度浮点数计算(FP32)还是做双精度浮点数计算(FP64)还是在从内存中拷贝数据?

为了演示GPU利用率的局限性,接下来我们做一个实验,以下是一段示例CUDA代码Test_GPU_Utilization.cu:

$ cat Test_GPU_Utilization.cu

#include 
#include 
#include 

const long long tdelay=100000000000000LL;

// 核函数定义,这个核函数所干的事有点类似于使这个GPU线程一直sleep
__global__ void dkern(){
        long long start = clock64();
        long long targetClock = start+tdelay;
        while(clock64() < targetClock);
}

int main(int argc, char *argv[]){
        dkern<<<1,1>>>(); // 调用核函数启动1个线程块,这个线程块包含1个线程
        cudaDeviceSynchronize();
        return 0;
}

然后使用nvcc编译这段代码并执行:

# nvcc -o test-gpu-util Test_GPU_Utilization.cu 

# ./test-gpu-util

在另外的终端上使用nvidia-smi查看GPU利用率,可以看到GPU利用率为100%:

虽然GPU利用率显示了100%,但是真的就说明代码高效利用了这块GPU吗?我们来分析一下,我是在V100上运行这个程序的,前面的文章介绍过,V100使用的计算能力(Compute Capability,简称CC)为7.0,在CC 7.0中定义了每个SM最大能容纳的线程数为2048,且V100有84个SM,那么整张V100在极限情况下,一次能够容纳的线程数为84 * 2048 = 172032,而示例程序中,核函数只启动了1个线程块,这个线程块包含1个线程。可以看到,V100一次本来能够容纳172032个线程,现在却启动了1个线程,利用率也是100%,误差是不是很大?

DCGM Profiling指标

NVIDIA认识到单就GPU利用率这一个指标并不能完全说明GPU的使用情况,既然一个指标不能说明,那就多弄几个指标,从各个维度进行说明,DCGM Profiling相关指标就由此产生了。

下表是对DCGM提供的Profiling指标做一些解释,更多指标解释请参考文档:容器服务GPU监控2.0指标说明

指标名称

解释

DCGM_FI_PROF_GR_ENGINE_ACTIVE

  • 表示在一个时间间隔内,Graphics或Compute引擎处于Active的时间占比。
  • 该值表示所有Graphics和Compute引擎的平均值。
  • Graphics或Compute引擎处于Active是指Graphics或Compute Context绑定到线程,并且Graphics或Compute Context处于Busy状态。

DCGM_FI_PROF_SM_ACTIVE

  • 表示在一个时间间隔内,至少一个线程束在一个SM(Streaming Multiprocessor)上处于Active的时间占比。
  • 该值表示所有SM的平均值,且该值对每个块的线程数不敏感。
  • 线程束处于Active是指一个线程束被调度且分配资源后的状态,可能是在Computing、也可能是非Computing状态(例如等待内存请求)。
  • 该值小于0.5表示未高效利用GPU,大于0.8是必要的。
  • 假设一个GPU有N个SM:
  • 一个核函数在整个时间间隔内使用N个线程块运行在所有的SM上,此时该值为1(100%)。
  • 一个核函数在一个时间间隔内运行N/5个线程块,此时该值为0.2。
  • 一个核函数使用N个线程块,在一个时间间隔内,仅运行了1/5个周期的时间,此时该值为0.2。

DCGM_FI_PROF_SM_OCCUPANCY

  • 表示在一个时间间隔内,驻留在SM上的线程束与该SM最大可驻留线程束的比例。
  • 该值表示一个时间间隔内的所有SM的平均值。
  • 占用率越高不代表GPU使用率越高。只有在GPU内存带宽受限的工作负载(DCGM_FI_PROF_DRAM_ACTIVE)情况下,更高的占用率表示更有效的GPU使用率。

DCGM_FI_PROF_PIPE_TENSOR_ACTIVE

  • 表示Tensor(HMMA/IMMA) Pipe处于Active状态的周期分数。
  • 该值表示一个时间间隔内的平均值,而不是瞬时值。
  • 较高的值表示Tensor Cores的利用率较高。
  • 该值为1(100%)表示在整个时间间隔内每隔一个指令周期发出一个Tensor指令(两个周期完成一条指令)。
  • 假设该值为0.2(20%),可能有如下情况:
  • 在整个时间间隔内,有20%的SM的Tensor Core以100%的利用率运行。
  • 在整个时间间隔内,有100%的SM的Tensor Core以20%的利用率运行。
  • 在整个时间间隔的1/5时间内,有100%的SM上的Tensor Core以100%利用率运行。
  • 其他组合模式。

DCGM_FI_PROF_PIPE_FP64_ACTIVE

  • 表示FP64(双精度)Pipe处于Active状态的周期分数。
  • 该值表示一个时间间隔内的平均值,而不是瞬时值。
  • 较高的值代表FP64 Cores有较高的利用率。
  • 该值为 1(100%)表示在整个时间间隔内上每四个周期(以Volta类型卡为例)执行一次FP64指令。
  • 假设该值为0.2(20%),可能有如下情况:
  • 在整个时间间隔内,有20%的SM的FP64 Core以100%的利用率运行。
  • 在整个时间间隔内,有100%的SM的FP64 Core以20%的利用率运行。
  • 在整个时间间隔的1/5时间内,有100%的SM上的FP64 Core以100%利用率运行。
  • 其他组合模式。

DCGM_FI_PROF_PIPE_FP32_ACTIVE

  • 表示乘加操作FMA(Fused Multiply-Add)管道处于Active的周期分数,乘加操作包括FP32(单精度)和整数。
  • 该值表示一个时间间隔内的平均值,而不是瞬时值。
  • 较高的值代表FP32 Cores有较高的利用率。
  • 该值为1(100%)表示在整个时间间隔内上每两个周期(Volta类型卡为例)执行一次FP32指令。
  • 假设该值为0.2(20%),可能有如下情况:
  • 在整个时间间隔内,有20%的SM的FP32 Core以100%的利用率运行。
  • 在整个时间间隔内,有100%的SM的FP32 Core以20%的利用率运行。
  • 在整个时间间隔的1/5时间内,有100%的SM上的FP32 Core以100%利用率运行。
  • 其他组合模式。

DCGM_FI_PROF_PIPE_FP16_ACTIVE

  • 表示FP16(半精度)管道处于Active的周期分数。
  • 该值表示一个时间间隔内的平均值,而不是瞬时值。
  • 较高的值代表FP16 Cores有较高的利用率。
  • 该值为 1 (100%) 表示在整个时间间隔内上每两个周期(Volta类型卡为例)执行一次FP16指令。
  • 假设该值为0.2(20%),可能有如下情况:
  • 在整个时间间隔内,有20%的SM的FP16 Core以100%的利用率运行。
  • 在整个时间间隔内,有100%的SM的FP16 Core以20%的利用率运行。
  • 在整个时间间隔的1/5时间内,有100%的SM上的FP16 Core以100%利用率运行。
  • 其他组合模式。

DCGM_FI_PROF_DRAM_ACTIVE

  • 表示内存带宽利用率(Memory BW Utilization)将数据发送到设备内存或从设备内存接收数据的周期分数。
  • 该值表示时间间隔内的平均值,而不是瞬时值。
  • 较高的值表示设备内存的利用率较高。
  • 该值为1(100%)表示在整个时间间隔内的每个周期执行一条 DRAM 指令(实际上,峰值约为 0.8 (80%) 是可实现的最大值)。
  • 假设该值为0.2(20%),表示20%的周期在时间间隔内读取或写入设备内存。
  • DCGM_FI_PROF_PCIE_TX_BYTES
  • DCGM_FI_PROF_PCIE_RX_BYTES
  • 表示通过PCIe总线传输/接收的数据速率,包括协议标头和数据有效负载。
  • 该值表示一个时间间隔内的平均值,而不是瞬时值。
  • 该速率在时间间隔内平均。例如,在1秒内传输1 GB数据,则无论以恒定速率还是突发传输数据,速率都是1 GB/s。理论上的最大PCIe Gen3带宽为每通道985 MB/s。
  • DCGM_FI_PROF_NVLINK_RX_BYTES
  • DCGM_FI_PROF_NVLINK_TX_BYTES
  • 表示通过NVLink传输/接收的数据速率,不包括协议标头。
  • 该值表示一个时间间隔内的平均值,而不是瞬时值。
  • 该速率在时间间隔内平均。例如,在1秒内传输1 GB数据,则无论以恒定速率还是突发传输数据,速率都是1 GB/s。理论上,最大NVLink Gen2带宽为每个方向每个链路25 GB/s。

使用GPU监控2.0做Profiling

提交示例任务

现在我们仍然使用前面“GPU利用率的局限性”小节中提到的那段测试GPU利用率的代码,并制作成docker镜像,然后使用kubectl apply提交一个任务,任务的yaml如下:

apiVersion: batch/v1
kind: Job
metadata:
  name: test-gpu-util
spec:
  parallelism: 1
  template:
    metadata:
      labels:
        app: test-gpu-util
    spec:
      containers:
      - name: test-gpu-util
        image: registry.cn-beijing.aliyuncs.com/ai-samples/gpu-util-test:v0.1.1
        resources:
          limits:
            nvidia.com/gpu: 1
      restartPolicy: Never

任务提交后,等待任务的pod处于Running:

# kubectl get po -owide 

NAME                                        READY   STATUS    RESTARTS   AGE    IP           NODE                        NOMINATED NODE   READINESS GATES
test-gpu-util-wx22z                         1/1     Running   0          13m    10.2.1.131   cn-beijing.192.168.10.171              

可以发现pod运行在节点cn-beijing.192.168.10.171上。

登录GPU监控2.0大盘

登录到GPU监控2.0大盘,具体操作如下:

  1. 集群列表 页面中,单击目标集群名称或者目标集群右侧 操作 列下的 详情
  2. 在集群管理页左侧导航栏中,选择 运维管理 > Prometheus监控
  3. Prometheus监控 大盘列表页面,单击 GPU监控 页签,您分别可以看到 集群维度的GPU监控大盘 节点维度的GPU监控大盘 点击“节点维度GPU监控大盘”

进入大盘后,通过左上角“GPUNode”选项框可以选择节点,因为pod运行在cn-beijing.192.168.10.171,那么选择节点cn-beijing.192.168.10.171。从大盘中可以看到该节点只有1张GPU卡,且已被分配。

分析大盘数据

为了更好的理解GPU Profiling效果,先做如下的说明:

  • 当前节点使用的卡型为Tesla V100
  • 从V100的白皮书可以知道Tesla  V100拥有84个SM,能够使用的SM数为80
  • V100使用的计算能力是7.0版本,7.0版本定义的物理限制如下

在“Utilization”这一栏,GPU利用率(GPU Utilization)为100%(也就是执行nvidia-smi显示的值),内存带宽利用率(Memory Copy Utilization)为0,说明节点上的0号GPU卡没有发生与内存有关的操作,这与事实比较相符,因为test-gpu-util任务的核函数没有从内存读取数据或写入数据到内存。

在“Profiling”这一栏,SM Active表示当前GPU卡上有多少个SM处于“Active”状态,“Active”状态的意思只要这个SM有线程,那么就是"Active"的。任务test-gpu-util的核函数会一直运行,那么处于Active的SM数为80(一张GPU卡CUDA可用SM数) * 1.25% = 1,说明只有1个SM处于Active,符合预期,因为任务test-gpu-util的核函数只启动了一个线程块,且该线程块只有1个线程,只能在一个SM上运行。虽然test-gpu-util任务的GPU利用率达到100%,但在SM Active这个指标面前它无所遁形,80个SM只用了1个,说明GPU利用率是虚高。

SM Occupancy显示的是每张GPU卡的CUDA占用率,大盘显示0号GPU卡的占用率为0.0195%,即采样周期内每个SM的平均占用率为0.0195%,那么80个SM总的占用率为:80 * 0.0195% = 1.56%,由SM Active知道只有1个SM是被使用的,那么1.68%是属于这个SM的占用率,V100采用计算能力7.0版本,而计算能力7.0版本中规定每个SM最大可驻留的线程数为2048,那么这个SM当前驻留的线程数为2048 * 1.56% = 31.95,约为32个线程,符合预期。这里你可能有疑惑:任务test-gpu-util的核函数只启动了一个线程块且该线程块只有1个线程,为什么通过占用率计算出SM当前驻留的线程个数为32,而不是1呢?前面的文章中我们提到过:GPU的SM上是以线程束为单位执行的,而每个线程束包含32个线程,也就是说,SM要么不执行,如果要执行,至少执行32个线程。

从占用率这个指标也可以看出:test-gpu-util这个任务并没有高效利用GPU,因为总共可以驻留2048个线程,当前只驻留了32个线程。

由于test-gpu-util这个任务并没有执行与FP16、FP32、FP64等有关的运算,所以这些指标的面板显示数据均为0,从这些指标中可以了解到一个任务是“真忙”还是“假忙”:它到底是忙于做FP32类的计算?还是忙于做FP64类的计算?还是像test-gpu-util这个任务一样,做sleep样的动作?

同样,通过DRAM Active可以知道核函数是否存在对GPU内存操作的动作,由于DRAM Active显示为0,说明test-gpu-util这个任务并没有操作GPU内存。

结论

从监控大盘中可以得到对test-gpu-util这个任务的如下描述:

  • GPU利用率为100%,内存带宽利用率为0
  • 80个SM只用了其中1个,其余79个SM处于空闲状态
  • SM能够容纳2048个线程,当前却只容纳了32个线程
  • FP32、FP64、FP16等计算基本没有
  • 也没有对内存有存取操作

所以得出的结论是:test-gpu-util只是一个能让GPU利用率虚高的任务,没有任何实际意义。

总结

本篇文章只是通过一个很简单的核函数介绍了如何通过阿里云容器服务GPU监控2.0做GPU Profiling,但在实际的场景中会比这更为复杂,因为一个CUDA程序有几十或者上百个核函数(而test-gpu-util这个示例任务只有1个核函数),有时还会存在多个CUDA程序运行在同一张GPU卡上。但无论如何,这些指标对于了解GPU的使用状况是有帮助的。

相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1天前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
2天前
|
供应链 安全 Cloud Native
阿里云容器服务助力企业构建云原生软件供应链安全
本文基于2024云栖大会演讲,探讨了软件供应链攻击的快速增长趋势及对企业安全的挑战。文中介绍了如何利用阿里云容器服务ACK、ACR和ASM构建云原生软件供应链安全,涵盖容器镜像的可信生产、管理和分发,以及服务网格ASM实现应用无感的零信任安全,确保企业在软件开发和部署过程中的安全性。
|
2天前
|
人工智能 Kubernetes Cloud Native
阿里云容器服务,智算时代云原生操作系统
2024云栖大会,阿里巴巴研究员易立分享了阿里云容器服务的最新进展。容器技术已成为云原生操作系统的基石,支持多样化的应用场景,如自动驾驶、AI训练等。阿里云容器服务覆盖公共云、边缘云、IDC,提供统一的基础设施,助力客户实现数字化转型和技术创新。今年,阿里云在弹性计算、网络优化、存储解决方案等方面进行了多项重要升级,进一步提升了性能和可靠性。
|
1天前
|
人工智能 Cloud Native 调度
阿里云容器服务在AI智算场景的创新与实践
本文源自张凯在2024云栖大会的演讲,介绍了阿里云容器服务在AI智算领域的创新与实践。从2018年推出首个开源GPU容器共享调度方案至今,阿里云容器服务不断推进云原生AI的发展,包括增强GPU可观测性、实现多集群跨地域统一调度、优化大模型推理引擎部署、提供灵活的弹性伸缩策略等,旨在为客户提供高效、低成本的云原生AI解决方案。
|
2天前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
1天前
|
人工智能 运维 Kubernetes
拥抱智算时代:阿里云容器服务智能、托管、弹性新体验
本文总结了2024云栖大会容器计算专场的演讲内容,重点介绍了阿里云容器服务的新产品体验,包括智能、托管、弹性的特点,以及如何助力客户拥抱智算时代。文中还分享了多项实际案例和技术细节,展示了阿里云容器服务在提升用户体验和解决实际问题方面的努力。
|
17天前
|
弹性计算 固态存储 Linux
阿里云服务器、轻量应用服务器、gpu云服务器收费标准与实时活动价格参考
云服务器ECS、轻量应用服务器和gpu云服务器是阿里云的主要云服务器产品,目前轻量应用服务器2核2G收费标准为60元/月,活动价格只要36元/1年或68元1年,云服务器1核1G包月收费标准最低为24.0元/月,GPU云服务器中gn6i实例4核15G配置月付1681.00/1个月起,gn6v实例8核32G配置月付3817.00/1个月起。本文为大家整理汇总了阿里云服务器、轻量应用服务器、gpu云服务器的最新收费标准与活动价格情况,以表格形式展示给大家,以供参考。
|
22天前
|
人工智能 弹性计算 编解码
阿里云GPU云服务器性能、应用场景及收费标准和活动价格参考
GPU云服务器作为阿里云提供的一种高性能计算服务,通过结合GPU与CPU的计算能力,为用户在人工智能、高性能计算等领域提供了强大的支持。其具备覆盖范围广、超强计算能力、网络性能出色等优势,且计费方式灵活多样,能够满足不同用户的需求。目前用户购买阿里云gpu云服务器gn5 规格族(P100-16G)、gn6i 规格族(T4-16G)、gn6v 规格族(V100-16G)有优惠,本文为大家详细介绍阿里云gpu云服务器的相关性能及收费标准与最新活动价格情况,以供参考和选择。
|
27天前
|
机器学习/深度学习 人工智能 弹性计算
阿里云GPU服务器全解析_GPU价格收费标准_GPU优势和使用说明
阿里云GPU云服务器提供强大的GPU算力,适用于深度学习、科学计算、图形可视化和视频处理等场景。作为亚太领先的云服务商,阿里云GPU云服务器具备高灵活性、易用性、容灾备份、安全性和成本效益,支持多种实例规格,满足不同业务需求。
181 2
|
3月前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
3年前的云栖大会,我们发布分布式云容器平台ACK One,随着3年的发展,很高兴看到ACK One在混合云,分布式云领域帮助到越来越多的客户,今天给大家汇报下ACK One 3年来的发展演进,以及如何帮助客户解决分布式领域多云多集群管理的挑战。
阿里云容器服务 ACK One 分布式云容器企业落地实践

相关产品

  • 容器计算服务