【导读】随着 AI 技术的发展,对于编程语言的需求也发生了变化,要求其具备原生支持张量计算、并行计算及分布式计算等能力,并能够适应多样化的硬件环境,尤其要关注边缘 AI 和 AI 民主化的问题。传统 Python、C/C++ 和 CUDA 虽各具优势,但难以满足 AI 计算对张量处理、并行计算及分布式计算的原生需求。在全新的 AI 时代,究竟何种编程语言能够满足 AI 开发者的多样化需求?本文为这一问题提供了一道答案。
本文精选自《新程序员 007:大模型时代的开发者》,《新程序员 007》聚焦开发者成长,其间既有图灵奖得主 Joseph Sifakis、前 OpenAI 科学家 Joel Lehman 等高瞻远瞩,又有对于开发者们至关重要的成长路径、工程实践及趟坑经验等,欢迎大家点击订阅年卡。
作者 | Shawn Xiong 吴宗寰 董卫强
责编 | 王启隆
出品 | 《新程序员》编辑部
在这篇文章里,我们介绍一种名为 XLang™ 的新型编程语言。该语言为满足人工智能时代的特殊需求而设计。
我们将回顾当前用于 AI 编程的一些代表性语言,包括 Python、C/C++ 以及 NVIDIA CUDA,详细阐述 AI 编程语言对于程序员的友好性,以及它们在满足性能需求和并行计算能力方面的表现;紧接着将进一步深入探讨,主张 AI 时代的编程语言需要原生地支持张量和并行计算、分布式计算等 AI 计算能力,更广泛地适应各类硬件,并肩负使能边缘 AI 和推动 AI 的民主化等使命。
在文章的后半部分,我们系统性地介绍 XLang™ 的设计理念、特性以及众多创新,包括与 Python 的兼容性、对张量表达式的原生支持、分布式计算能力以及针对 GPU 和多种硬件优化的能力。我们将通过一个案例——CantorAI 分布式计算平台,来综合展示 XLang™ 如何履行其作为 AI 编程语言的使命。XLang™ 已经成为开源语言,我们希望全球开发者社区参与到 XLang™ 的开源项目中,共同推动其发展人工智能的编程语言。
当前代表性的编程语言
让我们先从探讨当今一些广泛应用于 AI 编程的重要语言开始。
Python:以人为本的编程语言
Python 是当前 AI 领域里最重要的编程语言。在 2017 年的 Python 大会上,撰写过多本 Python 书籍的 Jake Vanderplas 发表了名为《Python 在科学研究中的意外卓越表现》(The unexpected effectiveness of Python in Science)的演讲,论述为什么 Python 在科学领域是如此有效(见图 1),他就此提到了四点:
图 1 Jake VanderPlas 于 2017 年 PyCon 大会上的演讲演示文稿
1. Python 是“胶水”语言,具备与其他语言的“互操作性”。Python 语言更高级和抽象的语法封装了底层的 C / Fortran 库,而这些库(大多数情况下)负责完成主要的计算。
2. Python 有大量的工具库。Python 的标准库提供了广泛的模块和工具,其社区活跃且提供大量的第三方库,从网站开发、数据科学、人工智能到科学计算和系统运维等方面极大地扩展了 Python 的应用范围和能力,使其能够处理各种各样的任务。
Python 凭借其对大数据处理和机器学习领域的深入应用,成为了这一时代不可或缺的工具。HuggingFace 创建了 Transformers 机器学习开源框架,提供 API 和工具,帮助开发者和组织减少集成大语言模型的成本,降低技术门槛。这些举措使得 HuggingFace 公司获得了关键性的成功,助力 AI 民主化,打破 OpenAl、Google 等头部企业的垄断。HuggingFace 的技术,就是基于 Python 构建的。
3. Python的设计非常人性化。在 CPython 的设计者 Tim Peters 总结的《Python 之禅》中(见图 2),19 条原则的每一条都反映出以人的体验和价值为中心。Python 是以人为中心设计的语言。Peters 如此概括了 Python 编程语言的哲学:“美丽胜于丑陋。显式胜于隐式。简单胜于复杂……”这些原则强调了 Python 代码易于编写、理解和阅读。对于生手或非专业(科学)编程人员而言,Python 无疑更容易上手、能够更快“出活”。
图 2 Tim Peters《Python 之禅》
4. Python 的开放文化和科学精神的契合。Python 从诞生之初就是一个开源项目,其发展在很大程度上依赖于其活跃、多样化的社区。《Python 之禅》所强调的简单、明确和可读性实际上有助于社区成员的互动。由于其易学性和清晰的语法,Python 成为了许多初学者学习编程的首选语言。Python 社区对教育资源的投入,如在线教程、开源书籍和社区论坛,进一步推广了这种开放文化。Python 在多个领域都有广泛的应用,这促进了来自不同背景和专业的人才加入 Python 社区,进一步丰富了其多元化和开放性。
C / C++:发挥机器的资源和性能
有了语言的“简”和“易”还不够,运算也不能“慢”和“贵”。一些以机器为中心的编程语言在这些方面表现得更加优秀,比如 C / C++, Java, Rust 等。
以 C++ 为例,其设计者 Bjarne Stroustrap 指出 C++ 优先考虑性能、资源的使用和对抽象的控制(见图 3)。通过 C / C++,程序员可以编写精细的程序,并对计算资源(特别是内存和 CPU)进行精确的管理,从而完成复杂、高效和大规模的计算。当今最为常用的 Python 实现是 CPython,即通过 C 语言实现的解释器结合 Python 虚拟机,解析 Python 代码和执行机器码,从而完成程序的运行。
图 3 Bjarne Stroustrap《C++ 编程和实践》
NVIDIA CUDA:并行计算
NVIDIA CUDA(Compute Unified Device Architecture)是一种由 NVIDIA 开发的并行计算平台和编程模型。CUDA 允许开发者使用 NVIDIA 的 GPU(图形处理单元)进行通用计算(见图 4)。CUDA 允许程序利用 GPU 的多个核心同时执行计算任务,极大提升了处理大型数据集或执行复杂算法的速度。
图 4 用 C / C++ 进行 CUDA 编程,在 GPU 设备上并行执行
CUDA 提供编程工具和库,允许开发者采用类似于 C / C++ 的语法来编写程序,从而能够对 NVIDIA 显卡上的计算资源(尤其是 GPU 核心和显存)进行精细控制。这一特性使得 CUDA 在诸如大规模数据处理和复杂计算任务等领域中成为一个强大的工具,使之能够充分利用 GPU 的强大计算能力。想执行任何 CUDA 程序,需要三个主要步骤:
-
将输入数据从主机内存复制到 GPU 设备内存,也称为主机到设备传输。
-
加载 GPU 程序并执行,在片上缓存数据以提高性能。
-
将结果从设备内存复制到主机内存,也称为 GPU 设备到主机传输。
AI 时代对编程语言的需求
AI 编程语言的底层逻辑
我们可以简单比较一下 Python, C / C++ 和 CUDA 之间的异同(见表 1):
表 1 编程语言异同
可以看到,以 Python 为代表的动态类型解释型脚本化语言以人为本,解决的是开发效率问题;以 C 和 C++ 为代表的静态类型编译语言围绕计算机资源(CPU 和内存)的高效使用,解决的是复杂计算任务的效率的问题;而以 NVIDIA CUDA 为代表的编程模型,则围绕 GPU 设备内存资源的使用,解决的是大规模并行计算的效率问题(见图 5)。
图 5 编程语言异同示意图
AI 时代的新编程语言,必须要解决 AI 应用开发+复杂任务执行+大规模并行计算的综合效率。业界也确实出现了符合以上规律的发展态势,比如最新出现的 Mojo 语言(见图 6)。
图 6 Mojo 语言官网主页[1]
Mojo 由 Modular 公司开发,旨在为人工智能等领域的软件开发提供统一的编程框架。Mojo 语言为 Python 语言的超集,故也被称为 Python++。同时,它还具有 C++ 的速度与 Rust 的安全性。Mojo 最近发布了一系列博文,解释了 Mojo 语言效率如何比 Python 提高了 35000 ~ 68000 倍(见图 7)。
图 7 Mojo 博文截图[2]
从 Mojo 的多篇技术博客中可以大致了解到,Mojo 设计时力求与 Python 语法保持兼容性,从而也能无缝对接 Python 生态系统。不过 Mojo 本质上是一种编译型语言,进行了大量的性能优化,包括:
-
简化数学运算以降低计算负荷:例如,通过优化,避免耗用大量运算资源(如六个浮点操作数)的平方根计算。
-
向量化代码:实现 SIMD,让一个指令能够操作更多的数据。
-
增加每次循环迭代的工作量:尽量增加 SIMD 指令的并行处理宽度,让一条指令尽可能多地操作数据。
-
代码支持并行执行:使程序架构更契合 GPU 运算的需求。
可以看到,通过编译优化,Mojo 将前面提到的三种编程语言优势整合在一起,确保 AI 程序既易好写,又高效,并且最大限度地发挥硬件并行计算的优势。
AI 编程语言所肩负的新责任
Python 和 C / C++ 等编程语言历经数十年的演进。为显卡并行计算而设计的NVIDIA CUDA 于 2007 年首度面世。这些语言以及其他主流的编程语言,都先于当今这个新 AI 时代而生,并未预见到 AI 计算领域所涌现出的全新挑战和特性需求。我们认为,除了以上的要求以外,AI 编程语言还要肩负起一些新的责任:
1. AI 计算的原生支持
AI 计算与传统计算相比较,体现出张量计算、并行计算、分布式计算等特点。尽管当前的主流编程语言借助扩展库、工具包等形式能够实现上述复杂计算需求,但理想的 AI 编程语言应从底层设计层面就全面整合这些功能,并在容易编程的同时,消除对外部软件的依赖性,将计算性能在各类硬件上发挥到极致。
2. 边缘 AI
AI 需要消耗巨大的计算能力。当前,AI 计算往往在云上进行。而 AI 应用要真正落地,往往需要在本地进行计算(即边缘计算)。例如,对某些安装有 10,000 个摄像头的建筑物的安防管理,需要在保证数据安全的前提下,对 10,000 路视频进行实时的视频分析。这要求 AI 运算在应用本地进行,以达到更低的延迟、更可靠的性能和更安全的数据管理。
因为多样化的计算设备、异构的边缘网络和复杂的环境,边缘计算往往比云计算要困难很多。
3. AI 民主化
可以看到,当前 AI 的发展被少数的几家大厂所掌控。一般而言,优秀的超大规模大语言模型只能驻留在 OpenAI 和谷歌的云里,并在 NVIDIA 昂贵的 GPU 上进行训练和推理使用。绝大多数开发者受制于算力和大规模的复杂模型,难以与大厂匹敌。往往 AI 大厂的一个产品特性发布,无数创业公司便失去了未来。
编程语言是软件的基础。新 AI 时代的编程语言需要:
-
让 AI 能够更加有效地运行在边端。
-
让 AI 能够更加有效地运行在计算能力有限的设备上。
-
能更加广泛地支持多样化的 AI 硬件。
新的编程语言不但要更快、更强,更要把 AI 交到更多大众的手里,这是新时代 AI 程序语言更深层次、更有意义的责任。
XLang™
XLang™ 的架构和特性
我们开发并开源了 XLang™,一种专门为人工智能和物联网(AI & IoT)设计的语言(见图 8)XLang™ 语言结合了 Python 等动态类型语言的简洁易用性与表达力,以及 C++ 等编译型语言所具备的速度优势与执行效率。XLang™ 天生具有分布式计算能力,便于在多个节点上扩展大规模数据处理和机器学习任务。凭借丰富的库和框架,XLang™ 的性能能达到 Python 的数倍,确保了其应用的高性能。
图 8 XLang™ 架构
1. 兼容 Python 语法
XLang™ 的语法与 Python 完全兼容,所以开发者可以直接运行 Python 代码而不需要任何改变。开发者也可以直接将 Python 的库导入 XLang™ 程序中。一方面,这大大降低了 XLang™ 语言学习的难度;另一方面,很多已经由 Python 实现的优秀程序同样可以应用到 XLang™ 的环境里。事实上,XLang™ 的语法是 Python 的一个超集。其中有一个重要的扩展,就是对张量表达式和张量运算的支持。
2. 张量表达式
XLang™ 针对 AI 计算的需求,把张量(Tensor)作为最基础的数据类型。Python 语言并不支持张量运算,必须依靠 Pytorch 或 TensorFlow 等扩展库实现。XLang™ 程序员则可以像操作整数、浮点数等一样,直接对张量编程。XLang™ 这样的设计不但考虑了易用性和减少对第三方软件包的依赖,同时也在可以在编译过程中对于不同的硬件进行优化。
XLang™ 执行器中提供了针对不同硬件优化的中间层支持。除了张量以外,XLang™ 还支持数组、矩阵、图、神经网络、数据框、流、文件、数据库、Web 服务、套接字、协议、加密、压缩、序列化等功能。
3. 表达式(Expression)
作为一门新程序语言,XLang™ 最大的突破是表达式编译。传统语言(如 Python, Java 等)在编译的过程中将源代码转换为字节码(Bytecode),往往会基于字节码指令集进行一些性能优化。然而,这个优化过程中也有信息损失,变量之间的依赖关系会丢失。而 XLang™ 的编译则不进行指令层面的优化,而是将程序描述为“表达式”。
表达式的编译是以一个简洁而且信息无损的过程,所有变量的依赖关系得以完善的传递。XLang™ 执行器将通过对表达式的解析构建数据流图(DataFlow Graph),并依据这张依赖关系图进行并行计算的调度。
4. GPU 和 XPU 加速语言
如前所述,XLang™ 对外呈现统一的张量表达式,对内则可以针对硬件(Hardware)进行优化。这使得 XLang™ 也能支持 AMD、Intel 以及其他厂家的异构 GPU 或对其他 AI 计算硬件进行优化,帮助打破 NVIDIA 在这方面一家独大的局面。
5. 嵌入式语言
这里的嵌入式有两个含义:
-
嵌入低端设备:XLang™ 的执行器和 Runtime 非常精简高效,所占空间极小,可以驻留到计算资源非常有限的设备,如树莓派或 MCU-8 等 IoT 设备中。
-
嵌入应用:类似于在 MS Office 的应用里可以嵌入 VBA(Visual Basic for Applications),XLang™ 语言也可以被嵌入到任何应用中。
6. 分布式计算语言
XLang™ 具有本地分布式计算能力,支持数据对象的序列化,允许在多个节点之间轻松并行执行任务,并进行数据共享和通信。XLang™ 支持各种分布式计算模型,如 MapReduce、Spark 和 Dask 等,并提供了一套丰富的内置函数库,用于处理大规模数据 Python 分布式计算需要外挂额外的模块(如 Pickle)。XLang™ 从底层支持,减少数据量,解决依赖关系。
7. 动态语言
XLang™ 是一种动态类型语言,这意味着变量类型是在运行时而不是编译时确定的。这使得编码更加简洁灵活,并且还便于实现元编程和反射等高级功能。前面提到的 Mojo 等语言不具备该优势,这使得 XLang™ 的程序更加适合于在分布式、异构网络和不同设备上进行部署,有超强的灵活性。
8. 超级胶水语言
XLang™ 的核心能力之一是“桥接”(Bridging)。可以用于连接不同程序、库或系统组件的编程语言,将不同编程语言的代码和组件“粘合”在一起,以实现更复杂的功能,并融合不同语言生态系统。通过提供简单而强大的外部函数接口(FFI),XLang™ 允许直接调用其他语言的函数或库,并自动处理类型转换和内存管理等细节。XLang™ 目前已经支持与 C, C++, Java, C# 等的桥接,并将支持更多语言。XLang™ 比 Python 的桥接能力更强、更方便。
9. 高性能
XLang™ 采用先进的即时编译(JIT)技术,将源代码转换为运行时执行的高效机器代码。根据基准测试,XLang™ 的运行速度显著快于 Python,同时保持了动态类型语言的灵活性。
高性能和效率、异构系统互操作性和集成、开发的低复杂性、易于访问和民主化、友好的学习曲线和可用性,XLang™ 巧妙地整合了上述特性,是为 AI 而生的编程语言。
应用案例:CantorAI 分布式计算平台
当前,由于 XLang™ 尚不成熟,其应用案例尚不多见。但是,我们用 XLang™ 实现了一个名为 CantorAI[3] 的边端云协同分布式计算平台(见图 9)。CantorAI 参加了美国国际消费电子展 CES 2024,并开始投入商用。
图 9 CantorAI
-
首先,CantorAI 通过使能低端计算设备和大规模的快捷部署,使计算能够真正有效地下沉到边,而不是过度依靠云的计算,整体提高计算系统的计算效率。这一切都建立在 XLang™ 语言的应用特性:高效的机器码执行效率、小巧的内存占用以及对设备资源的极低消耗。
-
我们的任务调度机制将系统中所有具备计算能力的节点,无论它们处于边缘端、终端还是云端环境,均视为一体化的计算资源,根据任务的要求统一优化调度。这一切也建立在 XLang™ 的分布式计算能力之上。
-
针对单节点上面的 GPU 计算。现在数据在 CPU 和 GPU 之间吞吐时,GPU 有大量的空闲。XLang™ 优化 DataGraph 管理的底层算法,减少不必要的吞吐,有望将 GPU 的使用率提高到 80% 甚至更高,接近 100%。
当前业界标杆的分布式计算平台当属加州伯克利的 Ray 平台。虽然 CantorAI 的很多机制是从 Ray 学习过来的,但 CantorAI 青出于蓝而胜于蓝,甚至开始支持一些不同的场景(见表 2)。
表 2 两大分布式计算平台异同
CantorAI 的实践初步证明,相较于 Python,用 XLang™ 来构建 AI 系统会更精炼、灵活,并展现出更好的性能。XLang™ 使能了边缘 AI 计算。
XLang™ 的开源和发展
经过两年孕育开发的 XLang™ 已经初具能力,但要成为 AI 时代新编程语言的愿景十分宏大,需要广大开发者一起来完成。XLang™ 已经由 XLang™ 基金会开源[4],我们邀请全球开发者社区做出贡献,以 GitHub[5] 作为协作中心。XLang™ 基金会热诚地鼓励开发人员加入该项目,并为人工智能编程领域的这一开创性工作做出贡献。
GitHub 链接:https://github.com/xlang-foundation/xlang
相关资料:
[1] https://www.modular.com/max/mojo
[2] https://shriramsivanandhan.medium.com/mojo-programming-language-68000x-faster-than-python-programming-in-mojo-part-ii-d162740a2f67
[3] https://cantorai.com
[4] https://xlangfoundation.org/
[5] https://github.com/xlang-foundation/xlang