2024-06-24 05:34

打破CUDA的垄断

1.3万

文章来源:半导体行业观察


图片来源:由无界AI生成
图片来源:由无界AI生成


随着人工智能不断渗透到生活的各个领域,这些工具将运行在哪种软件上仍然是一个问题。软件堆栈(或协同工作以在计算系统上实现特定功能的软件组件集合)的选择在以 GPU 为中心的人工智能任务计算需求中变得越来越重要。

随着 AI 和 HPC 应用不断突破计算能力的极限,软件堆栈的选择会显著影响性能、效率和开发人员的生产力。

目前,软件堆栈竞争中有三个主要参与者:Nvidia 的计算统一设备架构 (CUDA)、英特尔的 oneAPI 和 AMD 的 Radeon Open Compute (ROCm)。虽然它们各有优缺点,但 Nvidia 的 CUDA 继续占据主导地位,主要是因为其硬件在 HPC 和现在的 AI 领域处于领先地位。

在这里,我们将深入研究每个软件堆栈的复杂性——探索它们的功能、硬件支持以及与流行的 AI 框架 PyTorch 的集成。此外,我们将最后快速了解两种高级 HPC 语言:Chapel 和 Julia。


Nvidia 的 CUDA

Nvidia 的 CUDA 是该公司专有的并行计算平台和软件堆栈,用于在其 GPU 上进行通用计算。CUDA 提供了一个应用程序编程接口 (API),使软件能够利用 Nvidia GPU 的并行处理能力来加速计算。

首先必须提到 CUDA,因为它在 AI 和 GPU 密集型 HPC 任务的软件堆栈领域占据主导地位,这是有充分理由的。CUDA 自 2006 年就已存在,这使其拥有悠久的第三方支持历史和成熟的生态系统。许多库、框架和其他工具都专门针对 CUDA 和 Nvidia GPU 进行了优化。对 CUDA 堆栈的长期支持是其相对于其他堆栈的主要优势之一。

Nvidia 提供了一套全面的工具集作为 CUDA 平台的一部分,包括 CUDA 编译器,如Nvidia CUDA Compiler (NVCC)。还有许多用于调试和优化 CUDA 应用程序的调试器和分析器以及用于分发 CUDA 应用程序的开发工具。此外,CUDA 的悠久历史催生了大量的文档、教程和社区资源。

在讨论 AI 任务时,CUDA 对 PyTorch 框架的支持也至关重要。该软件包是一个基于 Torch 库的开源机器学习库,主要用于计算机视觉和自然语言处理中的应用。PyTorch 对 CUDA 提供了广泛且完善的支持。PyTorch 中的 CUDA 集成经过高度优化,可在 Nvidia GPU 上进行高效的训练和推理。同样,CUDA 的成熟意味着可以访问 PyTorch 可以使用的众多库和工具。

除了大量加速库之外,Nvidia 还为 AI 研究人员和软件开发人员提供了完整的深度学习软件堆栈。该堆栈包括流行的 CUDA 深度神经网络库 (cuDNN),这是一个 GPU 加速的 度神经网络基元库。CuDNN 可加速广泛使用的深度学习框架,包括 Caffe2 、Chainer 、Keras 、MATLAB 、MxNet 、PaddlePaddle 、PyTorch和TensorFlow。

更重要的是,CUDA 旨在与所有 Nvidia GPU 配合使用,从消费级 GeForce 显卡到高端数据中心 GPU,为用户提供可使用硬件的广泛多功能性。

尽管如此,CUDA 仍有改进空间,而 Nvidia 的软件堆栈也存在一些用户必须考虑的缺点。首先,尽管 CUDA 可以免费使用,但它是 Nvidia 拥有的专有技术,因此不是开源的。这种情况将开发人员锁定在 Nvidia 的生态系统和硬件中,因为在 CUDA 上开发的应用程序无法在非 Nvidia GPU 上运行,除非进行重大代码更改或使用兼容层。同样,CUDA 的专有性质意味着软件堆栈的开发路线图完全由 Nvidia 控制。开发人员对 CUDA 代码库的贡献或修改能力有限。

开发人员还必须考虑 CUDA 的许可成本。CUDA 本身对于非商业用途是免费的,但商业应用可能需要购买昂贵的 Nvidia 硬件和软件许可证。


AMD 的 ROCm

