随着AI的应用日益广泛,渗透到生活的各个领域,关于这些智能工具将运行何种软件的问题也日益引起关注。在以GPU为核心的AI计算需求中,软件栈的选择至关重要,它指的是在计算系统上共同实现特定功能的一组软件组件。
由于AI和HPC应用持续突破算力的极限,软件栈的选择对性能、效率和开发人员的生产力至关重要。
本文将深入剖析这些软件栈的复杂性,探讨其功能、硬件支持以及与流行的AI框架PyTorch的集成。此外,我们还将简要介绍两种高级HPC语言:Chapel和Julia。
本文将深入剖析这些软件栈的复杂性,探讨其功能、硬件支持以及与流行AI框架PyTorch的集成情况。此外,我们还将简要介绍两种备受瞩目的高级HPC语言:Chapel和Julia。
Nvidia CUDA

Nvidia的CUDA是该公司专有的并行计算平台和软件栈,专为在GPU上进行通用计算而设计。CUDA提供了一系列API,使软件能够充分利用Nvidia GPU的并行处理能力来加速计算。
CUDA之所以率先被提及,是因为它在AI和GPU密集型HPC任务的软件栈领域占据主导地位,并非偶然。自2006年发布以来,CUDA历经了长时间的考验,拥有丰富的第三方支持和成熟的生态系统。许多库、框架和其他工具都针对CUDA和Nvidia GPU进行了优化。CUDA栈的长期支持使其成为相较于其他栈的一大关键优势。
作为CUDA平台的一部分,Nvidia提供了全面的工具集,包括Nvidia CUDA编译器(NVCC)等。此外,还有众多调试器和分析器用于CUDA应用程序的调试和优化,以及用于分发CUDA应用程序的开发工具。CUDA的长期存在也催生了广泛的文档、教程和社区资源。
在AI任务中,CUDA对PyTorch框架的支持至关重要。PyTorch是一个基于Torch库的开源机器学习库,广泛应用于计算机视觉、自然语言处理等领域。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的Radeon开放计算(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 Compiler Collection、AOMP和AMD Optimizing C/C++ Compiler),以及Fortran编译器(如Flang)。此外,ROCm还涵盖了各种领域的库,如线性代数、FFT和深度学习库。
然而,与CUDA相比,ROCm的生态系统尚处于发展初期,需要在第三方支持、库和工具方面奋起直追。其较晚的发布也导致文档和社区资源相对匮乏,而CUDA则拥有广泛的文档、教程和社区支持。在PyTorch方面,尽管PyTorch支持ROCm平台,但在性能、优化和第三方支持方面,ROCm因其较短的历史和成熟度而落后于CUDA。ROCm上PyTorch的文档和社区资源也相对较少。不过,AMD正加紧步伐,在这方面取得进展。
同样,AMD也提供了大量ROCm库。其中,MIOpen是一个专门用于深度学习的库,与Nvidia的cuDNN相当,并在ROCm版本的PyTorch(以及其他流行工具)中使用。
尽管ROCm支持AMD和Nvidia的GPU,但由于驱动程序开销和优化挑战,在Nvidia硬件上运行时,其性能可能略逊于CUDA。
Intel oneAPI

