0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

适用于Python代码的开源式即时编译器NUMBA介绍

NVIDIA英伟达 来源:NVIDIA英伟达 作者:NVIDIA英伟达 2022-07-08 09:15 次阅读

Numba 是一个适用于 Python 代码的开源式即时编译器。借助该编译器,开发者可以使用标准 Python 函数在 CPUGPU 上加速数值函数。

什么是 NUMBA?

为了提高执行速度,Numba 会在执行前立即将 Python 字节代码转换为机器代码。

Numba 可用于使用可调用的 Python 对象(称为修饰器)来优化 CPU 和 GPU 功能。修饰器是一个函数,它将另一个函数作为输入,进行修改,并将修改后的函数返回给用户。这种模组化可减少编程时间,并提高 Python 的可扩展性。

Numba 还可与 NumPy 结合使用,后者是一个复杂数学运算的开源 Python 库,专为处理统计数据而设计。调用修饰器时,Numa 将 Python 和/或 NumPy 代码的子集转换为针对环境自动优化的字节码。它使用 LLVM,这是一个面向 API 的开源库,用于以编程方式创建机器原生代码。Numba 针对各种 CPU 和 GPU 配置,提供了多种快速并行化 Python 代码的选项,有时仅需一条命令即可。与 NumPy 结合使用时,Numba 会为不同的数组数据类型和布局生成专用代码,进而优化性能。

为何选择 NUMBA?

Python 是一种广泛应用于数据科学的高效动态编程语言。由于其采用简洁明了的语法,并具有标准数据结构、全面的标准库、高水准的文档、庞大的库和工具生态系统以及大型开放社区,因此深受欢迎。不过,也许最重要的原因是,Python 等动态型态解释语言能够带来超高效率。

但是,对于 Python 来说,这既是最大的优势,也是最大的劣势。“它的灵活性和无类型的高级语法可能会导致数据和计算密集型程序的性能不佳,因为运行本地编译代码要比运行动态解释代码快很多倍。因此,注重效率的 Python 程序员通常会使用 C 语言重写最内层的循环,然后从 Python 调用已编译的 C 语言函数。许多项目都力求简化这种优化(例如 Cython),但它们通常需要学习新的语法。虽然 Cython 显著提高了性能,但可能需要对 Python 代码进行艰巨的手动修改工作。

Numba 被视作 Cython 的替代方案,并且要简单得多。它最大的吸引力在于无需学习新的语法,也无需替换 Python 解释器、运行单独的编译步骤或安装 C/C++ 编译器。只需将@jit Numba 修饰器应用于 Python 函数即可。这样,在运行时即可进行编译(即“即时”或 JIT 编译)。Numba 能够动态编译代码,这意味着,您还可以享受 Python 带来的灵活性。此外,Python 程序中由 Numba 编译的数值算法,可以接近使用编译后的 C 语言或 FORTRAN 语言编写的程序的速度;并且与原生 Python 解释器执行的相同程序相比,运行速度最多快 100 倍。这是一项重要进步,推动了高效编程与高性能计算的完美结合。

07b24ae2-fdf5-11ec-ba43-dac502259ad0.png

Numba 执行图

Numba 专为面向数组的计算任务而设计,与应用广泛的 NumPy 库类似。在面向数组的计算任务中,数据并行性与 GPU 等加速器自然契合。Numba 理解 NumPy 数组类型,并将其用于生成高效的编译代码,以在 GPU 或多核 CPU 上执行。所需的编程工作非常简单,只需添加一个 @vectorize 函数修饰器,指示 Numba 在运行时生成编译的向量化函数版本。这样,它便可用于在 GPU 上并行处理数据数组了。

除了为 CPU 或 GPU 即时编译 NumPy 数组代码外,Numba 还公开了“CUDA Python”:这是适用于 NVIDIA GPU 的 NVIDIA CUDA编程模型,采用 Python 语法编写。加速 Python 后,它可以从胶水语言扩展至可高效执行数字代码的完整编程环境。

Numba 与 Python 数据科学生态系统中其他工具的结合使用,改变了 GPU 计算的体验。Jupyter Notebook 提供基于浏览器的文档创建环境,允许结合使用 Markdown 文本、可执行代码以及绘图和图像的图形输出。Jupyter 在教学、记录科学分析和交互式原型设计领域深受欢迎。

Numba 已在 200 多种不同的平台配置下进行了测试。它基于 IntelAMD x86、POWER8/9、ARM CPU 以及 NVIDIA 和 AMD GPU 上的 Windows、Apple Macintosh、Linux 操作系统运行,大多数系统均可使用预编译的二进制文件。

