您的浏览器禁用了JavaScript(一种计算机语言,用以实现您与网页的交互),请解除该禁用,或者联系我们。[未知机构]:英伟达 CUDA vs AMD ROCm 生态圈差距研究 - 发现报告

英伟达 CUDA vs AMD ROCm 生态圈差距研究

2024-01-21-未知机构E***
英伟达 CUDA vs AMD ROCm 生态圈差距研究

时间:2024年1月17日专家:某AI芯片生态圈资深技术专家主持人:HongjunYou,久谦中台分析师 核心洞察 1.ROCm当前核心痛点: a.兼容只能追赶,不可能超越,转译带来的性能损失难避免b.底层框架支持不足+算子库丰富度差距大 2.生态圈主要用于训练+推理,提取/变形/加载/存储属于解决数据问题 3.CUDA和ROCm核心区别: a.推出时间:CUDA更早,积累更多,AMD做为后发者起步晚+研发实力上有所差距b.软件生态:在基础设施上,两者差不多,但丰富度(算子库+算子融合)+用户数是当前最大痛点c.框架迁移:在训练推理过程中,当开发者需要做框架迁移,CUDA这块支持显著优于ROCmd.底层框架支持:ROCm目前在底层框架支持上,只针对少数主流框架,CUDA相对完整很多,且底层框架软件商会优先适配英伟达硬件e.开元跟闭源:ROCm做为后发者使用开源生态抢占使用者,CUDA则是全闭源f.编译器:ROCmHCC通用性更强,NVCC只针对英伟达硬件去做的,在使用上专家认为主要是用户习惯的差异,其余差异不大 4.训练和推理对生态圈的依赖度差异:训练上,专家认为优先选择肯定是英伟达,推理端则可能选择其他厂商,AMD这块做到全兼容CUDA会有一定优势 a.训练:精度要求较高,包含前向记算+反向记算,反复验证修改参数b.推理:只需前向记算即可 5.CNN到Transformer对CUDA壁垒影响:专家认为架构迁移对CUDA壁垒影响有限 a.硬件端:核心基础都是卷积神经网络,但算子设计有所不同,对硬件端提出计算单元核新的要求,从这个角度利好英伟达这类硬件设计能力强的厂商b.软件生态端:架构转变对ROCm等后进生态圈有利,差距上有所缩小,但专家认为实际上差距还是很大,架构迁移对CUDA壁垒影响有限 6.从生态圈角度出发,训练用英伟达,推理用AMD是否可行:专家认为是可行的,针对大部份情况下,转换成本不高,主要原因是ROCm完全兼容CUDA,ROCmAPI接口完全仿照CUDA做出来 7.ROCm兼容CUDA难点:转译带来性能损失+CUDA算子库更新后需重新适配 a.当英伟达硬件更新,对应算子库更新,ROCm需重新适配,适配过程中,ROCm用户用不了相关功能b.在同等算力条件下,既使用ROCm转译后,上层还是CUDA,下层换成ROCm软件栈,这块操作系统的改变会带来性能上的受损,实测下来,ROCm相对CUDA性能会差10%左右 目录 Q:生态圈的建立流程?过程中芯片厂商和软件提供商之间的关系如何? A:从AI生态圈来讲,AI是由软件加硬件的系统组合而成,所以谈生态圈要结合软件和硬件两者。硬件涉及到芯片供应商,国际上最著名的是英伟达。在硬件之上是AI的基础软件栈,涉及到硬件在系统层的驱动,还有GPU硬件或者AI芯片的运行时库。再者是对用户暴露的API接口,还有一些其他相关库,比如基础数据库、AI算法、图像图形编解码等,这一系列构成了整个AI的软件栈或者称作生态圈,这是针对底层的软件栈。在这之上还有深度学习的编译框架。深度学习框架包含了训练和推理两个方向和应用场景。 训练框架更偏向于应用场景,类似于在操作系统之上的应用软件。训练框架更偏向于给做AI应用的科研机构、高校,提供一个方便使用AI芯片、软件栈的深度学习框架,更专注于做AI模型或者AI的技术研究,而不是专注于技术软件栈或硬件方向。从下往上依次是硬件、操作系统、驱动、运行时编程模型和外部工具、学习框架,构成了整个AI的软件栈或生态。在此基础之上才有了在CV领域内的CNN,以及现在流行的Transformer等AI模型和新技术的应用发展。 从芯片厂商的角度来看,需要从底层一直往上做,可以做到深度学习框架,也可以只做到AI软件栈这一层,给用户提供编程模型和API接口。从这个角度来看,AI芯片厂商做的工作更多一些。而深度学习框架则站在比较宏观和应用角度,所以他们所做的工作相对偏向于应用,与具体的硬件会有一定的差距。软件提供商范围相对宽泛,因为软件的定义很大,做基础软件栈还是做框架,还是做AI模型和应用,大家所处的角色不同,要开发和建立生态圈的流程也会有差别。 Q:横向对比CUDA和ROCm,开发者开发过程包括提取、变形、加载、存储、训练、推理,目前生态圈在哪个环节差异最大?原因是? A:提取,变形,再到存储加载,训练推理,这是从AI偏上层的模型研发或应用开发的角度来讲。AI的三大要素包括算力、算法和数据。提取、变形、加载、存储,更多的是解决数据问题,即怎样获取海量的数据,并通过提取变形把数据转换成或脱离出所需要的信息,用于后续的模型训练。这些过程不仅AI领域使用,包括五六年前的大数据领域,也涉及到提取、变形、加载、存储等过程。 到了AI领域才有了训练,有数据、算法、AI模型、AI芯片强大的算力,就可以实现一个解决特定领域的算法,在AI芯片上通过收集和提取的数据把模型训练出来,训练出来之后再去做后续的推理。推理相当于把模型训练出来之后,对这个模型做应用。 CUDA和ROCm大同小异,从芯片供应商的角度来讲,都是为了给芯片使用者或者AI的开发者,提供一个更方便使用AI芯片、异构计算的计算机模型的软件栈,都是方便用户使用他的CPU或DSA,从这个角度来看,二者解决的需求相同。 二者的区别在于CUDA推出的时间比较早,在2006年的时候,英伟达已经开始推CUDA,当时CUDA比较难用。经过了10多年的发展,2015年开始AI成为比较热门的发展方向。再加 上在图形图像和并行计算领域,英伟达本身就已经是国际上最著名的公司,所以不管是高校还是企业,天然地就会选择N卡。从这个角度来讲,英伟达赶上了这一波风口浪潮,再加上CUDA做并行计算的研发时间要早很多,就带来了这种无与伦比的优势。再者,多年来英伟达在这个方向上持续进行研发投入、高校和企业持续应用CUDA,对其生态的发展都做出巨大贡献,导致目前无论是做训练还是做推理,CUDA都是最优选择。 至于ROCm,在2015年AI浪潮兴起之后,AMD才开始做并行计算、AI计算领域的软件生态,相对来说起步更晚一些。再加上AMD的研发实力也不如英伟达强劲,所以软件栈的丰富度和好用程度相比英伟达的CUDA来说要差很多。并且AMD芯片本身的迭代速度和算力,与英伟达的迭代速度和架构变化发展相比也有不小差距。这一系列因素导致无论是AMD还是国内做GPU的芯片厂商,想用ROCm开源软件栈兼容CUDA方案去做AI技术软件栈都很困难。 总体来说,应该有的东西ROCm基本上都已经有了,比如软件生态中的硬件、AI软件栈、驱动、运行时间模型、加速库、开发环境和工具包,不过相对来说使用人群较少,导致没有那么好用。国内做Android手机操作系统的厂商,尤其是像华为的鸿蒙OS,其实2010年Android操作系统刚推出时也非常难用,现在这么好用是因为在使用中不断发现问题,并持续进行优化,类似于这样一个过程。 ROCm没有踩在合适的时间点,相对落后于CUDA,再加上AMD对ROCm卡的支持欠缺。所以目前使用AMD这套来进行AI模型的训练和推理并不是特别好的选择。 Q:训练和推理分开来看,推理部分ROCm和CUDA会有非常大的使用体验差异吗?还是说差异主要发生在训练端? A:首先要明确训练是什么,推理是什么。训练是一个AI模型或算法,将数据输入给算法,算法反复读取之前收集和整理的数据并进行学习,学习之后更新算法中的权重参数,优化损失函数,使模型精度越来越高,最后使这个模型在解决特定问题时能满足精度要求和实际应用需求。在训练的阶段有前向计算和反向计算,前向计算是把数据让模型运算一遍,观察计算结果是什么。反向计算是把模型前向计算得出的结果与真实模型数据的标签值进行对比,即与数据应该得出的结果对比,比较模型前向计算结果与真实结果的差距,并进行反向调整参数。 推理相对简单,只是进行一次前向计算得出结果,在生产环节中用训练好的AI模型进行特定领域的计算,通过推理可以得到想要的结果。从这个角度来看,训练和推理的计算复杂度不同。ROCm和CUDA在使用的层面还存在不小差距。比如在PyTorch上训练一个模型或者用PyTorch构建一个模型结构,发现他不能满足要求,想把他迁移到其他框架中进行训练,对于CUDA生态来说,有很多工具和方法可以实现模型在不同框架间的迁移。 在PyTorch训练好的模型,需要落地做推理,CUDA也有很多丰富的工具和组件,即之前提到的AI软件栈组件,可以帮助开发者在N卡上或国内其他专门做推理的芯片厂商的卡上运行模型推理,CUDA都有相应的工具来实现。而ROCm对于目前主流的深度学习框架来说确实存在 一定差距和代沟,在PyTorch、TensorFlow有适配ROCm的工具,但在一些小众的深度学习框架,像MSI以及百度、飞桨PaddlePaddle等都没有。 这导致高校或者公司在一些比较小众的场景时,没有使用PyTorch,使用了MSI、百度、飞桨PaddlePaddle等小众学习框架,这时如果用ROCm做训练或做云端、边缘端甚至终端的推理,无形中就增加了很多门槛,甚至完全不可用。所以从生态的角度来讲,ROCm还是有不少的工作要做。 Q:PyTorch和TensorFlow唯一差别就在功率?可否理解为算子库之类的要素,更多靠用户使用积累成更多算子库,方便后续新开发者快速提取使用? A:对,这是其中一部分。算子库一部分是芯片厂商自己针对硬件实现优化后的算子。比如CUDA中的cuDNN和cuBLAS,他们与特定的硬件有深度绑定和深度优化。你提到的是其中一个主要原因,结合框架层面,当英伟达推出一个新的硬件时,他能够快速地将CUDA升级成新的版本,以适配新的硬件,比如推出了H100,可能会增加一些针对Transformer特定算子的硬件单元,整个算子库需要做调整,对H100的算法进行优化或增加新算法,用户在框架上看不到这些变化。 问题是框架层能否快速兼容新的硬件。比如PyTorch和英伟达之间的关系是,PyTorch最初做出来时就是在N卡上实现,所以他对N卡的支持最积极、最及时。但对于ROCm,2023年下半年AMD发布了MI300,ROCm已经更新到6.0.0和6.0.1,但PyTorch只适配到了ROCm的5.4.2,连5.6.0都没有。而且算子库、数据库与软件栈有关联关系,导致框架无法及时适配最新的软件栈或算法数据,所以ROCm在这方面存在较大的风险。AMD最新的790卡在PyTorch的2.0或2.1上不能用,而且无论是AMD还是PyTorch官方,都没有提供一个兼容最新版本的PyTorch安装包。 Q:ROCm更新后,PyTorch要主动对应ROCm做适配,还是ROCm来做? A:目前PyTorch只会适配N卡,和N卡适配的积极性和及时性是最高的。对包含AMD的其他厂家都不是这么积极。PyTorch官方不会主动适配A卡,需要AMD等芯片厂商主动去适配PyTorch最新的版本或者TensorFlow最新的版本。当新出硬件或者PyTorch新发布的版本,如果变动比较大,芯片厂商主动要去适配PyTorch。至于能不能在他的官方发布版本里面体现,也取决于公司的实力。 Q:最近AMD和Meta的合作越来越多,减少适配是否不再是主要问题,因为ROCm升级后可能会出现PyTorch不支持的情况,给用户带来很大影响? A:目前AMD开始与PyTorch深度合作,协同开发其A卡,大概是在四五年前开始,到现在已经取得了一定的阶段性成果。但是距CUDA的无差别体验还存在一定的差距。但是根据AMD目前的研发实力和在半导体市场的国际竞争能力来看,这只是时间问题,具体多长时间不确定。在2023年10月份和11月份,我自己用7600和7900的时候,使用的是PyTorch1.8和1.9,最新版本2.0就不支持,需要自行将官方的2.0、2.1版本的源码下载下来,与ROCm最 新版本的5.6、6.0的源码一起编译,这给开发者