带你读《弹性计算技术指导及场景应用》——1. 技术改变AI发展:CUDA Graph优化的底层原理分析

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
云服务器(按量付费),48vCPU 186GiB
简介: 带你读《弹性计算技术指导及场景应用》——1. 技术改变AI发展:CUDA Graph优化的底层原理分析

简介:随着人工智能(AI)的迅速发展,越来越多的应用需要巨大的GPU计算资源。CUDA是一种并行计算平台和编程模型,由Nvidia推出,可利用GPU的强大处理能力进行加速计算。

CUDA 异步执行模型

对于GPU运算集中的AI应用场景,为了提升系统的性能,最大化地利用GPU资源是一个重要的优化方向。比较常用的方式是尽量将GPU运算转换为异步操作,CPU侧负责任务提交,保证有足够的cuda kernel发送到GPUGPU按照CUDA Stream流队列中的Kernel顺序执行。只要这中间不存在同步操作,GPU完全可以不用等待,顺序地将所有的kernel执行完,然后再通知CPUCPU运算和GPU运算是相互独立的协作关系。

 

以上的模型是一个理想化的状态,听起来合乎逻辑,而且很完美。大致的运行效果如图1。可以看到CPU通过CUDA API已经将Kernel提前准备好,GPU的任务一个接一个。GPU的利用率也比较高。

 

image.png

1 GPU异步执行的典型场景

 

对于一般的性能优化,达到这种状态已经很好了。但如果想进一步的优化就需要知道模型的实际运行情况。随着GPU算力的提升,计算任务的执行时间在慢慢缩小,一个GPU执行单元可能在us或者ms级完成。

 

通常情况下一个好的AI运算框架或模型应该尽量让GPU Kernel的运算时间长一些,从而使得GPU的性能能够更好地发挥,因为有个事实是:GPU Kernel提交到硬件也是有开销的,虽然这个时间可能只有0.x us。这里的提交不是指的cudaLaunchKernel而是更底层驱动和硬件之间的真正的提交。

 

如果业务场景中有很多小的usKernel要执行,则整个系统的性能会随着短Kernel的比例增加整体性能输出越来越差,GPU资源并不能充分利用起来。

CUDA Graph 性能优化效果

CUDA Graph可以通过CaptureCreate的方式将多个Kernel组合在一起生成一个Graph,与Kernel融合不同,在Graph内部仍然是多个Kernel的形式存在,但提交操作只需要一次,如果可以将尽量多的Kernel组合在一起,那么理论上可以节约很多Kernel提交的开销。

 

CUDA Graph也有其自身的限制,它的设计思路是将多个任务单元作为一个快照进行组合,也就意味着这个快照的参数和结构组成是固定的,不能变换,同时实例化这个快照是比较耗时的,但如果这个快照被反复执行(replay)的次数足够多,实例化快照的时间是可以忽略的。

 

以一个简单的Kernel为例介绍CUDA Graph是如何影响性能输出的。这里需要自己开发构造一个Kernel:可以根据运算复杂度调整执行时间,但在运行过程中没有HostDevice侧的数据交互。

 

以下分析均基于这个自定义Kernel进行。通过对比CUDA Graph优化前后的性能数据(图2)可以看到CUDA Graph对于执行时间越小的Kernel性能提升越明显,原因是Kernel提交的开销占比会更大(假设单次提交的开销是固定的,接下来会证明这一假设)。

 

image.png

图 不同执行时间kernel CUDA Graph优化后性能提升对照表

CUDA Graph 性能优化原理

为什么Kernel的提交会有系统开销并最终影响到GPU卡的性能输出?

 

从图1GPU异步执行逻辑来看,GPU完全可以按照CUDA Stream的队列顺序自己控制Kernel的执行节奏,只要队列中的任务足够,就能输出最大的性能。

 

Kernel提交的开销究竟在哪里?

 

3 可以有一个侧面的解释。在Kernel的执行过程中是有持续的双向数据流量的。而且这个流量和Kernel的执行时间是成反比的。这是个很重要的信息,因为Kernel执行过程中是没有运算数据流量的,HostToDevice的流量就是CPUKernel提交产生的,DeviceToHost的流量就是GPU执行完Kernel需要和Host交互产生的。而且这个流量是和Kernel的提交频率有关,和Kernel本身并没有关系。

 

