自 5 月 2 日首次亮相以來,Modular 公司的 Mojo 編程語言引起了開發(fā)人員的極大興趣,已經(jīng)有超 12 萬開發(fā)人員注冊(cè)使用 Mojo Playground,19 萬開發(fā)者熱情參與 Discord 與 GitHub 討論。Fast.ai 聯(lián)合創(chuàng)始人、數(shù)據(jù)科學(xué)家 Jeremy Howard 更是表示,“Mojo 可能是近幾十年來最大的編程語言進(jìn)步。”
9 月 7 日,Modular 公司宣布正式發(fā)布 Mojo:Mojo 現(xiàn)在已經(jīng)開放本地下載——初步登陸 Linux 系統(tǒng),并將很快提供 Mac 與 Windows 版本。
Modular 公司由 LLVM 和 Swift 編程語言的聯(lián)合創(chuàng)始人 Chris Lattner 創(chuàng)辦,此前剛獲得 1 億美元(約 7 億人民幣)融資。Chris Lattner 表示,本輪融資總額達(dá)到 1.3 億美元,所得款項(xiàng)將用于產(chǎn)品擴(kuò)展、硬件支持和推動(dòng)自研 AI 編程語言 Mojo 的進(jìn)一步發(fā)展。
據(jù)介紹,Mojo Playground 提供的只是一套簡(jiǎn)單的語言展示,而本地 Mojo 工具鏈則可幫助開發(fā)人員完成更多工作。本地開發(fā)者工具將開放全部 Mojo 功能,包括一套完整的編譯器功能與 IDE 工具,讓開發(fā)者能夠輕松對(duì) Mojo 應(yīng)用進(jìn)行構(gòu)建與迭代。
Mojo:面向 AI 開發(fā)者的新型編程語言Mojo 是一種面向 AI 開發(fā)者的新型編程語言。隨著時(shí)間推移,它將逐步成長(zhǎng)為 Python 的超集。Mojo 已經(jīng)支持與任意 Python 代碼的無縫集成,并提供可擴(kuò)展的編程模型以支撐各類關(guān)鍵性能系統(tǒng),包括在 AI 場(chǎng)景中普遍存在的加速器(例如 GPU)。
Mojo 能夠切實(shí)滿足開發(fā)者需求,引導(dǎo)大家逐步采用新功能,從而在必要時(shí)獲得高性能體驗(yàn)。具體來說,Mojo 可以為開發(fā)者帶來的主要收益:
-
一種語言編寫所有內(nèi)容:Mojo 能夠隨時(shí)隨地服務(wù)于 AI 開發(fā)者,將 Python 的可用性與以往強(qiáng)制開發(fā)者使用 C、C++ 或 CUDA 的系統(tǒng)編程功能結(jié)合起來。開發(fā)者可以在公共代碼庫上工作,從而簡(jiǎn)化從研究到生產(chǎn)的整個(gè)工作流程。
-
突破 Python 性能極限:時(shí)至今日,Python 已經(jīng)無處不在。但對(duì)于需要更高性能或特殊硬件的任務(wù),Python 的表現(xiàn)往往不那么理想。Mojo 能夠發(fā)揮 CPU 的性能潛力,并可良好支持 GPU 和 ASIC 等外部加速器,提供與 C++ 和 CUDA 相當(dāng)?shù)淖吭叫阅堋?/p>
-
對(duì)接完整 Python 生態(tài)系統(tǒng):Mojo 提供與 Python 生態(tài)系統(tǒng)間的全面互操作性,使其能夠無縫利用 Python 庫資源,同時(shí)發(fā)揮 Mojo 自身的功能與性能優(yōu)勢(shì)。例如,開發(fā)者可以將 NumPy 和 Matpotlib 同自己的 Mojo 代碼無縫混合起來。
-
升級(jí) AI 工作負(fù)載:Mojo 緊密集成有模塊化 AI 引擎,允許開發(fā)者通過自定義操作輕松擴(kuò)展自己的 AI 工作負(fù)載,包括預(yù)處理、后處理操作和高性能數(shù)學(xué)算法。開發(fā)者還可以引入內(nèi)核融合、圖重寫、sharp 函數(shù)等。
通過對(duì)現(xiàn)有 Python 代碼做一點(diǎn)簡(jiǎn)單變更,開發(fā)者就可以使用 Mojo 對(duì)高計(jì)算強(qiáng)度工作負(fù)載進(jìn)行顯著加速(最高可提速 6.8 萬倍)。目前,Mojo 的實(shí)際應(yīng)用案例包括:
-
知名博主 Maxim Zaks 已經(jīng)用 Mojo 實(shí)現(xiàn)了多個(gè)樹數(shù)據(jù)結(jié)構(gòu),并發(fā)布了相關(guān)博文(https://pub.aimind.so/a-high-level-introduction-to-fibytree-bd7f8775d815)和一些初步基準(zhǔn)測(cè)試結(jié)果(https://pub.aimind.so/fibytree-vs-set-and-sortedset-7b4e6b56cac8)。
-
GitHub 用戶 MadAlex1997 在 Mojo 中構(gòu)建了 N 維數(shù)組的實(shí)現(xiàn)(https://github.com/MadAlex1997/Mojo-Arrays)。
為何能比 Python 快 68000 倍?
Mojo 是 Python 家族的一員,但有著遠(yuǎn)大的目標(biāo)——想要與 Python 生態(tài)系統(tǒng)完全兼容,因此開發(fā)人員可以繼續(xù)使用自己熟悉的工具。Mojo 旨在通過保留 Python 的動(dòng)態(tài)特性,同時(shí)為系統(tǒng)編程添加新原語,逐漸成為 Python 的超集。
LLVM 和 Swift 編程語言的聯(lián)合創(chuàng)始人、Modular 公司 CEO Chris Lattner 此前在 Hacker News 上表示:“我們的目標(biāo)不是讓動(dòng)態(tài) Python 神奇地快速。雖然我們?cè)趧?dòng)態(tài)代碼方面要快得多(因?yàn)槲覀冇芯幾g器而不是解釋器),但這并不是依靠‘足夠智能’的編譯器來消除動(dòng)態(tài)性”。
據(jù)介紹,Mojo 最初的目標(biāo)是比 Python 快 35000 倍,近日該團(tuán)隊(duì)表示,Mojo 將動(dòng)態(tài)與靜態(tài)語言的優(yōu)點(diǎn)結(jié)合起來,一舉將性能提升達(dá) Python 的 68000 倍。
Mojo 團(tuán)隊(duì)在系列博文中介紹了 Mojo 是如何比 Python 快 68000 倍的:在第一篇博文中,團(tuán)隊(duì)嘗試將代碼移植為 Mojo,從而獲得了約 90 倍的性能提升;在第二篇博文中,團(tuán)隊(duì)對(duì)代碼進(jìn)行矢量化與并行化,又將性能提升了 2.6 萬倍;在第三篇博文中,團(tuán)隊(duì)展示如何通過新的性能技術(shù)全面超越 3.5 萬倍的程序加速目標(biāo)。
具體來說,Mojo 團(tuán)隊(duì)首先用簡(jiǎn)單端口將 Python 程序提速 89 倍;之后通過針對(duì)性優(yōu)化和利用現(xiàn)代 CPU 的算力潛能,又將速度提升 2.6 萬倍。Mojo 團(tuán)隊(duì)提出的并行策略是,每個(gè) CPU 核心都應(yīng)負(fù)責(zé)處理同等數(shù)量的代碼行。
然而,只有當(dāng)跨行工作負(fù)載相同時(shí),對(duì)負(fù)載進(jìn)行拆分以保證各個(gè)線程 worker 獲取其中一組代碼行才具有可行性;但曼德勃羅集并不是這樣。以這種方式進(jìn)行拆分會(huì)引發(fā)負(fù)載不均衡問題,這是因?yàn)槁虏_集中的一個(gè)像素可能在單次迭代后完成,而另一像素則可能經(jīng)歷 MAX_ITERS 多次迭代。也就是說,各個(gè)行的迭代次數(shù)并不相等,會(huì)導(dǎo)致某些率先完成計(jì)算的線程處于閑置狀態(tài),不利于全面挖掘性能潛力。
為了演示這種不均衡問題,Mojo 團(tuán)隊(duì)繪制了每個(gè)行在曼德勃羅集中執(zhí)行的迭代總數(shù)。如下圖所示,某些行在轉(zhuǎn)義之前只需要不到 1000 次迭代,但其他一些行則可能需要超 80 萬次迭代。
各個(gè)行所執(zhí)行的迭代總數(shù)(以對(duì)數(shù)坐標(biāo)系顯示)并非均勻分布。某些行(例如圖像中央部分的行)可能需要 80 多萬次迭代,而兩端的行則只需要 800 次左右迭代。
如果硬性為各個(gè)線程分配一定數(shù)量的連續(xù)行,就會(huì)發(fā)生全體線程都在等待,直至中間某組代碼行(被分配給某個(gè)核心)完成運(yùn)行的情況。解決這個(gè)問題的辦法有很多,但最簡(jiǎn)單的當(dāng)然是過度拆分。也就是說,各個(gè)線程所獲得的不是一組平均分配的行,而是建立起一個(gè)工作負(fù)載池,再為每個(gè)行創(chuàng)建相應(yīng)的工作項(xiàng)。各線程則以循環(huán)方式不斷從線程池中拾取這些工作項(xiàng)。
好消息是 Mojo 擁有一個(gè)性能出色的并發(fā)運(yùn)行時(shí),所以我們用不著自行創(chuàng)建線程池或者設(shè)計(jì)循環(huán)拾取 / 執(zhí)行。Mojo 的運(yùn)行時(shí)提供不少高級(jí)功能,可以充分利用這樣的多核心系統(tǒng)。
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 份時(shí)評(píng)估程序性能,相應(yīng)結(jié)果如下:
到這里,Mojo 團(tuán)隊(duì)獲得了 2.3 倍于并行版本的加速效果,更是達(dá)到矢量化實(shí)現(xiàn)版本的 78 倍。那么,在每個(gè)行中做進(jìn)一步劃分會(huì)不會(huì)讓性能更上一層樓?如果單行很大,那也許可以。但 Mojo 團(tuán)隊(duì)這個(gè)示例中的最大單行長(zhǎng)度也不過 4096。另外,同一行內(nèi)的各像素間往往更具相關(guān)性。這時(shí)候更適合采用單指令流多數(shù)據(jù)流(SIMD),避免工作被白白浪費(fèi)在矢量通道當(dāng)中。
回顧整個(gè)旅程,Mojo 團(tuán)隊(duì)先是對(duì) Python 代碼實(shí)現(xiàn)了 2.6 萬倍性能提升,之后又使用超額訂閱達(dá)成提速 68847 倍的最終成績(jī),并最終實(shí)現(xiàn)了 6.8 萬倍的 Python 提速效果;而在應(yīng)用超額訂閱之后,性能在此前并行版本的基礎(chǔ)上又提高了 1 倍。
如何使用 Mojo?目前,開發(fā)者可以將 Mojo 下載至自己的本地計(jì)算機(jī)上,Modular 公司表示,Mojo 絕不只是編譯器那么簡(jiǎn)單。
Mojo 工具箱Mojo SDK 的首個(gè)版本即提供輕松開發(fā) Mojo 程序所需要的一切,具體包括以下工具選項(xiàng):
-
Mojo 驅(qū)動(dòng)程序:提供用于 read-eval-print-loop(REPL)的 shell,允許開發(fā)者構(gòu)建并運(yùn)行 Mojo 程序、打包 Mojo 模塊、生成文檔和格式化代碼。
-
面向 Visual Studio Code(VS Code)的擴(kuò)展:支持各種生產(chǎn)力功能,例如語法高亮顯示、代碼補(bǔ)全等。
-
Jupyter 內(nèi)核:支持構(gòu)建和運(yùn)行 Mojo notebook,包括使用 Python 代碼。
-
支持調(diào)試(即將推出):進(jìn)入并檢查正在運(yùn)行中的 Mojo 程序,甚至可以將 C++ 與 Mojo 堆棧幀混合起來。本次發(fā)布的 SDK 初始版本將支持 x86/Linux 系統(tǒng),在后續(xù)更新中,團(tuán)隊(duì)將進(jìn)一步擴(kuò)展至其他操作系統(tǒng)、硬件和工具功能。
Mojo SDK 視圖示例
Mojo 驅(qū)動(dòng)程序與 Python 一樣,開發(fā)者可以運(yùn)行 Mojo 命令在 REPL 中進(jìn)行編程。下面是一個(gè)在 Mojo 中計(jì)算歐氏幾何距離的示例:
$ 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 還允許開發(fā)者構(gòu)建靜態(tài)編譯的可執(zhí)行文件,從而在無需任何依賴項(xiàng)的前提下進(jìn)行部署。例如,開發(fā)者可以編譯并運(yùn)行示例庫當(dāng)中的 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
這個(gè)靜態(tài)編譯的 22 kB 二進(jìn)制文件非常酷,它的實(shí)現(xiàn)離不開 Mojo 緊湊的依賴項(xiàng)管理機(jī)制。
Visual Studio Code 擴(kuò)展VS Code 是目前全球最流行的 IDE 之一。Mojo 已經(jīng)在 Visual Studio Marketplace 上發(fā)布了官方擴(kuò)展,能夠直接提供支持。如此一來,各位開發(fā)者就能輕松在生產(chǎn)流程中獲取 Mojo 支持語法高亮顯示、診斷和修復(fù)、定義和引用、懸停幫助、格式化、代碼補(bǔ)全。
Jupyter 集成Jupyter 為交互式開發(fā)提供了一套強(qiáng)大的環(huán)境。Mojo 包含一個(gè) Jupyter 內(nèi)核,允許開發(fā)者直接在其中使用 Jupyter notebook。團(tuán)隊(duì)在 GitHub 上共享了 Mojo Playground 中的所有 notebook(https://github.com/modularml/mojo/tree/main/examples/notebooks),關(guān)于更多細(xì)節(jié)信息請(qǐng)參閱 README 自述文件。
調(diào)試支持(即將推出)在即將發(fā)布的新版本中,團(tuán)隊(duì)將在 VS Code 中添加通過 LLDB 命令行界面實(shí)現(xiàn)的交互式調(diào)試體驗(yàn)。不僅如此,Mojo 的調(diào)試程序能夠在同一調(diào)試會(huì)話中無縫對(duì) Mojo/C/C++ 混合代碼進(jìn)行操作,進(jìn)一步增強(qiáng)開發(fā)者在處理高度專業(yè)化代碼時(shí)的能力。
-
編程語言
+關(guān)注
關(guān)注
10文章
1942瀏覽量
34707 -
python
+關(guān)注
關(guān)注
56文章
4792瀏覽量
84627 -
生態(tài)系統(tǒng)
+關(guān)注
關(guān)注
0文章
702瀏覽量
20723
原文標(biāo)題:比Python快68000倍!Mojo正式發(fā)布,網(wǎng)友:Python生態(tài)系統(tǒng)最重要的升級(jí)來了
文章出處:【微信號(hào):AI前線,微信公眾號(hào):AI前線】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論