Intel的oneAPI是一个统一的跨平台编程模型,支持广泛的硬件架构和加速器,包括CPU、GPU、FPGA以及来自不同供应商的AI加速器。其目标是为异构计算提供一个与供应商无关的解决方案,并利用SYCL等行业标准。这意味着oneAPI不仅可以运行在AMD、Nvidia等外部供应商的硬件上,更可应用于Intel自家的硬件。
与ROCm类似,oneAPI也是一个开源平台,因此在代码库方面拥有更广泛的社区参与和贡献。oneAPI支持多种编程语言和框架,包括使用SYCL的C/C++、Fortran、Python和TensorFlow。此外,oneAPI为异构计算提供了一个统一的编程模型,简化了跨多种硬件的开发过程。
然而,作为一个较新的平台,oneAPI在第三方软件支持和针对特定硬件架构的优化方面仍需追赶CUDA。
在PyTorch的特定使用案例中,oneAPI目前仍处于起步阶段,尚未达到CUDA集成的成熟度。PyTorch可以使用oneAPI的数据并行Python(DPPy)库在Intel的CPU和GPU上进行分布式训练,但对oneAPI GPU的原生支持仍在开发中,尚未准备好用于生产环境。
然而,oneAPI的优势在于其基于开放标准的方法和跨平台可移植性。对于关注供应商锁定问题并希望在不同硬件架构上运行PyTorch模型的开发人员来说,oneAPI可能是一个有吸引力的选择。
目前,如果开发人员的首要目标是在Nvidia GPU上实现最大性能,那么CUDA由于其成熟的生态系统仍然是首选。但如果开发者寻求与供应商无关的解决方案,或者主要使用AMD或Intel的硬件,那么分别依赖ROCm或oneAPI可能是更好的选择。
尽管CUDA在生态系统发展方面具有先发优势,但其专有性质和硬件特定性可能会使ROCm和oneAPI对某些开发者更具吸引力。此外,随着时间的推移,这些软件栈的社区支持和文档也将不断增长。因此,虽然目前CUDA占据主导地位,但这种情况可能会在未来几年发生变化。
抽象化堆栈,屏蔽底层细节
总体而言,许多开发者更倾向于创建与硬件无关的应用程序。在高性能计算(HPC)领域,虽然出于性能考虑,硬件优化是合理的,但许多现代程序员更愿意专注于他们的应用程序逻辑,而不是底层硬件的细节。
PyTorch正是这种趋势的一个典型例子。Python并不是一种速度特别快的语言,但根据Hugging Face的数据,有92%的模型专门使用PyTorch构建。只要硬件供应商提供基于其库的PyTorch版本,用户就可以专注于模型本身,而不必担心底层硬件的差异。这种可移植性受到广泛欢迎,但并不一定能保证最佳性能,这也是为什么底层硬件架构仍然是HPC领域的重要议题。
当然,PyTorch基于Python,这也是许多程序员首选的编程语言。这种语言通常在易用性和性能(特别是高性能特性如并行编程)之间进行权衡。如果HPC项目一开始选择的是Python,它们往往会迁移到基于分布式C/C++和MPI的可扩展高性能代码,或使用OpenMP的线程应用程序。这些选择通常会导致“双语言”问题,开发人员需要管理两种版本的代码。
目前,有两种“新兴”语言,Chapel和Julia,它们旨在提供既易用又高性能的编程环境。这些语言试图“简化”编写并行HPC集群、多核处理器以及GPU/加速器环境应用程序所需的大量细节。尽管它们仍然依赖于前面提到的供应商GPU库,但它们通常使构建能够在运行时自动识别并适应底层硬件环境的应用程序变得更加容易。
Chapel

最初由Cray公司开发,Chapel(Cascade High Productivity Language)是一种并行编程语言,旨在提供比现有编程语言(如“Fortran/C/C++加MPI”)更高层次的表达性。HPE收购了Cray公司后,Chapel现作为一个开源项目,在Apache许可证第2版下支持其开发。目前,Chapel的版本为2.0,其官方网站上发布了一系列令人瞩目的并行性能数据。
Chapel默认编译为二进制可执行文件,但用户也可以选择将其编译为C代码,并自由选择编译器。此外,Chapel代码还能编译成可从C、Fortran或Python(以及其他语言)调用的库。Chapel还支持通过为Nvidia和AMD图形处理单元生成代码来实现GPU编程。
Chapel的可用库集合正在不断扩展。最近,一个名为Chainn的神经网络库被引入Chapel,专门用于通过并行编程构建深度学习模型。Chainn在Chapel中的实现使用户能够充分利用该语言的并行编程功能,无论是在笔记本电脑还是超级计算机上,都能高效地进行大规模深度学习模型的训练。
Julia

Julia由麻省理工学院开发,旨在成为解决上述两种语言问题的快速、灵活且可扩展的解决方案。2009年,Jeff Bezanson、Stefan Karpinski、Viral B. Shah和Alan Edelman开始着手创建一种既高级又快速的开源技术计算语言。
多重派发:一个函数可以根据输入类型拥有多个实现(方法),这有助于创建可移植和自适应的代码
动态类型系统:用于文档、优化和派发的类型
接近静态类型语言(如C)的性能
内置包管理器
设计用于并行和分布式计算
可编译为二进制可执行文件
Julia还拥有适用于CUDA、ROCm、OneAPI和Apple的GPU库,这些库可与机器学习库Flux.jl(以及其他库)配合使用。Flux是用Julia编写的,为Julia的原生GPU支持提供了轻量级的抽象。
Chapel和Julia都为GPU编程提供了高级且可移植的解决方案。与许多隐藏底层硬件细节的语言一样,这可能会带来一些性能损失。然而,开发人员通常愿意为了便捷的可移植性而牺牲一些性能。
Source:Kevin Jackson, Doug Eadline; Spelunking the HPC and AI GPU Software Stacks; June 21, 2024
--【本文完】---
近期受欢迎的文章:
更多交流,可添加本人微信
(请附姓名/单位/关注领域)





