# 2024q1 Homework5 (assessment) contributed by < `LIAO-JIAN-PENG` > ## 紀錄閱讀〈因為自動飲料機而延畢的那一年〉的啟發 ### 我對創業的看法 本文的主角[張晏甄](https://blog.opasschang.com/the-story-of-auto-beverage-machine-1/)他在大學畢業的最後一年做了許多人可能一生都不會做,或者根本沒有想過的事情。在大四的時候,他決定製作一個自動化飲料機。我也曾經多次想過自己有很棒的點子,為什麼不能用一些酷點子來賺錢呢?或許我的創新想法有機會改變世界。但是事實證明,將想法付諸實踐總是需要龐大的資金和時間,而且就算成功開發出產品,還要能夠長時間經得起市場的考驗,並不是一蹴而就的事情。 > 當時許多創業團隊都在做網站平台和app,希望能成為下一個uber或airbnb,但我們從過去的經驗知道,平台比什麼都難做,想成為一個平台,需要撮合供給方和需求方,並且從中抽成獲得利潤。這是一個雞生蛋蛋生雞的問題,沒有人供給,就沒有需求方願意上來,沒有需求,就沒有供給方願意提供服務,平台必須要兩邊燒錢,燒到兩邊的人數大到能夠養活公司,才有可能做起來。 在我的大學生涯中,充斥著各種創業和創新的競賽。通常參加這些競賽是為了拿到獎項,也有助於未來的升學規劃。我也經歷過這些階段,在參加這類競賽時,我通常希望能夠獲獎,但又不想花費太多成本。大多數情況下,我們都會選擇風險最低的方案來執行。我認為參加這種比賽的大多數人也是這種想法。如果獲獎獎金無法支付開發成本,那麼寧願拋棄高成本的計畫,採用最低成本的方案。更多情況是將過去的作品做一些包裝,以騙過評審委員。其實我們自己也很清楚,不是所有比賽都會請來領域專家當評審委員,他們更在意的是作品的亮點程度。 所以我們的工作從開發產品轉變成了包裝行銷自己的產品。因為行銷的成本極低,我們只需要說服眼前的評審。只要講述一些具有未來展望的事情,很容易就讓他們相信我們的作品具有市場潛力。但最終我們都很清楚,這只是我們課堂的專題,我們只是隨便湊合出來的看起來很厲害的東西。我們只突顯它的優點,不討論其中的缺點。這使得競賽的重點不是真正提出可以經得起考驗的作品,而只是作為升學的一個工具。這件事也讓我們常調侃自己不是資工系,而是行銷系。 ### 課堂感受 選修 Linux 核心實作算是我求學生涯中踏出最冒險的事,我在學習課程 5 週後,我其實早已扛不住短期花費大量時間的學習及寫作業,更多時間是花在我看不懂教材,還要再回去翻更基礎的課程,但我很清楚我在大學四年資工系根本沒有扎實的學習本科系科目,因為升學體制關係,學期分數的表現很大程度影響推真結果,這也間接鼓勵學生考試跟作業要盡可能拿高分數,但也因為這樣的原因,在幾次考試過後基於惰性,發現只需要準備考試會考的範圍,考試拿到分數就好,剩下的時間可以拿去做其他事,也導致我看教材只是為了考試,更多時候讀過得東西也只是有個印象,也沒有試著釐清其中原理。 在當時學界充斥著 AI 風潮,當時的我也跟風學習 AI 相關知識,當時也花一些時間研究 AI 基礎,但是我也對市場是否具備 AI 的工作職缺也保持疑惑,更多時候學習到艱深難懂的地方就會開始擔心這些東西值不值得我花時間去讀,會不會花時間投入 AI 研究卻讓本來學業退步。但後來接觸到 AI 工程師,我與它聊天後得知其實不應該只專功 AI 領域,職場上很多時候就會需要突然換領域,未來 AI 可能就不熱門(雖然目前看來還沒退燒,但台灣 AI 人才的需求仍低於學術界供給),雖然目前就讀 AI 領域,但我也時常懷疑我對 AI 的掌握度真的有過去還多?我對於其中數學原理是否有真的理解過,回頭發現這些東西也就是大學課程有教過,只是當時並不知道會在這些地方出現。 這次修課讓我窺視一小部份 Linux 核心,平常作為使用者,我並不會在意說我使用的系統是如何運作,只要沒有 Bug 出現,系統運行順暢就不會造成我太大影響,但是真的要去實作 Linux 風格的程式卻是要如此困難。過去在寫程式的習慣總是寫一些很小規模的程式,使用 for 迴圈、if else處理例外狀況、更多情況網路上有對應的解法直接參考來用。但是實際看 linux 內部使用,發現在龐大的程式規模當中,每一個細節都是非常重視,為什麼開發者當時要這麼寫,需要重視其中效率及維護成本,如果還只是過去的東湊西湊不了解其中原理肯定是做不到,更別提現在 AI 寫 code 是如此方便。 其實從作業一,我就沒有真的跟上這堂課的步伐,我已經不清楚錯過幾次作業,只因為我需要彌補我看教材時不能馬上理解的部份,並回去複習過去上課內容,這段時間每天都像是在跟時間賽跑,像是已經設定好為期 20 週的期限,我必須要在這段時間內做出產品,其中我還需要去學習。修課期間觀察到同學們都陸續開始對 Linux 核心做出貢獻,但反觀自己卻還在努力撿回自己本該學會的東西。面對日漸增加的遲交作業(還沒做),每週的課堂教材,還有其他修課的課程進度,一度讓我思考是否該退場,但在第五次作業中看到這篇文,主角張晏甄在人生重要階段選擇了一個風險極大的決定,創業這件事可以想很多次,但是在各種條件匱乏,還願意埋下苦頭去實踐,讓我很是佩服,不免故事其中充滿各式佳句,激勵了我堅持下去的動力,或許只是我太害怕失敗,不願意承擔失敗的後果,「選了,就好好走,不要浪費時間在猶豫或後悔上。」 > 你最大的問題在太害怕失敗了,既然都已經決定要延畢做飲料機了,那就要好好做,才不會辜負當初自己的期望 … 你該學習的不是看到事情要完蛋了就去避免失敗,而是應該學習如何處理與承受失敗,你才能變得比以前更強大。 ## 簡述想投入的專案 ### 探討第 9 週測驗題 針對 [第 2 題目](https://hackmd.io/@sysprog/linux2024-quiz9#%E6%B8%AC%E9%A9%97-2) * 目標:擴充後,可用來加速 llama.cpp 的 CPU 推理 * 自我檢查(短期方向):題目下方的延伸問題 1. 解釋程式碼運作原理 2. 以 [CMWQ](https://www.kernel.org/doc/html/next/core-api/workqueue.html) 重寫,並針對批次的矩陣乘法運算,提出有效的存取模型 3. 在 GitHub 找出矩陣乘法相關專案,如 [matmul](https://github.com/attractivechaos/matmul), [matmul-bench](https://github.com/tanakamura/matmul-bench), [matmul-cpu](https://github.com/jazliang/matmult-cpu), [libxsmm](https://github.com/libxsmm/libxsmm), [Matrix_Multiply_using_Arm_Neon_and_Avx](https://github.com/ruthreshx/Matrix_Multiply_using_Arm_Neon_and_Avx),並進行效能比較和實作分析,從而歸納出提升矩陣乘法的手法 4. 嘗試在 Linux 核心模組使用 SSE/AVX/NEON 等 SIMD 指令集並降低資料存取的延遲 5. 研讀 [LLaMA Now Goes Faster on CPUs](https://justine.lol/matmul/) 並歸納加速矩陣乘法的手段 ### 重做 lab0 並彙整學員成果 改進並彙整其他學員的成果 ### 繼續做 integration 並彙整學員成果 目前進度看到作業描述(二),正要看作業描述(三) CMWQ 改進並彙整其他學員的成果 ### 〈[每位程式開發者都該有的記憶體知識](https://sysprog21.github.io/cpumemory-zhtw/)〉翻譯和校訂 ### llm.c 發現 `csotaku0926` 及 `vestata` 都對於 [karpathy/llm.c](https://github.com/karpathy/llm.c) 由 Andrej Karpathy 使用 C 語言開發的大語言模型訓練程式有興趣,因為自己平常使用 Pytorch 框架訓練模型,也有接觸語言模型的微調,因此我對這部份有興趣,但僅限於使用 Python 程式語言及 Pytorch 套件的使用,想透過更底層的方式理解語言模型的運作。 ### 回顧其一測驗題 回顧測驗題,彙整其他學員的成果,連同延伸問題 * 第 1 週測驗題 [Timsort](https://en.wikipedia.org/wiki/Timsort) 結合合併排序和插入排序的特點 * 第 3 週測驗題 [Exponentially Weighted Moving Average](https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average) (EWMA; 指數加權移動平均) 是種取平均的統計手法,並且使經過時間越久的歷史資料的權重也會越低 * 第 4 週測驗題 [XTree](https://hackmd.io/@sysprog/linux2024-quiz4#%E6%B8%AC%E9%A9%97-3) 兼具 AVL tree 和 red-black tree 部分特性的 binary search tree (BST) * 第 6 週測驗題 [Bloom filter](https://en.wikipedia.org/wiki/Bloom_filter) 利用雜湊函數,在不用走訪全部元素的前提,「預測」特定字串是否存於資料結構中 ### 並行程式設計 回顧〈[並行和多執行緒程式設計](https://hackmd.io/@sysprog/concurrency)〉教材和相關測驗題,強化對延伸問題的掌握 ### 與老師一對一時討論 4/11 上課時老師提到要貢獻 Linux 核心很困難,但是只要把改進目標限縮到自己可以掌握的程度,也是可以做出一些成果。之後想在與老師一對一討論找到適合自己專案,並在這堂課做出貢獻。 ### 05/01 紀錄 1. 不能只做筆記 2. 一定要有數據(量化結果) 3. 檢討 #### TODO * 提升矩陣乘法的手法: 平行化是否比沒有平行化好 * Transformer 要解決什麼問題? Transformer 跟過去的模型差在哪裡,解決什麼問題 * 影響 LLaMA 推理速度的因素? 找出其中效能瓶頸的地方,可能是矩陣運算,或是記憶體