AMD 的 ROCm 是许多开发人员选择的另一种软件堆栈。虽然 CUDA 可能占据主导地位,但 ROCm 却与众不同,因为它是用于 GPU 计算的开源软件堆栈。此功能允许开发人员自定义和贡献代码库,促进社区内的协作和创新。ROCm 的一个关键优势是它支持 AMD 和 Nvidia GPU,从而实现跨平台开发。

这一独特功能由异构计算可移植接口 (HIP)实现,它使开发人员能够创建可在不同 GPU 平台上运行的可移植应用程序。虽然 ROCm 支持消费级和专业级 AMD GPU,但其主要重点是 AMD 专为专业工作负载设计的高端 Radeon Instinct 和 Radeon Pro GPU。

与 CUDA 一样,ROCm 提供了一系列用于 GPU 编程的工具。这些工具包括 C/C++ 编译器(如 ROCm 编译器集合、AOMP 和 AMD 优化 C/C++ 编译器)以及 Fortran 编译器(如 Flang)。此外,还有适用于各种领域的库,例如线性代数、FFT 和深度学习。

尽管如此,与 CUDA 相比,ROCm 的生态系统相对较新,需要在第三方支持、库和工具方面迎头赶上。与 CUDA 提供的大量文档、教程和支持相比,进入市场的迟到也意味着文档和社区资源更加有限。对于 PyTorch 来说,情况尤其如此,它支持 ROCm 平台,但由于其历史和成熟度较短,需要在性能、优化和第三方支持方面赶上 CUDA。ROCm 上 PyTorch 的文档和社区资源比 CUDA 的更有限。不过,AMD在这方面正在取得进展。

与 Nvidia 一样,AMD 也提供了大量的ROCm 库。AMD 为深度学习提供了一个与 cuDNN 相当的库,名为 MIOpen,用于 PyTorch 的 ROCm 版本(以及其他流行工具)。

此外,虽然 ROCm 同时支持 AMD 和 Nvidia GPU,但由于驱动程序开销和优化挑战,其在 Nvidia 硬件上运行时的性能可能无法与 CUDA 相匹配。


英特尔的 oneAPI

英特尔的 oneAPI 是一种统一的跨平台编程模型,支持针对各种硬件架构和加速器进行开发。它支持多种架构,包括来自不同供应商的 CPU、GPU、FPGA 和 AI 加速器。它旨在为异构计算提供与供应商无关的解决方案,并利用 SYCL 等行业标准。此功能意味着它可以在 AMD 和 Nvidia 等外部供应商的架构以及英特尔的硬件上运行。

与 ROCm 一样,oneAPI 是一个开源平台。因此,与 CUDA 相比,oneAPI 有更多的社区参与和对代码库的贡献。oneAPI 支持开源开发,支持多种编程语言和框架,包括带有 SYCL 的 C/C++、Fortran、Python 和 TensorFlow。此外,oneAPI 为异构计算提供了统一的编程模型,简化了跨不同硬件的开发。

同样,与 ROCm 一样,oneAPI 也存在一些与堆栈成熟度相关的缺点。作为一个较年轻的平台,oneAPI 需要在第三方软件支持和针对特定硬件架构的优化方面赶上 CUDA。

从 PyTorch 中的具体用例来看,与成熟的 CUDA 集成相比,oneAPI 仍处于早期阶段。PyTorch 可以利用 oneAPI 的数据并行 Python (DPPy) 库在 Intel CPU 和 GPU 上进行分布式训练,但对 oneAPI GPU 的原生 PyTorch 支持仍处于开发阶段,尚未准备好投入生产。

话虽如此,值得注意的是,oneAPI 的优势在于其基于开放标准的方法和跨平台可移植性的潜力。如果担心供应商锁定并且在不同硬件架构上运行 PyTorch 模型的能力是优先事项,那么 oneAPI 可能是一个可行的选择。

目前,如果 Nvidia GPU 上的最大性能是 PyTorch 工作负载开发人员的主要目标,那么 CUDA 仍然是首选,因为它拥有完善的生态系统。也就是说,寻求与供应商无关的解决方案的开发人员或主要使用 AMD 或英特尔硬件的开发人员可能希望分别依赖 ROCm 或 oneAPI。

虽然 CUDA 在生态系统开发方面处于领先地位,但其专有性质和硬件特异性可能会使 ROCm 和 oneAPI 成为某些开发人员更有利的解决方案。此外,随着时间的推移,这些堆栈的社区支持和文档将继续增长。CUDA 现在可能占据主导地位,但这种情况在未来几年可能会发生变化。


