自 5 月 2 日首次亮相以來,Modular 公司的 Mojo 編程語言引起了開發人員的極大興趣,已經有超 12 萬開發人員注冊使用 Mojo Playground,19 萬開發者熱情參與 Discord 與 GitHub 討論。Fast.ai 聯合創始人、數據科學家 Jeremy Howard 更是表示,“Mojo 可能是近幾十年來最大的編程語言進步。”
9 月 7 日,Modular 公司宣布正式發布 Mojo:Mojo 現在已經開放本地下載——初步登陸 Linux 系統,并將很快提供 Mac 與 Windows 版本。
Modular 公司由 LLVM 和 Swift 編程語言的聯合創始人 Chris Lattner 創辦,此前剛獲得 1 億美元(約 7 億人民幣)融資。Chris Lattner 表示,本輪融資總額達到 1.3 億美元,所得款項將用于產品擴展、硬件支持和推動自研 AI 編程語言 Mojo 的進一步發展。
據介紹,Mojo Playground 提供的只是一套簡單的語言展示,而本地 Mojo 工具鏈則可幫助開發人員完成更多工作。本地開發者工具將開放全部 Mojo 功能,包括一套完整的編譯器功能與 IDE 工具,讓開發者能夠輕松對 Mojo 應用進行構建與迭代。
Mojo:面向 AI 開發者的新型編程語言Mojo 是一種面向 AI 開發者的新型編程語言。隨著時間推移,它將逐步成長為 Python 的超集。Mojo 已經支持與任意 Python 代碼的無縫集成,并提供可擴展的編程模型以支撐各類關鍵性能系統,包括在 AI 場景中普遍存在的加速器(例如 GPU)。
Mojo 能夠切實滿足開發者需求,引導大家逐步采用新功能,從而在必要時獲得高性能體驗。具體來說,Mojo 可以為開發者帶來的主要收益:
-
一種語言編寫所有內容:Mojo 能夠隨時隨地服務于 AI 開發者,將 Python 的可用性與以往強制開發者使用 C、C++ 或 CUDA 的系統編程功能結合起來。開發者可以在公共代碼庫上工作,從而簡化從研究到生產的整個工作流程。
-
突破 Python 性能極限:時至今日,Python 已經無處不在。但對于需要更高性能或特殊硬件的任務,Python 的表現往往不那么理想。Mojo 能夠發揮 CPU 的性能潛力,并可良好支持 GPU 和 ASIC 等外部加速器,提供與 C++ 和 CUDA 相當的卓越性能。
-
對接完整 Python 生態系統:Mojo 提供與 Python 生態系統間的全面互操作性,使其能夠無縫利用 Python 庫資源,同時發揮 Mojo 自身的功能與性能優勢。例如,開發者可以將 NumPy 和 Matpotlib 同自己的 Mojo 代碼無縫混合起來。
-
升級 AI 工作負載:Mojo 緊密集成有模塊化 AI 引擎,允許開發者通過自定義操作輕松擴展自己的 AI 工作負載,包括預處理、后處理操作和高性能數學算法。開發者還可以引入內核融合、圖重寫、sharp 函數等。
通過對現有 Python 代碼做一點簡單變更,開發者就可以使用 Mojo 對高計算強度工作負載進行顯著加速(最高可提速 6.8 萬倍)。目前,Mojo 的實際應用案例包括:
-
知名博主 Maxim Zaks 已經用 Mojo 實現了多個樹數據結構,并發布了相關博文(https://pub.aimind.so/a-high-level-introduction-to-fibytree-bd7f8775d815)和一些初步基準測試結果(https://pub.aimind.so/fibytree-vs-set-and-sortedset-7b4e6b56cac8)。
-
GitHub 用戶 MadAlex1997 在 Mojo 中構建了 N 維數組的實現(https://github.com/MadAlex1997/Mojo-Arrays)。
為何能比 Python 快 68000 倍?
Mojo 是 Python 家族的一員,但有著遠大的目標——想要與 Python 生態系統完全兼容,因此開發人員可以繼續使用自己熟悉的工具。Mojo 旨在通過保留 Python 的動態特性,同時為系統編程添加新原語,逐漸成為 Python 的超集。
LLVM 和 Swift 編程語言的聯合創始人、Modular 公司 CEO Chris Lattner 此前在 Hacker News 上表示:“我們的目標不是讓動態 Python 神奇地快速。雖然我們在動態代碼方面要快得多(因為我們有編譯器而不是解釋器),但這并不是依靠‘足夠智能’的編譯器來消除動態性”。
據介紹,Mojo 最初的目標是比 Python 快 35000 倍,近日該團隊表示,Mojo 將動態與靜態語言的優點結合起來,一舉將性能提升達 Python 的 68000 倍。
Mojo 團隊在系列博文中介紹了 Mojo 是如何比 Python 快 68000 倍的:在第一篇博文中,團隊嘗試將代碼移植為 Mojo,從而獲得了約 90 倍的性能提升;在第二篇博文中,團隊對代碼進行矢量化與并行化,又將性能提升了 2.6 萬倍;在第三篇博文中,團隊展示如何通過新的性能技術全面超越 3.5 萬倍的程序加速目標。
具體來說,Mojo 團隊首先用簡單端口將 Python 程序提速 89 倍;之后通過針對性優化和利用現代 CPU 的算力潛能,又將速度提升 2.6 萬倍。Mojo 團隊提出的并行策略是,每個 CPU 核心都應負責處理同等數量的代碼行。
然而,只有當跨行工作負載相同時,對負載進行拆分以保證各個線程 worker 獲取其中一組代碼行才具有可行性;但曼德勃羅集并不是這樣。以這種方式進行拆分會引發負載不均衡問題,這是因為曼德勃羅集中的一個像素可能在單次迭代后完成,而另一像素則可能經歷 MAX_ITERS 多次迭代。也就是說,各個行的迭代次數并不相等,會導致某些率先完成計算的線程處于閑置狀態,不利于全面挖掘性能潛力。
為了演示這種不均衡問題,Mojo 團隊繪制了每個行在曼德勃羅集中執行的迭代總數。如下圖所示,某些行在轉義之前只需要不到 1000 次迭代,但其他一些行則可能需要超 80 萬次迭代。
各個行所執行的迭代總數(以對數坐標系顯示)并非均勻分布。某些行(例如圖像中央部分的行)可能需要 80 多萬次迭代,而兩端的行則只需要 800 次左右迭代。
如果硬性為各個線程分配一定數量的連續行,就會發生全體線程都在等待,直至中間某組代碼行(被分配給某個核心)完成運行的情況。解決這個問題的辦法有很多,但最簡單的當然是過度拆分。也就是說,各個線程所獲得的不是一組平均分配的行,而是建立起一個工作負載池,再為每個行創建相應的工作項。各線程則以循環方式不斷從線程池中拾取這些工作項。
好消息是 Mojo 擁有一個性能出色的并發運行時,所以我們用不著自行創建線程池或者設計循環拾取 / 執行。Mojo 的運行時提供不少高級功能,可以充分利用這樣的多核心系統。
fn compute_row(y
let cy = min_y + h * scale_y
@parameter
fn compute_vector[simd_width:Int](w
let cx = min_x + iota[DType.float64, simd_width]() * scale_x
output.simd_store[simd_width](Index(h,w),
mandelbrot_kernel(ComplexSIMD[DType.float64,
simd_width](cx,cy))
vectorize[num_ports * simd_width, compute_vector](width)
with Runtime(num_cores()) as rt:
let partition_factor = 16 # Is autotuned.
parallelize[compute_row](rt, height, partition_factor * num_cores())
?可以分別在拆分成 2、4、8、16 和 32 份時評估程序性能,相應結果如下:
到這里,Mojo 團隊獲得了 2.3 倍于并行版本的加速效果,更是達到矢量化實現版本的 78 倍。那么,在每個行中做進一步劃分會不會讓性能更上一層樓?如果單行很大,那也許可以。但 Mojo 團隊這個示例中的最大單行長度也不過 4096。另外,同一行內的各像素間往往更具相關性。這時候更適合采用單指令流多數據流(SIMD),避免工作被白白浪費在矢量通道當中。
回顧整個旅程,Mojo 團隊先是對 Python 代碼實現了 2.6 萬倍性能提升,之后又使用超額訂閱達成提速 68847 倍的最終成績,并最終實現了 6.8 萬倍的 Python 提速效果;而在應用超額訂閱之后,性能在此前并行版本的基礎上又提高了 1 倍。
如何使用 Mojo?目前,開發者可以將 Mojo 下載至自己的本地計算機上,Modular 公司表示,Mojo 絕不只是編譯器那么簡單。
Mojo 工具箱Mojo SDK 的首個版本即提供輕松開發 Mojo 程序所需要的一切,具體包括以下工具選項:
-
Mojo 驅動程序:提供用于 read-eval-print-loop(REPL)的 shell,允許開發者構建并運行 Mojo 程序、打包 Mojo 模塊、生成文檔和格式化代碼。
-
面向 Visual Studio Code(VS Code)的擴展:支持各種生產力功能,例如語法高亮顯示、代碼補全等。
-
Jupyter 內核:支持構建和運行 Mojo notebook,包括使用 Python 代碼。
-
支持調試(即將推出):進入并檢查正在運行中的 Mojo 程序,甚至可以將 C++ 與 Mojo 堆棧幀混合起來。本次發布的 SDK 初始版本將支持 x86/Linux 系統,在后續更新中,團隊將進一步擴展至其他操作系統、硬件和工具功能。
Mojo SDK 視圖示例
Mojo 驅動程序與 Python 一樣,開發者可以運行 Mojo 命令在 REPL 中進行編程。下面是一個在 Mojo 中計算歐氏幾何距離的示例:
$ Mojo
Welcome to Mojo!
Expressions are delimited by a blank line.
Type `:Mojo help` for further assistance.
1> %%python
2. import numpy as np
3. n = 10000000
4. anp = np.random.rand(n)
5. bnp = np.random.rand(n)
6> from tensor import Tensor
7. let n: Int = 10000000
8. var a = Tensor[DType.float64](n)
9. var b = Tensor[DType.float64](n)
10. for i in range(n):
11. a[i] = anp[i].to_float64()
12. b[i] = bnp[i].to_float64()
13> from math import sqrt
14. def Mojo_naive_dist(a: Tensor[DType.float64], b: Tensor[DType.float64]) -> Float64:
15. var s: Float64 = 0.0
16. n = a.num_elements()
17. for i in range(n):
18. dist = a[i] - b[i]
19. s += dist*dist
20. return sqrt(s)
23> fn Mojo_fn_dist(a: Tensor[DType.float64], b: Tensor[DType.float64]) -> Float64:
24. var s: Float64 = 0.0
25. let n = a.num_elements()
26. for i in range(n):
27. let dist = a[i] - b[i]
28. s += dist*dist
29. return sqrt(s)
30.
31> let naive_dist = Mojo_naive_dist(a, b)
32. let fn_dist = Mojo_fn_dist(a, b)
33. print(fn_dist)
34.
1290.8521425092235
35. print(naive_dist)
36.
1290.8521425092235
此外,Mojo 還允許開發者構建靜態編譯的可執行文件,從而在無需任何依賴項的前提下進行部署。例如,開發者可以編譯并運行示例庫當中的 hello. 程序,如下所示:
$ Mojo build hello.
$ ./hello
Hello Mojo !
9
6
3
$ ls -lGtranh hello*
-rw-r--r-- 1 0 817 Sep 3 23:59 hello.
-rwxr-xr-x 1 0 22K Sep 3 23:59 hello
這個靜態編譯的 22 kB 二進制文件非常酷,它的實現離不開 Mojo 緊湊的依賴項管理機制。
Visual Studio Code 擴展VS Code 是目前全球最流行的 IDE 之一。Mojo 已經在 Visual Studio Marketplace 上發布了官方擴展,能夠直接提供支持。如此一來,各位開發者就能輕松在生產流程中獲取 Mojo 支持語法高亮顯示、診斷和修復、定義和引用、懸停幫助、格式化、代碼補全。
Jupyter 集成Jupyter 為交互式開發提供了一套強大的環境。Mojo 包含一個 Jupyter 內核,允許開發者直接在其中使用 Jupyter notebook。團隊在 GitHub 上共享了 Mojo Playground 中的所有 notebook(https://github.com/modularml/mojo/tree/main/examples/notebooks),關于更多細節信息請參閱 README 自述文件。
調試支持(即將推出)在即將發布的新版本中,團隊將在 VS Code 中添加通過 LLDB 命令行界面實現的交互式調試體驗。不僅如此,Mojo 的調試程序能夠在同一調試會話中無縫對 Mojo/C/C++ 混合代碼進行操作,進一步增強開發者在處理高度專業化代碼時的能力。
-
編程語言
+關注
關注
10文章
1938瀏覽量
34598 -
python
+關注
關注
56文章
4782瀏覽量
84453 -
生態系統
+關注
關注
0文章
701瀏覽量
20709
原文標題:比Python快68000倍!Mojo正式發布,網友:Python生態系統最重要的升級來了
文章出處:【微信號:AI前線,微信公眾號:AI前線】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論