【導讀】 隨著 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