抽象出堆栈

总体而言,许多开发人员更喜欢创建独立于硬件的应用程序。在 HPC 中,出于性能原因,硬件优化是合理的,但许多现代程序员更喜欢专注于他们的应用程序,而不是底层硬件的细微差别。

PyTorch 就是这一趋势的一个很好的例子。Python 并不是一种特别快的语言,但 Hugging Face 上 92% 的模型都是PyTorch 独有的。只要硬件供应商在其库上构建了 PyTorch 版本,用户就可以专注于模型,而不必担心底层硬件的差异。虽然这种可移植性很好,但它并不能保证性能,而这正是底层硬件架构可能发挥作用的地方。

当然,Pytorch 基于 Python,这是许多程序员最喜爱的第一语言。这种语言通常以易用性换取性能(尤其是并行编程等高性能功能)。当使用 Python 启动 HPC 项目时,它们倾向于迁移到基于分布式 C/C++ 和 MPI 或使用 OpenMP 的线程应用程序的可扩展高性能代码。这些选择通常会导致“两种语言”问题,开发人员必须管理其代码的两个版本。

目前,两种“较新”的语言 Chapel 和 Julia 提供了一种易于使用的语言解决方案,可提供高性能编码环境。除其他外,这些语言试图“抽象”编写并行 HPC 集群、多核处理器和 GPU/加速器环境应用程序所需的许多细节。在它们的基础上,它们仍然依赖于上面提到的供应商 GPU 库,但通常可以轻松构建能够在运行时识别和适应底层硬件环境的应用程序。


1Chapel

Chapel(Cascade 高生产力语言)最初由 Cray 开发,是一种并行编程语言,旨在实现比当前编程语言(即“Fortran/C/C++ 加 MPI”)更高级别的表达。收购 Cray 的惠普企业目前支持该语言的开发,将其作为 Apache 许可证第 2 版下的开源项目。当前版本为2.0 版,Chapel 网站发布了一些令人印象深刻的并行性能数据。

Chapel 默认编译为二进制可执行文件,但也可以编译为 C 代码,用户可以选择编译器。Chapel 代码可以编译为可从 C、Fortran 或 Python(及其他语言)调用的库。Chapel 通过为 Nvidia 和 AMD 图形处理单元生成代码来支持 GPU 编程。

Chapel可用的库越来越多。最近有一个名为 Chainn 的神经网络库可用于 Chapel,它专门用于使用并行编程构建深度学习模型。Chainn 在 Chapel 中的实现使用户能够利用该语言的并行编程功能,并在从笔记本电脑到超级计算机的大规模上训练深度学习模型。


2Julia

Julia 由麻省理工学院开发,旨在成为上述双语言问题的快速、灵活且可扩展的解决方案。 Julia 的开发工作始于 2009 年,当时 Jeff Bezanson、Stefan Karpinski、Viral B. Shah 和 Alan Edelman 着手创建一种既高级又快速的开放式技术计算语言。

与 Python 一样,Julia使用快速的即时编译器提供响应式解释编程环境(REPL 或 read–eval–print loop ) 。该语言语法类似于 Matlab,并提供许多高级功能,包括:

1、多重分派:一个函数可以根据输入类型有多种实现(方法)(易于创建可移植和自适应代码)
2、动态类型系统:用于文档、优化和调度的类型
3、性能接近 C 等静态类型语言。
4、内置包管理器
5、专为并行和分布式计算而设计
6、可以编译为二进制可执行文件

Julia 还拥有适用于 CUDA、ROCm、OneAPI 和 Apple 的GPU 库,可与机器学习库 Flux.jl(以及其他库)一起使用。Flux 是用 Julia 编写的,为 Julia 的原生 GPU 支持提供了轻量级的抽象。

Chapel 和 Julia 都提供了一种高级且可移植的 GPU 编程方法。与许多隐藏底层硬件细节的语言一样,它们可能会有一些性能损失。不过,开发人员通常愿意牺牲几个百分点的性能来换取易移植性。

参考链接:

https://www.hpcwire.com/2024/06/21/spelunking-the-hpc-and-ai-gpu-software-stacks/

本文链接:https://www.aixinzhijie.com/article/6846120
转载请注明文章出处

评论
登录 账号发表你的看法,还没有账号?立即免费 注册
下载
分享
收藏
阅读
评论
点赞
上一篇
下一篇