原文:
https://zhuanlan.zhihu.com/p/720788384
今年GPU话题异常引人关注,多方面因素导致GPU话题几乎无处不在:
大模型带来大量GPU算力需求,工程师开始学习GPU编程从而入门大模型Infra;
NVIDIA股价屡创新高,一己之力带飞美股,让很多投资人关注GPU产业的商业前景;
中美脱钩导致GPU禁运,吃瓜群众关注国内能不能造出自己的GPU替代品。
现在漕河泾的出租车司机也能和你聊两句GPU。
谈到GPU,就离不开CUDA,和最近沸沸扬扬的CUDA护城河的话题。
“CUDA 护城河理论” 主要是指 NVIDIA围绕其 CUDA技术构建的一系列竞争优势,使得其他竞争对手难以轻易进入和挑战其在相关市场的领导地位,让它在3万亿市值基础上可以继续高歌猛进。
CUDA作为GPU的编程模型,也是和我们MLSys从业者最相关的话题。
这篇文章谈谈我对CUDA护城河理论的一些不成熟的看法。
我与CUDA
我是一个老CUDAer,从2014年算起写CUDA已经已经整整十年多了。写CUDA也是我安身立命的看家本领,在我的学业和工作发展阶段都发挥了关键作用。
2014年我在清华高性能所做本科毕业设计,题目是用GPU加速共轭梯度法(PCG)求解系数矩阵为稀疏矩阵的线性方程组,那时候需要用cuSPARSE函数开始接触CUDA。2014年我博士第一个独立负责的横向项目是为一种用在石油物探领域的叫ETE的创新性的有限差分方法做GPU版本开发,它被用在中石油东方物探研究所的国产地震成像软件GeoEast-Lightning中。2019年,我博士毕业参加工作,落脚的第一个项目做了TurboTransformers,一个对标FasterTranformers的Transformers类模型加速引擎,这个项目让我工作半年走绿通晋级,论文发表后还引起了NVIDIA CEO老黄的关注(开始我也不信,NV的AE告诉我老王给他发邮件说的)。我也第一时间关注到了OpenAI Triton,21年那时候OpenAI发布了Triton,我的leader当时就建议可以用Triton重写一遍TurboTransformers,不过我忙别的事情没有付诸实践。
2014年,离CUDA第一次出现的2006过了七年,当时GPU还是Fermi架构,CUDA学习资料很匮乏,最权威的文本资料是官方指南CUDA Best Practice,中文视频资料是台湾大学里老师讲的课程,里面很多叫法和大陆都不一样,比如管线程叫序,让我记忆犹新。
2014年,NVIDIA会给高校做HPC的实验室免费送卡供学生实践CUDA,因此我们实验室有各种型号的GPU可供测试。但到Pascal架构开始就不免费送了,也正是那个时候深度学习崛起。
2014年,CUDA是为科学计算设计的。为了加速科学计算应用,还要学CUDA fortran。从CPU移植程序到GPU是最常见的工作,CUDA有OpenACC这种编译指导语句来减少移植负担,对于上几万行fortran代码向GPU移植,OpenACC救了老命。
2014年,CUDA的入门程序是3D stencil加速,通过这个例子你不仅可以理解grid、block、thread的线程组织方式的抽象,还能理解shared memory,registers等内存概念。那时候,我心中最高深的CUDA相关的研究是用多面体(polyhedral)方法做stencil的自动优化。CPU还是绝对的霸主,NVIDIA发布某类应用加速数据时候都要和最新的CPU性能做对比,最初的AI应用也是如此。Intel会辟谣GPU相比CPU加速几十倍都是扯淡,顶多相对CPU加速2、3倍,数据中心Xeon芯片的地位不可撼动。
2014年,加速卡还有Intel Xeon Phi,编程和CPU一样。NUDT造的超算,天河1A用了NVIDIA GPU,天河2用的Xeon Phi。GPU在科学计算中的也是有竞争对的。
CUDA的诞生
想要理解CUDA的现在,就需要了解他的过去,想要预测CUDA的未来,也需要从它出生的原点找答案。
NVIDIA 1993年成立之初是做游戏显卡的,90年代美国做显卡公司如过江之鲫,NVIDIA和47家显卡公司玩大逃杀,存活了下来。2000年左右,主要的显卡公司剩下NVIDIA(N卡)和ATI(A卡)两家。
GPU只用来打游戏那格局就小了,2000年初,美国高校计算机系研究人员开始hack GPU去运行复杂的科学计算领域的并行任务。2004年,斯坦福一个博士生Ian Buck进入英伟达实习,创造了
GPGPU编程模型
,他当时发表的论文《Brook for GPUs: stream computing on graphics hardware》摘要这样写到:
在这篇论文中,我们介绍了Brook for GPUs,这是一个用于可编程图形硬件上通用计算的系统。Brook扩展了C语言,增加了简单的数据并行结构,使得GPU可以作为流式协处理器使用。我们提出了一个编译器和运行时系统,该系统抽象和虚拟化了图形硬件的许多方面。此外,我们还对GPU作为计算引擎的有效性进行了分析,与CPU进行了比较,以确定在特定算法中GPU何时能够超越CPU。我们通过五个应用对我们的系统进行了评估,包括SAXPY和SGEMV BLAS操作符、图像分割、FFT和光线追踪。对于这些应用,我们证明了我们的Brook实现与手工编写的GPU代码性能相当,并且比其CPU对应版本快至七倍。
所谓GPGPU就是General-Purpose GPU,GPU不仅是做游戏的图形学运算,还要做CPU能做的任务,而且有些任务做得更好(注意上文中加粗部分)!自此,NVIDIA开始进军科学计算领域,而CUDA正是为此应运而生的统一编程接口。Ian Buck毕业后也加入了NVIDIA,来开发CUDA去商业化他的学术构想。
CUDA 2006 正式发布,不过反响非常冷淡,华尔街不买账,认为GPU去做科学计算没有任何商业前景。但英伟达坚持将大笔资金投入到CUDA的研发中,为了把旗下的所有芯片都纳入CUDA的架构里,NVIDIA为此投入了巨大研发费用,有人说是累计投入超过百亿,但我没找到具体数据来源,公开资料应该都是总的研发费用,没法单独算CUDA部分的,不过NVIDIA确实给CUDA很大支持。经过多年努力,NVIDIA在GPGPU上初见成效,2010年我国NUDT的Tianhe-1A,2011年日本东京大学的Tsubame 2.0,2012年美国橡树岭国家实验室的Titan都适用了NVIDIA GPU。中美日三大超算强国都开始用NVIDIA GPU组建超算中心。
2010年代前期,NVIDIA是比较迷茫的,消费的游戏GPU卡增长有限,进军移动处理器芯片失败,科学计算不温不火,股价也是十年一蹶不振,直到深度学习的出现。
2012年,Geoffrey Hinton研究组用深度神经网络刷新了ImageNet,网络结构是大名鼎鼎的AlexNet,用了两块 GTX 580 GPU训练。AlexNet三位作者,一作Alex Krizhevsky后来脱离技术圈现在在搞投资,二作成为OpenAI首席科学家引领了AGI潮流的的Ilya Sutskever,三作是图灵奖得主Hinton。
用CUDA来做AI研究,Hinton是先行者。2009年,Hinton带领的研究团队利用CUDA在GPU上训练了一个识别人类语音的神经网络,结果超级好。他在那年的学术会议上展示了这些成果,并联系了 NVIDIA说“我刚告诉了一千名机器学习研究人员他们应该购买 Nvidia 显卡。你们能免费给我一张吗?”但是,NVIDIA拒绝了。
从AlexNet开始,NVIDIA借助CUDA先发优势,牢牢把握了时代脉搏,从cuDNN到NCCL,从Caffe到PyTorch,从TensoRT到Megatron-LLM,AI软件栈牢牢和CUDA生态绑定。这个时代很多人都亲历过,无须赘述。
论CUDA护城河
总结一下上一章节,CUDA 最初是为科学计算而设计的,NVIDIA 寻求在消费级游戏显卡之外开拓新的市场机会。通过发展CUDA,NVIDIA 成功找到了在数据中心等高性能计算领域的第二增长点。
大模型出来之后,NVIDIA GPU的产能供不应求,且毛利巨高,《巴伦周刊》资深撰稿人Tae Kim估计一张GPU利润率1000%。但我觉得这个有点危言耸听,这是只算原材料不包括研发成本,和声称一百美元成本是17美分一样,不过NVIDIA毛利高也是众所周知的事实。
如此大的利益,不免有人觊觎。既然NVIDIA也是用台积电代工,为什么不能设计同样算力规格芯片,取代NVIDIA。
这就诞生了CUDA护城河理论。该理论认为即使造出和NVIDIA一样GPU,配套了同样互联网络,仍然绕过CUDA让别人是用你的硬件系统。
我们可以进一步拆解该理论的深层含义:
先讨论历史包袱护城河:这个说法类似intel x86护城河。x86是intel的指令集架构ISA,最初由 Intel 于 1978 年随 Intel 8086 微处理器推出。x86 是一种 CISC架构,即使后面有更好的RISC ISA架构,但因为大量个人电脑的应用都是在x86上搭建的,如果切换成其他指令集,无法承担巨大了历史包袱。
x86护城河让intel在个人电脑和数据中心在长期独孤求败,躺着赚钱。但是到移动时代x86护城河还是被攻破了,具体说就是intel拒绝了iphone的处理器订单导致Apple转而用ARM那一刻。因为手机是一个新的计算平台,没有历史包袱,一切都可以重来。
CUDA是为科学计算而设计的,并在此基础上长出了一套很深的AI软件栈。第一层BLAS、FFT等Library,第二层是TensorRT、PyTorch、TensorFlow等Framework,第三层是DeepSpeed、Megatron-LM、NCCL等Distributed System。
大模型应用CUDA部分的历史包袱其实并不大。如下图所示,AI只用了CUDA Library的一小部分,很多非AI的科学计算、光线追踪的函数并不需要。其次,大模型有只用了Software层的一小部分,PyTorch Aten 2000多个算子,大模型可能只用几十个。最后,Distributed System中网络通信的组件和CUDA无关。
对于非大模型类的存量AI软件栈导致的CUDA护城河,2023年 Intel CTO Greg Lavender有一妙计可解。面对一大堆专为英伟达CUDA平台编写的遗留代码,他建议用LLM将这部分代码转换成可以在其他AI加速器上运行的代码,用魔法打败魔法。如果大模型在AI领域算力需求能占八成,把剩下两成非大模型的AI算力需求留给CUDA也未尝不可。