为何谷歌的输给了,超越谷歌
发表时间:2023-11-05 18:01:01
文章来源:炫佑科技
浏览次数:182
菏泽炫佑科技
为何谷歌的输给了,超越谷歌
作者|迪伦·帕特尔
译者| 马可伟
规划| 蒂娜
在过去的十年中,机器学习软件开发的格局已经发生了变化。 精简架构由打造。 这些框架大多数都严重依赖 的 CUDA(统一计算架构),并且在 GPU 上具有*佳性能。 然而,随着2.0、2.0的到来,凭借其软件护城河在该领域的主导地位可能无法得到保证。
本报告将涵盖以下主题:谷歌为何失败、谷歌为何未能利用其在人工智能领域的早期领先地位、机器学习模型训练时间的主要组成部分、内存容量、带宽、成本墙、模型优化、为什么其他人工智能硬件公司至今未能撼动的统治地位,为何硬件的地位逐渐变得重要,在CUDA上的竞争优势如何消失,以及的竞争对手在芯片训练上取得了大云胜利的显著成果。
简而言之,问题在于 的闭源 CUDA 将不再涵盖机器学习模型的默认软件堆栈。 虽然抓住了机会,但却让Meta和Meta后来居上,控制了软件堆栈。 英伟达专有工具的失败导致后者在生态系统中建立自己的工具,英伟达的护城河被永久削弱。
与
就在几年前,在相当分散的框架生态系统中,拥有*常用框架的谷歌是领导者,设计并部署了唯一成功的人工智能指定应用加速器TPU。 他们似乎已经占据了领先地位,并做好了统治的准备。 机器学习行业。
2019年机器学习框架现状,掌握研究领域,掌握行业领域
但事实是,它赢了,但谷歌未能将先发优势转化为在新兴机器学习行业的主导地位。 如今,谷歌使用自研的软件和硬件堆栈,而不是相应的GPU,这使得其在机器学习界的地位相当尴尬。 谷歌甚至还有另一个名为 Jax 的框架与其直接竞争。
不仅如此,还有传言称,谷歌在搜索和自然语言处理领域的主导地位将因大型语言模型而下降,尤其是来自利用各种 API 或基于类似基本模型的初创公司。 虽然这可能有点没有根据,但我们今天不讲这个。 目前,尽管面临持续的挑战,谷歌仍然处于机器学习模型的前沿。 发明的东西在PaLM、MUM、TPU等很多领域仍然是*先进的。
让我们回到赢得一手牌的话题。 虽然也有从手中夺取控制权的因素,但主要的胜利还是其相对较高的灵活性和可用性。 从原理至上的角度来看, 与 的区别在于前者采用的是“动态图形模式(Eager Mode)”而不是“图形模式(Graph Mode)”。
动态图形模式可以被视为执行脚本的标准方式。 深度学习框架在调用时立即逐行执行所有操作,就像任何代码执行一样。 因此,更容易调试和理解代码,操作之间的结果和模型性能也更直观。
相反,图形模式有两个阶段。 **阶段定义需要执行操作的计算图。 计算图是一系列表示运算和变量的相交节点,连接节点的边表示它们之间的数据流。 第二阶段定义了延迟执行计算图的优化版本。 因为我们无法知道图的执行过程中发生了什么,所以这种分阶段的方法使得调试代码更具挑战性且更难以理解。 这类似于“解释型”和“编译型”编程语言,可解释调试比 C++ 更容易。
虽然动态图模式现在也默认可用,但它是研究社区和大多数大型科技公司已经习惯的解决方案。 如需更深入的解释,请参阅此处。 简而言之,使用的是主流AI会议上*好的非谷歌生成式人工智能。
机器学习训练组件
*终,有两个主要因素影响训练机器学习模型所需的时间: 1. 计算(FLOPS),即在每一层内运行密集的矩阵乘法 2. 内存(带宽),即等待数据或层权重来获取计算资源。 常见的带宽受限操作包括归一化、点操作和 ReLU。
曾经主要影响机器学习训练时长的计算时间、等待矩阵乘法等因素,随着 GPU的不断发展,已经不再重要。 摩尔定律下的FLOPS 摩尔定律下的FLOPS提升了几个数量级,但主要的架构变化仍然集中在张量核心和低精度浮点格式上,内存方面并没有太多变化。
GPU 增长趋势
2018年的BERT模型和的GPU V100都是那个时代的顶级产品。 不难发现,矩阵乘法不再是提高模型性能的主要因素。 从那时起,*先进的模型的参数数量增长了三到四个数量级,*快的 GPU 也增长了一个数量级。
中型经营类别占比
即使在 2018 年,纯计算工作负载也占 FLOPS 的 99.8%,而仅占用运行时间的 61%。 与矩阵乘法相比,归一化和逐点运算分别降低了 250 倍和 700 倍的 FLOPS,但也消耗了模型近 40% 的运行时间。
记忆墙
随着模型规模不断扩大,大型语言模型本身的权重就占据了数千亿甚至TB。 百度和Meta部署的生产推荐网络中的大规模嵌入表可以占用数十兆内存。 大型模型训练或者推理的大部分时间并不是花在矩阵乘法计算上,而是花在等待数据上。 到达计算资源。 您可能会问,为什么架构师不将更多内存放置在更靠近计算模块的位置? 答案只有一个字,贵。
存储层次结构
存储层次结构遵循从紧密、快速到缓慢、廉价的模式。 共享内存池*近可以位于同一芯片上,通常由 SRAM(静态随机存取存储器)组成。 一些机器学习 ASIC 尝试使用大型 SRAM 池来节省模型权重,但即使是价值约 500 万美元的晶圆级芯片也只有 40G 的 SRAM。 我们没有足够的内存来保存超过 100B 的参数模型权重。
的架构通常在芯片上使用较小量的内存。 当前一代 A100 包含 40MB 内存,而下一代 H100 只有 50MB。 台积电 5 纳米工艺节点上的 1GB SRAM 需要大约 200 平方毫米的硅。 包括相关控制逻辑和结构的实现自动化软件开发,需要超过400平方毫米的硅片,或者说使用了数据中心GPU总逻辑面积的50%左右。 。 考虑到A100 GPU的价格超过1万美元,H100的价格可能会在2万美元起。 从经济角度看,这条路是不可行的。 即使我们忽略 在数据中心 GPU 上 75% 的毛利率(大约是四倍的涨幅),实现产品全面生产所需的每 GB SRAM 内存的成本仍然在 100 美元左右。
此外,片上SRAM存储器的成本不会随着传统摩尔定律带来的工艺技术的缩减而下降太多。 在下一代台积电3nm工艺技术下,同样1GB内存的成本实际上是在增加的。 虽然3D SRAM会在一定程度上降低SRAM成本,但这只是价格曲线的暂时下降。
存储器层次结构中的下一级是紧密耦合的片外存储器 DRAM。 与 SRAM 相比,DRAM 的延迟要高一个数量级(大约 100 纳秒 vs. 10 纳秒差异),但 DRAM 也便宜得多(DRAM 为每 GB 1 美元,SRAM 为每 GB 100 美元)
DRAM 几十年来一直遵循摩尔定律。 事实上,当戈登摩尔创造“摩尔定律”一词时,英特尔的主要业务是DRAM。 摩尔对 2009 年之前 DRAM 的晶体管密度和成本的经济预测总体上是准确的,但自 2012 年以来 DRAM 成本几乎没有改善。
每 GB DRAM 价格
我们对内存的需求只会不断增加,目前 DRAM 占服务器总成本的 50%。 记忆墙的存在开始出现在产品中。 与 2016年的GPU P100相比,2022年刚刚发布的GPU H100显存容量提升了五倍(从16GB到80GB),而FP16性能则提升了整整46倍(从21.1到989.5)。
容量瓶颈与同样重要的带宽瓶颈密切相关。 并行化是增加内存带宽的主要手段。 如今的 DRAM 每 GB 成本仅为几美元。 为了实现机器学习所需的巨大带宽, 使用由 3D 堆叠 DRAM 层组成的 HBM 内存。 设备并需要更昂贵的包装。 HBM 的价格范围为每 GB 10 至 20 美元,包括包装和批量成本。
A100 GPU 中多次提到内存带宽和容量限制。 未经广泛优化的 A100 通常 FLOPS 利用率极低。 FLOPS利用率的计算方法是(模型训练期间计算的总FLOPS)/(GPU理论上可以计算模型训练期间的FLOPS)。
即使顶尖研究人员进行了大量的优化,60% 的 FLOPS 利用率对于大型语言模型训练来说也被认为是非常高的。 其余时间是开销,包括等待其他计算或内存数据的空闲期,或即时重新计算结果以减少内存瓶颈。
A100 和 H100 两代之间 FLOPS 提升了 6 倍以上,但内存带宽仅提升了 1.65 倍,这引发了很多人对 H100 利用率低下的担忧。 人们想出了很多变通办法让A100绕过内存墙,这些努力恐怕在H100上只会多很多。
H100在架构中引入了分布式共享内存和两级组播,其中不同的SM(可以视为核心)可以直接写入其他SM的SRAM(共享内存/L1缓存)。 这一举措有效地增加了缓存大小,同时减少了 DRAM 读写所需的带宽。 后续架构还将通过减少内存传输来减轻内存墙的影响。 值得注意的是,由于对 FLOPS 的需求随着参数数量的增加而呈三次方扩展,而对内存带宽和容量的需求往往呈二次曲线发展,因此较大的模型往往会实现较高的利用率。
算子融合——治标不治本
就像机器学习模型训练一样,只有了解你当前的状态,才能更准确地执行重要的优化。 例如,如果我们处于内存带宽受限状态并且所有时间都花在内存传输上,那么增加 GPU FLOPS 并不能解决问题。 而如果你处于计算受限的状态,并且繁琐的矩阵乘法非常耗时,那么尝试通过将模型逻辑重写为 C++ 来降低成本是无效的。
虽然 GIF 模式通过增加灵活性和可用性赢得了竞争,但 GIF 模式并不完美。 动态图模式下执行的每个操作都需要从内存中读取、计算,然后发送到内存,然后才能处理下一个操作。 在没有进行广泛优化的情况下,该模式将显着增加内存带宽要求。
因此,在动态图模式下执行模型的主要优化手段之一就是算子融合。 使用融合算子代替每次将中间结果写入内存,一次计算多个函数,从而尽可能减少内存的读写。 算子融合改进了算子调度并降低了内存带宽和容量成本。
算子融合图
这种优化通常需要编写自定义的 CUDA 内核,这比简单使用脚本要困难得多。 内置的解决方法长期以来一直在越来越多的运算符内部实现,其中许多运算符只是将多个常见操作组合成一个更复杂的函数。
算子的加入使得模型创建变得更加容易,并且随着内存读写次数的减少,动态图模式的性能也更快。 但随之而来的代价是,运营商的数量在短短几年内就膨胀到了两千多家。
人们常说软件开发人员很懒,但说实话,谁不是呢? 在熟悉了一个新的算子后,开发人员通常只认为这个新的算子可以节省一些代码,而完全没有意识到性能的提升。
此外,并非所有操作都可以集成。 大多数时间我们花在决定组合哪些操作以及将哪些操作分配给芯片和集群级别的特定计算资源。 虽然一般来说,算子融合的策略有些相似,但根据架构的不同,它们可能会有所不同。
英伟达是王者
从运营商数量的增长及其默认的优先地位中受益匪浅。 快速优化的每个算子都是特定于 架构的,不适用于其他硬件。 任何人工智能硬件初创公司想要全面实施它,都必须依靠高性能来本地支持两千多个且不断增长的运营商。
在 GPU 上训练具有高 FLOPS 利用率的大型模型需要越来越复杂的技术,并且需要更多技巧来实现*佳性能。 动态图模式和算子融合的执行意味着软件、技术和模型的开发必须被迫适应*新一代GPU的计算和内存比例范围。
内存墙是任何机器学习芯片开发者都无法逃脱的宿命。 ASIC 必须能够支持通用框架,同时还支持混合使用 和外部库的 GPU 优化代码的默认开发策略。 因此,为了获得更高的FLOPS和更严格的编程模型而主动放弃GPU的各种非计算包袱是非常没有意义的。
易用性才是王道。
打破这种恶性循环的唯一方法是将 GPU 上运行模型的软件尽可能无缝地迁移到其他硬件。 随着2.0、MLOps、MLOps等公司提供的模型架构稳定性和抽象性逐渐获得主流认可,芯片解决方案的架构和性价比逐渐取代优秀软件带来的易用性,成为购买力的驱动力。 主要因素。
2.0
该基金会成立仅几个月,现已正式脱离 Meta 的控制。 结合向开放开发和管理模式的转变,2.0 的早期测试版已经发布,预计将在 2023 年 3 月上市。2.0 与上一代的主要区别在于增加了新的编译解决方案,支持图执行模型,更方便地利用各种硬件资源。
2.0在 A100上的训练性能提升了86%,CPU上的推理提升了26%,大大减少了模型训练所需的计算时间和成本。 这种性能提升还可以扩展到多种 GPU 和加速器,包括 AMD、Intel、Tesla、、、、Meta 等。
2.0 的性能提升在未优化的硬件上更加明显。 Meta 和其他公司做出巨大贡献的背后是希望在其价值数十亿美元的训练集群上以*小的努力实现更高的 FLOPS 利用率,并使他们的软件堆栈更容易移植到其他硬件,从而为机器学习领域引入新的竞争力。
分布式训练也受益于 2.0,为数据并行、分片、管道并行和张量并行提供了更好的 API 支持。 此外,2.0还通过全栈提供了对动态图形的原生支持,使得LLM更容易支持不同的序列长度。 这也是主流编译器首次支持从训练到推理的动态形状。
编写一个完全支持除 GPU 之外的任何机器学习 ASIC 的全部 2000 个左右运算符的高性能后端是非常具有挑战性的。 然而,在保证*终用户相同可用性的同时,可以将算子数量减少到约250个原始算子,使非后端实现更简单、更容易,定制硬件和操作系统的供应商也更容易提出自己的软件堆栈。
健壮的图定义是向图范式过渡的必要条件,而 Meta 和过去五年在该领域的解决方案尝试一直存在明显的缺陷,直到 . 它可以接收任何用户脚本并生成 FX 图表,甚至是调用第三方外部库的脚本。
所有复杂操作都被压缩为大约 250 个原始操作符。 图形成后,所有未使用的操作将被丢弃。 形成的图决定了哪些中间操作需要存储或写入内存,以及哪些中间操作可以被融合。 这种方法大大减少了模型中的开销,并且对用户不敏感。
目前,在不修改任何源代码的情况下,已经通过了7000多个模型的可行性测试,其中包括来自.、Meta、、.AI的模型。 这7000多个模型是直接从*受欢迎的项目中挑选出来的。
、Jax等图模型的执行管道通常要求用户保证模型与编译器架构的兼容性,以保证图能够被捕获。 通过启用部分图像捕获、受保护的图像捕获和即时重新捕获,这一点得到了改善。
目的是创建由依赖图生成的统一且流畅的用户体验。 该解决方案在不改变用户体验的情况下显着提高了性能,并且图形捕获意味着可以在大型计算资源上更有效地并行执行。
而AOT自动推导稍后会将优化后的FX图传递到本地编译器层,即。 其他硬件公司此时也可以直接拿图输入到自己的后端编译器中。
作为原生深度学习编译器,它可以为多个加速器和后端生成快速代码。 ()获取约250个算子的FX图,并进一步将其算子数量减少到约50个。此后,将进入调度阶段,以融合算子并确定内存规划。
之后为何谷歌的输给了,超越谷歌,将进入“代码封装”阶段,生成可以在CPU、GPU等人工智能加速器上运行的代码。 封装的代码调用内核并分配内存,替换编译器堆栈的解释器部分。 其中,后端代码生成部分使用GPU语言输出PTX代码。 对于CPU来说,Intel编译器生成的C++代码也可以在非Intel CPU上运行。
未来将会增加更多对硬件的支持,但它确实显着减少了为 AI 硬件加速器编写编译器时所需的工作量。 此外,代码性能得到了优化,内存带宽和容量要求也大大降低。
我们编写的编译器不能只支持GPU,还必须扩展以支持各种硬件后端。 C++和()迫使我们拥有这种多功能性。 ——杰森·安塞尔——Meta AI
该语言对 的闭源机器学习软件护城河造成了毁灭性打击。 可以直接接收脚本,或者更常见的是,通过堆栈接收信息流。 然后,使用开源库(例如 的 CUDA 库)而不是 的闭源 CUDA 库,将输入转换为 LLVM 中间表示并生成代码。
CUDA 在专门从事加速计算的开发人员中更常用,而在机器学习研究人员或数据科学家中不太知名。 高效地使用 CUDA 并不容易,需要用户对硬件架构有深入的了解,并且可能会减慢开发过程。 因此,机器学习专家经常依赖 CUDA 专家来修改、优化和并行化他们的代码。
它弥补了这一差距,使高级语言能够达到与低级语言相当的性能水平。 内核本身对于一般机器学习研究人员来说是可读的,这对于语言的可用性非常重要。 它自动化了SM内的内存压缩、共享内存管理和调度,但对元素级矩阵乘法没有太大帮助,其本身已经足够高效了。 此外,它在昂贵的逐点操作中非常有效。 对于涉及矩阵乘法的大型算子融合,还可以显着降低Flash 等复杂操作的开销。
截至今天,微软仅正式支持 GPU,但很快就会有所不同。 随着时间的推移,其他几家硬件供应商预计也会支持它,这个开源项目的未来是光明的。 其他硬件加速器可以直接集成到 LLVM IR 中,这意味着在新硬件上构建 AI 编译器堆栈的时间将显着减少。
庞大的软件组织缺乏远见,未能利用其在机器学习软硬件方面的巨大优势,成为机器学习的默认编译器。 缺乏对可用性的关注,这使得外部人员和 Meta 能够开发出可以移植到其他硬件的软件堆栈。 为什么他们没有为机器学习研究人员开发像“简化”版本的 CUDA 之类的东西? 为什么像 Flash 这样的技术来自博士生而不是 本身?
本报告的其余部分将列出将使 获胜的特定硬件加速器,以及目前正在快速集成到 2.0 或 Trion 软件堆栈中的多家公司的硬件产品。 此外,报告中还将列出反驳意见,以捍卫英伟达在人工智能训练领域的护城河或实力。
查看英文原文:How's CUDA In Is - And 2.0
炫佑科技专注互联网开发小程序开发-app开发-软件开发-网站制作等