用例

科学计算

数组处理应用广泛,从地理信息系统到计算复杂的几何形状,无一不及。电信公司使用数组来优化无线网络的设计,而医疗健康研究人员则使用数组分析包含内脏器官信息的波形。数组还可用于减少语言处理、天文成像和雷达/声纳中的外部噪声。

有了 Python 等语言,开发者无需进行大量数学训练,即可使用这些领域的应用程序。但是,Python 在数值密集型计算中存在性能缺陷,这会严重影响某些应用程序的处理速度。Numba 是其中一个解决方案。许多人都认为它易于使用,因此对于没有 C 语言等比较复杂语言经验的学生和开发者来说,意义重大。

NUMBA 对数据科学家的重要意义

在数据科学中,迭代开发是一种非常实用的省时方案,因为开发者能够通过观察结果来不断地改进程序。Python 等解释语言在这种情景中尤为有用。但是,Python 在高度数学运算中存在性能限制,这可能会造成瓶颈,从而减缓整体处理速度并限制开发者的工作效率。

Numba 为开发者提供了一种调用编译器函数的简单方法,显著提升了大型计算和数组的性能,从而解决了这一问题。Numba 简单易学,并使数据科学家无需执行使用编译语言编写子程序这一复杂任务,从而加快速度。

NUMBA 为何可在 GPU 上表现更突出

在架构方面,CPU 仅由几个具有大缓存内存的核心组成,一次只可以处理几个软件线程。相比之下,GPU 由数百个核心组成,可以同时处理数千个线程。

07d8cee2-fdf5-11ec-ba43-dac502259ad0.jpg

Numba 通过以下方式支持 CUDA GPU 编程:在 CUDA 执行模型后,直接将受限的 Python 代码子集编译到 CUDA 内核函数和设备函数中。使用 Numba 编写的内核看起来可以直接访问 NumPy 数组,而这些数组在 CPU 和 GPU 之间自动传输。这为 Python 开发者提供了一个轻松进行 GPU 加速计算的方法,而且无需学习新语法或语言,即可学会如何应用日益复杂的 CUDA 编码。借助 CUDA Python 和 Numba,您可以一举两得:使用 Python 实现快速迭代开发,同时达到针对 CPU 和 NVIDIA GPU 的编译语言的速度。

我们使用配备 NVIDIA P100 GPU 和 Intel Xeon E5-2698 v3 CPU 的服务器进行了一次测试,结果显示,使用 Numba 编译的 CUDA Python Mandelbrot 代码比只使用 Python 快了近 1700 倍。与 CPU 上的单线程 Python 代码相比,性能提升是多个因素的共同作用,包括编译、并行化和 GPU 加速。但是,它说明单是添加一个 GPU 即可实现加速。

NVIDIA GPU 加速的端到端数据科学

基于 CUDA-X AI 创建的 NVIDIA RAPIDS开源软件库套件使您完全能够在 GPU 上执行端到端数据科学和分析流程。此套件依靠 NVIDIA CUDA 基元进行低级别计算优化,但通过用户友好型 Python 接口实现了 GPU 并行化和高带宽显存速度。

借助 RAPIDS GPU DataFrame,数据可以通过一个类似 Pandas 的接口加载到 GPU 上,然后用于各种连接的机器学习和图形分析算法,而无需离开 GPU。这种级别的互操作性可通过 Apache Arrow 等库实现,并有助于实现端到端流程(从数据准备到机器学习再到深度学习)的加速。

07f8c85a-fdf5-11ec-ba43-dac502259ad0.png

RAPIDS 支持在许多热门数据科学库之间共享设备内存。这样可将数据保留在 GPU 上,并省去了来回复制主机内存的高昂成本。

0855baf6-fdf5-11ec-ba43-dac502259ad0.png

RAPIDS 团队正在开发和参与许多开源项目,并与众多开源项目(包括 Apache Arrow、Numba、XGBoost、Apache Spark、scikit-learn 等)密切协作,确保 GPU 加速数据科学生态系统中的所有组件顺畅地协同工作。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10456

    浏览量

    206607
  • NVIDIA
    +关注

    关注

    14

    文章

    4598

    浏览量

    101769
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48638
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83483

原文标题:NVIDIA 大讲堂 | 什么是 NUMBA ?