image.png

图 不同执行时间kernel对应的GPU流量对照表

 

进一步研究Kernel提交究竟会有多大的数据流量,图4 做了一个展示,单次Kernel的提交产生数据流量大约在1KBGPU执行与Host同步的数据量大约在0.22KB,而且从统计结果看与Kernel的大小无关。这也可以证明前面的假设:Kernel的提交开销总体上是固定的。

 

image.png

4. 不同Kernel单次提交产生的数据流量对照表

CUDA Graph引入分析总结:

∙        cuda kernel在执行时存在确定的HostDevice侧交互

∙        交互的频率或流量与cuda kernel的提交频率有关,与cuda kernel大小无关

∙        CUDA Graph通过组合Kernel的方式可以将Kernel提交频率大幅降低,提高GPU的性能输出,但对于执行时间长的Kernel性能优化不明显。

∙        对于HostDevice端延时明显的场景,这种优化都是有益的。因为这个Kernel的提交开销本质上就是H2D 延时的开销,延时越小Kernel提交的效率就越高。

∙        对于物理机为了能够得到极致的性能可以尽量减少中间PCIe Switch的级数,因为每一级的switch引入RTT延时大约在0.3us,我们目前使用的GPU Box机型普遍有2Switch,引入RTT延时在0.6us。如果是采用gn7i的机型,GPU卡直连PCIe Root Complex,这0.6us是完全没有的,性能表现在小Kernel占比较高的场景中会更优越。

相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
相关文章
|
19小时前
|
人工智能 Java Spring
使用 Spring Cloud Alibaba AI 构建 RAG 应用
本文介绍了RAG(Retrieval Augmented Generation)技术,它结合了检索和生成模型以提供更准确的AI响应。示例中,数据集(包含啤酒信息)被加载到Redis矢量数据库,Spring Cloud Alibaba AI Starter用于构建一个Spring项目,演示如何在接收到用户查询时检索相关文档并生成回答。代码示例展示了数据加载到Redis以及RAG应用的工作流程,用户可以通过Web API接口进行交互。
|
20小时前
|
语音技术 人工智能 机器学习/深度学习
构建基于AI的语音合成系统:技术探索与实践
【6月更文挑战第3天】本文探讨了构建基于AI的语音合成系统,包括文本预处理、声学模型、语音生成和后期处理四个步骤。关键技术和挑战涉及分词、词性标注、语调预测、HMM、DNN、RNN模型、波形合成及后期音质优化。实践中,获取高质量语音数据、训练计算资源和系统实时性是主要挑战。随着技术进步,未来语音合成将在多语种、个性化领域有更多应用。
|
1天前
|
人工智能 搜索推荐 数据处理
如何利用AI技术提高教育评估的效率和准确性?
【6月更文挑战第2天】如何利用AI技术提高教育评估的效率和准确性?
10 2
|
2天前
|
人工智能
如何优化人工智能人才培养体系以适应快速发展的AI技术?
【6月更文挑战第1天】如何优化人工智能人才培养体系以适应快速发展的AI技术?
12 4
|
2天前
|
人工智能 算法 大数据
确保AI技术健康发展的关键策略
【6月更文挑战第1天】确保AI技术健康发展的关键策略
12 6
|
2天前
|
人工智能 数据安全/隐私保护
对于AI技术的滥用现象,我们应该如何提高公众的认识和理解?
【6月更文挑战第1天】对于AI技术的滥用现象,我们应该如何提高公众的认识和理解?
106 59
|
2天前
|
人工智能 算法 网络安全
AI技术被滥用的原因是什么?
【6月更文挑战第1天】AI技术被滥用的原因是什么?
10 5
|
机器学习/深度学习 人工智能 自然语言处理
与世界同行 2017中国人工智能大会有感
与世界同行 2017中国人工智能大会有感
1905 0
与世界同行 2017中国人工智能大会有感
|
人工智能 自动驾驶
2019年上半年收集到的中国人工智能发展详情文章
2019年上半年收集到的中国人工智能发展详情文章
|
人工智能 芯片
中国人工智能计划,我来说几句
中国人工智能计划,我来说几句