Andrej Karpathy 發佈新任務 nanochat:一個從零開始構建的極簡全棧式 ChatGPT 克隆_數據

剛剛,Andrej Karpathy 推出了他的最新開源項目 nanochat。與之前聚焦於預訓練階段的 nanoGPT 不同,nanochat 給出了一個從頭開始、代碼極簡的全棧式類 ChatGPT 模型的訓練與推理流水線。 整個項目被整合在一個依賴極少的單一代碼庫中,旨在幫助開發者和研究者深入理解大語言模型(LLM)的完整生命週期。

根據 Karpathy 的介紹,用户只需啓動一台雲端GPU服務器並運行一個腳本,最快在4小時後,便能通過一個類似 ChatGPT 的網頁界面,與自己親手訓練的語言模型進行交互。

Andrej Karpathy 發佈新任務 nanochat:一個從零開始構建的極簡全棧式 ChatGPT 克隆_語言模型_02

完整的端到端實現流程

nanochat 項目的代碼量約 8000 行,覆蓋了構建一個聊天機器人的完整技巧流程,具體包括:

  • 分詞器訓練 (Tokenizer Training):採用了一個基於 Rust 的全新搭建來訓練分詞器。
  • 預訓練 (Pre-training):在 FineWeb 素材集上預訓練一個 Transformer 架構的語言模型,並依據多項指標評估其 CORE 分數。
  • 中間訓練 (Intermediate Training):使用來自 SmolTalk 的用户-助手對話數據、多項選擇題及工具使用數據,對預訓練模型進行進一步訓練。
  • 監督微調 (SFT):在多個領域的基準測試上對聊天模型進行微調與評估,涵蓋世界知識(ARC-easy/challenge, MMLU)、數學推理(GSM8K)和代碼生成(HumanEval)。
  • 強化學習 (RL):提供一個可選的強化學習階段,使用 “GRPO” 算法(PPO的簡化變種)在 GSM8K 信息集上進一步優化模型。
  • 高效推理 (Inference):通過完成了一個帶有 KV 緩存的高效推理引擎,支持 prefill/decode 模式和工具使用(利用輕量級沙箱調用 Python 解釋器)。用户能夠經過命令行或網頁界面與模型交互。
  • 生成式報告卡 (Report Card Generation):自動生成一份 Markdown 格式的報告卡,以遊戲化的方式總結和呈現整個訓練過程的各項指標與成果。

成本與性能預期

Karpathy 詳細説明了不同計算投入所能達成的模型性能水平:

  • 約 100 美元成本(在 8x H100 節點上訓練約 4 小時):可以訓練出一個能夠處理便捷對話、生成故事或詩歌,並回答基礎問題的小型 ChatGPT 克隆體。 經過約 12 小時的訓練,模型的 CORE 指標能夠超越 GPT-2。
  • 約 1000 美元成本(訓練約 41.6 小時):隨着投入增加,模型將表現出更強的連貫性,能夠克服簡單的數學和代碼疑問,並在多項選擇題測試中取得更好的成績。

例如,一個擁有 30 層深度、訓練 24 小時(其總計算量約等於 GPT-3 Small 125M 模型的千分之一)的模型,能在 MMLU 測試中獲得 40+ 的分數,在 ARC-Easy 上得分超過 70,在 GSM8K 上的得分也達到了 20+。

項目願景與技術細節

Karpathy 的核心目標是創建一個高度集成、代碼極簡、易於理解、可被任意修改和復刻(forkable)的強大基線技能棧。 nanochat 也將成為他正在創建的 LLM101n 課程的頂點項目。 他認為,該項目具備發展成為一個重要研究工具或行業基準的潛力,正如 nanoGPT 此前所取得的成功一樣。

同時,Karpathy 也坦言,計劃目前遠未達到完全優化或精調的狀態,但他認為其整體框架已經足夠成熟,行發佈並交由社區共同改進。

技術細節與官方問答

在任務發佈後,Karpathy 回答了社區關心的一些技術問題。

問:該方案訓練所用的模型架構是什麼?

Karpathy:其架構基本與 Llama 類似,但經過了簡化,並受到了一些修改版 nanoGPT 的啓發。具體的技能選型包括:

  • 核心架構:密集的 Transformer (Dense Transformer)。
  • 位置編碼:旋轉位置嵌入 (RoPE),不使用絕對位置嵌入。
  • 歸一化:查詢(Query)和鍵(Key)應用了歸一化(QK Norm)。同時,在 Token 嵌入後和 MLP 層前使用了 RMSNorm,且 RMSNorm 中不具備可學習參數。
  • 權重共享:詞嵌入(Embedding)與分類頭(Unembedding)的權重不進行綁定。
  • 激活函數:MLP 層中運用的激活函數為平方 ReLU,其數學表達式為:
    Andrej Karpathy 發佈新任務 nanochat:一個從零開始構建的極簡全棧式 ChatGPT 克隆_權重_03
  • 偏置項:所有線性層(Linear layers)均不採用偏置項(bias)。
  • 注意力機制:採用多查詢注意力(Multi-Query Attention, MQA)。
  • 輸出處理:對 Logits 應用 Softcap。
  • 優化器:採用 Muon + AdamW 優化器,這一選擇深受修改版 nanoGPT 的影響。

問:我是否可能用該項目來訓練一個處理我個人素材(如 Notion 筆記、健康數據等)的私人聊天機器人?

Karpathy:Karpathy 認為 nanochat 目前並不適合此用途。他將這類小型模型比作“幼兒園水平的孩子”,它們不具備大型模型所擁有的原始智能。 直接用個人數據對這類模型進行微調,雖然可能在風格上模仿用户的寫作,但生成內容的質量會很差。

要完成高質量的個人機器人,需更復雜的流程,這在很大程度上仍屬於前沿研究領域:

  1. 首先,獲取原始個人數據。
  2. 在此基礎上進行大量的合成數據生成與重寫。
  3. 在一個性能頂尖的開源大語言模型上進行微調。
  4. 在微調過程中,可能還需要混合大量的預訓練數據,以防止模型“遺忘”其原有的通用能力(即災難性遺忘)。

對於非研究用途,Karpathy 推薦的替代方案是使用如 NotebookLM 這樣的器具,它通過檢索增強生成(RAG)技術來處理個人數據。 在此模式下,數據作為上下文被輸入模型,但並不改變模型的權重。因此,模型並非真正地“瞭解”你,但這可能是當前最容易實現的方案。

相關鏈接

GitHub 倉庫地址:https://github.com/karpathy/nanochat更詳細的手藝介紹:https://github.com/karpathy/nanochat/discussions/1