“這是我寫過的最精神錯亂的作品之一。”剛剛,特斯拉前 AI 總監、OpenAI 創始成員 Andrej Karpathy(安德烈·卡帕西)發佈了自己最新的開源項目,一個名為 nanochat 的存儲庫。截止當前,該項目已在 GitHub 破了 7.9kStar!
GitHub 倉庫:https://github.com/karpathy/nanochat
據介紹,和卡帕西之前那個只包含預訓練功能的類似倉庫 nanoGPT 不同,nanochat 是一個極簡的、從零構建的全流程訓練 / 推理工具鏈,可用於搭建簡易版 ChatGPT 復現模型,且整個代碼庫僅一個文件,依賴項極少。
花半天用 100 美元訓練的模型, 打敗了 GPT-2
“100 美元能買到的最好的 ChatGPT”,卡帕西在公告中這樣形容 nanochat。通過 nanochat,你只需啟動一臺雲 GPU 服務器,運行一個腳本,最快 4 小時後,就能在類 ChatGPT 的網頁界面上與你自己訓練的大語言模型(LLM)對話。
具體來說,該項目可實現以下功能:
- 基於全新 Rust 語言實現版本訓練分詞器(tokenizer)
- 在 FineWeb 數據集上對 Transformer 架構大語言模型進行預訓練,並通過多項指標評估 CORE 得分
- 在 SmolTalk 用戶 - 助手對話數據集、多項選擇題數據集、工具使用數據集上進行中期訓練(Midtrain)
- 對聊天模型進行指令微調(SFT),並在世界知識多項選擇題(ARC-E/C、MMLU)、數學題(GSM8K)、代碼任務(HumanEval)上評估模型性能
- 可選通過 “GRPO” 算法在 GSM8K 數據集上對模型進行強化學習(RL)訓練
- 在帶有 KV 緩存的推理引擎中實現高效推理,支持簡單的預填充 / 解碼流程、工具使用(輕量級沙箱中的 Python 解釋器),可通過命令行界面(CLI)或類 ChatGPT 網頁界面(WebUI)與模型交互
- 自動生成一份 Markdown 格式的 “報告卡”,對整個項目流程進行總結,並將各項指標以 “遊戲化” 方式呈現
據卡帕西介紹,即便成本低至約 100 美元(在 8 卡 H100 節點上訓練約 4 小時),也能用 nanochat 訓練出一個可對話的簡易版 ChatGPT 復現模型,它能寫故事、寫詩,還能回答簡單問題。訓練約 12 小時後,模型性能便可超過 GPT-2 的 CORE 指標。
在 Github 上,卡帕西講解了用 100 美元“極速訓練”出最優 ChatGPT 模型的詳細過程。
詳細技術步驟:https://github.com/karpathy/nanochat/discussions/1
若進一步將成本提升至約 1000 美元(訓練約 41.6 小時),模型的連貫性會顯著提升,能夠解決簡單的數學題、代碼任務,還能完成多項選擇題測試。例如,一個深度為 30 的模型訓練 24 小時後(其計算量 FLOPs 與 GPT-3 Small(12.5 億參數)相當,僅為 GPT-3 的 1/1000),在 MMLU 數據集上可取得 40 多分,在 ARC-Easy 數據集上可取得 70 多分,在 GSM8K 數據集上可取得 20 多分。
卡帕西的目標是將這套完整的 “強基準” 工具鏈整合到一個邏輯連貫、極簡、易讀、可修改性強、極適合分支開發(forkable)的代碼倉庫中。“nanochat 將成為 LLM101n 課程(目前仍在開發中)的核心項目。我認為它還有潛力發展成一個研究工具框架或基準測試工具,就像之前的 nanoGPT 一樣。”
據其透露,目前這個項目絕非最終版本,既未完成全面調優,也未進行性能優化,但它的整體框架已足夠完善,可以發佈到 GitHub 上,後續所有模塊都能在社區中進一步改進。並且,卡帕西稱,實際上 nanochat 還有不少容易實現的優化點。
純手寫 8000 行代碼, “Agent 幫不上忙”
整個項目總共只有約 8000 行代碼,但卡帕西強調“代碼結構相當清晰”。並且,這個代碼倉庫基本上完全是卡帕西手寫的 , 也就用了個 Tab 鍵自動補全功能。
“我之前試過幾次用 Claude 或者 Codex 的 Agent 來輔助,但效果都特別差,到頭來反而幫不上忙;可能是因為這個倉庫的代碼風格和功能,跟這些工具訓練數據裡的常規代碼偏差太大了吧。”卡帕西表示。
談及 nanochat 的模型架構,卡帕西介紹,整體類似 Llama 模型,結構上更簡潔一些,同時借鑑了 modded-nanoGPT(改進版 nanoGPT)的部分設計思路。
他嘗試為該規模的模型確定一個可靠的基準架構,具體如下:
- 稠密 Transformer(無稀疏結構)
- 旋轉位置編碼(Rotary Embeddings),不使用其他位置編碼
- QK 歸一化(QK Norm,對查詢向量 Q 和鍵向量 K 進行歸一化)
- 嵌入層(embedding)與解嵌入層(unembedding)權重不共享
- 對詞元嵌入(token embedding)結果進行歸一化
- 多層感知機(MLP)中使用 relu 平方(relu²)激活函數
- 根均方歸一化(RMSNorm)中不包含可學習參數
- 線性層(linear layers)中不使用偏置項(biases)
- 多查詢注意力(Multi-Query Attention, MQA)
- 對數概率軟截斷(logit softcap,限制 logit 數值範圍以穩定訓練)
nanochat 的優化器採用 Muon+AdamW 組合,該設計很大程度上參考了 modded-nanoGPT。據悉,目前卡帕西有一個待辦項:嘗試通過優化 Adam 的學習率(例如為不同模塊設置專屬學習率),來移除對 Muon 的依賴,但目前他還沒有投入足夠精力去做這件事。
網友:喜提機器,學習工程師頭銜
除了 Github,這次發佈的 nanochat 在社交平臺的熱度也非常高。
“一直喜歡 Nano 系列項目!這套極簡的端到端訓練 / 推理工具鏈,一定會給眾多機器學習學習者和科研人員帶來深遠影響。”一位網友說道。
也有網友表示,“對我個人而言,這個代碼倉庫是一份超棒的未來學習資料 —— 不管是理解基於 Rust 的底層深度學習實現,還是(更基礎的)Python 深度學習開發,都很有幫助。”同時,他指出,“要是現在每個人都能借助這個倉庫,用最少的精力訓練出自己的大語言模型(LLM),那 Anthropic、OpenAI 這類公司的技術優勢不就被削弱了嗎?畢竟市面上有很多優秀的工程師,只要有足夠的資源,他們完全有可能訓練出更強大的大語言模型。”
還有人指出,“我認為這個代碼倉庫最大的受眾是科研人員。很多人可能都有改進大語言模型(LLM)的想法,但要把想法落地成完整的實現,不僅需要投入大量精力,最終效果還充滿不確定性。而現在,我們有了這樣一套現成的工具流程,大家可以直接用它來做實驗。以前只是‘如果能這樣做會怎麼樣?’ 的空想,現在變成了 ‘我下週末就能試著把這個想法實現出來’ 的切實行動。”
甚至有網友開玩笑道,“跑完這個之後,我肯定要在簡歷上加上‘機器學習工程師’這個頭銜。”
參考鏈接:
https://x.com/karpathy/status/1977755427569111362
https://github.com/karpathy/nanochat
本文來自微信公眾號“AI前線”, 整理:華衛 ,36氪經授權發佈。