終於完賽了好感動,謝謝 codex,完成鐵人賽算是達成我這些年一直拖延沒參加的目標,題目想了幾個月,中間大綱改了三次,最後決定紀錄碩一研究和學習相關的知識。
前面三十天從 RISC-V、RVV、SGLang、TorchInductor,一路讀到 NVIDIA GPU、Triton、Tenstorrent、TT-MLIR 與 TileLoom 等等學習很多相關技術。
回到第一天,夢開始的地方,這個系列最初引用 Chris Lattner 在 ASPLOS 2021 的演講
The Golden Age of Compiler Design in an Era of HW/SW Co-design
不同硬體有不同要注意的地方,CPU 有不同 vector ISA,GPU 有 Tensor Core、shared memory 與 async data movement,AI accelerator 則可能直接暴露 core grid、local memory 和 NoC。
上層程式也持續變化。PyTorch graph、Triton tile program、MLIR dialect 和各種 runtime,都需要一條可靠路徑才能走到硬體。每加入一種新硬體,單靠 framework 作者或模型開發者手寫所有 kernel 很難長期維護。Compiler 要在中間保存運算語意,分析 shape 和 layout,安排資料搬移,再選擇硬體能執行的程式。
上層程式和底層硬體之間需要 Compiler 當橋梁,這讓 AI compiler 有更多機會。
| 硬體 | 我主要追的問題 | Compiler 的工作 |
|---|---|---|
| RISC-V CPU | loop 如何吃到 RVV,資料如何留在 register/cache | vectorization、microkernel selection、codegen、dispatch |
| NVIDIA GPU | tile 如何分給 CTA/warp/lane,如何使用 shared memory 和 Tensor Core | layout、memory staging、pipeline、ISA lowering、launch |
| Tenstorrent ASIC | logical tile 如何放到 core grid,資料如何經 L1/NoC 流動 | spatial mapping、reuse、broadcast、dataflow planning |
三種硬體都在做一件事:讓計算單元持續拿到需要的資料。它們提供的平行單位、記憶體階層和程式介面不同,所以 compiler 的 IR 與最佳化策略也不同,這也是我目前理解 AI compiler 有趣的地方。
這裡分享一下為什麼第一篇標題會是「開始與終結的序章」,這是來自一部我很喜歡的動畫 2011 年命運石之門第一集的標題,最後一集標題是「終結與開始的序言」,如果有看過進擊的巨人會知道第一集是「致兩千年後的你」,最後一集「來自兩千年前的你」,我很喜歡這種前後貫穿劇情,變成一個時間循環的哲學探索,很值得慢慢回味。
我很喜歡這部作品,因為它讓我了解到接受無法改變的過去、珍惜當下的每一個選擇,並在絕望中堅持守護重要的人。最近也開始面臨人生的一些抉擇,致十年後的我,到底追求甚麼樣的目標呢?
我想要學習以始為終,還有以終為始的精神。
謝謝一路看到今天的你們。
如果這個系列有讓你對 AI compiler 有興趣那真的是太棒了!
對我自己來說,這次鐵人賽替過去碩一留下一個段落,也替碩二寫下新的開頭。
進入碩二後,我希望自己能繼續維持這次寫文章建立的習慣,希望未來回頭看這個系列時,除了記得碩一做過哪些事,也能看見自己怎麼一步一步學會提出更好的問題。
鐵人賽完賽不代表旅程結束,而是旅程的開始,繼續朝 AI compiler 工程師的路上前進。
最後送給大家我很喜歡一句話:
每個人都有自己的時區。
有人很早找到研究方向,有人繞了一段路才遇到想做的題目;有人正在收穫成果,也有人剛學習新的領域。每段經歷都有自己的速度,不需要拿別人的進度表衡量自己。
期望碩二可以一切順利,也祝大家未來一切順利。無論我們正在研究或學習一個還很陌生的領域,只要願意繼續累積、繼續嘗試,就仍然走在自己的路上。
我們都在自己的時區裡,繼續成長、繼續前進,成為更好的自己!