文章出处:【微信号:NVIDIA_China,微信公众号:NVIDIA英伟达】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Triton编译器的原理和性能

    Triton是一种用于编写高效自定义深度学习原语的语言和编译器。Triton的目的是提供一个开源环境,以比CUDA更高的生产力编写快速代码,但也比其他现有DSL具有更大的灵活性。Tri
    的头像 发表于 12-16 11:22 1078次阅读
    Triton<b class='flag-5'>编译器</b>的原理和性能

    编译器的优化选项

    一个程序首先要保证正确性,在保证正确性的基础上,性能也是一个重要的考量。要编写高性能的程序,第一,必须选择合适的算法和数据结构;第二,应该编写编译器能够有效优化以转换成高效可执行代码的源代码,要做到
    的头像 发表于 11-24 15:37 414次阅读
    <b class='flag-5'>编译器</b>的优化选项

    python如何换行而不运行代码

    和可读性。 在Python中,可以使用两个主要的方法进行换行:使用反斜杠()和使用圆括号(())。 第一种方式是使用反斜杠()来表示换行。在Python中,反斜杠是一个转义字符,它可以用于将一行
    的头像 发表于 11-24 09:50 1455次阅读

    适用于AVR MCU的MPLAB XC8 C编译器用户指南

    电子发烧友网站提供《适用于AVR MCU的MPLAB XC8 C编译器用户指南.pdf》资料免费下载
    发表于 09-19 15:47 3次下载
    <b class='flag-5'>适用于</b>AVR MCU的MPLAB XC8 C<b class='flag-5'>编译器</b>用户指南

    用于嵌入FUSA的ARM编译器移植和兼容性指南

    用于Embedded FUSA的ARM®编译器迁移与兼容性指南》为从旧版本的ARM编译器迁移到用于Embedded FUSA 6的ARM编译器
    发表于 08-29 07:02

    ARM编译器优化版本1.0

    ARM编译器armcc可以优化您的代码以实现小代码和高性能。 本教程介绍编译器执行的主要优化技术,并解释了如何控制
    发表于 08-28 07:11

    ARM编译器6.6版ARMASM用户指南

    用的 GNU 语法拼装的组装组语言代码。 此书只适用于编组。 关于编组的信息,请参看 编译器参考指南 。 要了解以下内容: • 编译代码
    发表于 08-25 07:35

    适用于µVision的ARM编译器v5.06错误和警告参考指南

    您可以使用命令行选项来控制编译器生成的诊断消息的严重性。 编译器通常会警告潜在的可移植性问题和其他危险。 在将遗留代码(例如,在旧式C中)移植到ARM编译器时,可能会报告许多警告。 但
    发表于 08-21 08:27

    适用于嵌入FuSa的Arm编译器Arm C和C++库及浮点支持用户指南

    它描述了针对嵌入FUSA 6功能的各种ARM®编译器的支持级别。 嵌入FUSA 6的ARM编译器是基于Clang和LLVM技术构建的。 因此,它具有比文档中描述的产品功能集更多的功
    发表于 08-18 07:38

    Arm编译器嵌入FuSa 6.16.2版LTS用户指南

    架构的基础上开发的。 因此,针对嵌入FUSA 6的ARM编译器进行了调整,以生成适用于从小型传感到64位设备的嵌入裸机应用的高效
    发表于 08-18 06:42

    RealView用于BREW编译器和库的编译工具指南

    C标准C++实现定义。 ARM C++编译器还可以编译标准C++的子集,即eMbedded C++(EC++)。 EC++是标准C++的一个子集,它为嵌入系统提供了高效的代码。 EC
    发表于 08-12 07:38

    适用于µVision ARM C和C++库及浮点支持的ARM编译器v5.06用户指南

    如果用C编写应用程序,则必须将其与C库链接,即使它不直接使用C库函数。 这是因为编译器可能会隐生成对C库函数的调用以改进应用程序,即使源代码中可能不存在对此类函数的调用。 即使您的应用程序没有main()函数,这意味着C库未初
    发表于 08-12 06:42

    用于嵌入版本6.20的ARM编译器参考指南

    Arm®编译器嵌入命令行选项的语法。此外,还有用于识别本文档中描述的各种功能的支持级别的描述。
    发表于 08-10 07:46

    如何为Arm编译C和c++代码

    和C++源代码翻译成机器代码编译器。 •将汇编语言源代码翻译成机器代码的汇编程序。 •一个链接
    发表于 08-02 17:28

    如何构建我自己的嵌入C编译器

    只是为了获得如何构建我自己的嵌入 C 编译器的知识,如预处理、汇编、链接、生成 Hex 文件、elf 文件、映射文件。 任何有用的链接可用? 我是嵌入软件工程师,并且具有 c 编
    发表于 06-08 08:10