卡神新項(xiàng)目刷屏!AI老鳥(niǎo)深度解析Karpathy的開(kāi)發(fā)Trick,網(wǎng)友:700塊復(fù)刻ChatGPT!終于能親自研究ChatGPT
原創(chuàng) 精選編輯 | 云昭
復(fù)刻 ChatGPT 有多難?
商業(yè)層面看,很難。但對(duì)于眾多的開(kāi)發(fā)者、甚至實(shí)驗(yàn)室的研究生而言,從今天起,可能就要有標(biāo)準(zhǔn)答案了。
100美元,就能得到一個(gè)陪“幼兒園朋友”聊天,能寫(xiě)詩(shī)、講故事,回答“天空為什么是藍(lán)的”簡(jiǎn)單問(wèn)題的模型。
300美元,就能讓你得到一個(gè)可以超過(guò)GPT-2的模型:翻譯、完形填空、閱讀理解都可以處理。
800美元,理解和推理能力就可以做到GPT-3 Small的水準(zhǔn);
1000美元左右,這個(gè)模型就已經(jīng)可以解決簡(jiǎn)單的數(shù)學(xué)和代碼問(wèn)題以及多項(xiàng)選擇題了。(接近GPT4水平)
就在今天,知名大神Karpathy在X上宣布自己的新作:NanoChat!
圖片
Karpathy:自己寫(xiě)的最瘋狂項(xiàng)目之一
顧名思義,這個(gè)新項(xiàng)目炸裂之處,就在于他是一個(gè)類似 ChatGPT 的 LLM 的全棧實(shí)現(xiàn)。
圖像
據(jù)卡神的在Github上的介紹,這套框架運(yùn)行上,你只需要8個(gè)H100節(jié)點(diǎn),關(guān)鍵在于,它的依懶性極低,安裝非常簡(jiǎn)單。就連卡神自己都忍不住稱“這是我寫(xiě)過(guò)的最瘋狂、最放飛自我的項(xiàng)目之一!”
與我之前類似的代碼庫(kù) nanoGPT(僅涵蓋預(yù)訓(xùn)練)不同,nanochat 是一個(gè)極簡(jiǎn)的、從零開(kāi)始的全棧訓(xùn)練/推理流程,它基于一個(gè)單一且依賴性極低的代碼庫(kù),是一個(gè)簡(jiǎn)單的 ChatGPT 克隆版本。
你只需啟動(dòng)一個(gè)云 GPU 設(shè)備,運(yùn)行一個(gè)腳本,只需 4 小時(shí),就可以在類似 ChatGPT 的 Web UI 中與你的 LLM 進(jìn)行交流。
為什么說(shuō)瘋狂呢?不僅僅是因?yàn)檫@個(gè)“100美元就可以買(mǎi)到一個(gè)最好的LLM模型”這個(gè)想法瘋狂,更關(guān)鍵的是,這個(gè)想法在實(shí)驗(yàn)過(guò)程中得到了驗(yàn)證。
訓(xùn)練不到4個(gè)小時(shí),8304行代碼,只有44個(gè)文件,卻擊敗了上億參數(shù)規(guī)模的GPT-2,甚至在部分評(píng)估集上以微弱優(yōu)勢(shì)超過(guò)了GPT-4(預(yù)訓(xùn)練分詞器的評(píng)估實(shí)驗(yàn))。
圖片
比如,在訓(xùn)練分詞器方面,卡神實(shí)現(xiàn)了約 4.8 的壓縮比(這意味著平均 4.8 個(gè)原文字符變成 1 個(gè) token)。此外,還卡神將這個(gè)分詞器與 GPT-2 和 GPT-4 分詞器進(jìn)行比較。與 GPT-2(擁有 50257 個(gè) token)相比,NanoChat的分詞器在文本壓縮方面全面優(yōu)于 GPT-2,而后者則在數(shù)學(xué)部分略勝一籌:
圖片
與GPT-4的分詞器相比,NanoChat也有驚喜!
盡管我們?cè)?fineweb 上的詞匯量較小,但我們實(shí)際上還是以一點(diǎn)點(diǎn)優(yōu)勢(shì)擊敗了 GPT-4,因?yàn)槟鞘俏覀儗?shí)際訓(xùn)練的數(shù)據(jù)集,所以我們的標(biāo)記器非常匹配該文檔分布(例如,我們可能在壓縮英語(yǔ)方面具有優(yōu)勢(shì))。
圖片
Github地址:https://github.com/karpathy/nanochat
討論地址:https://github.com/karpathy/nanochat/discussions/1
價(jià)值太高!連OpenAI背后訓(xùn)練GPT的動(dòng)作都曝出來(lái)了
大家之所以對(duì)于NanoChat項(xiàng)目呼聲如此之高。
除了上面提到的成本便宜,還有一點(diǎn)就是極大地降低了大家認(rèn)知ChatGPT底層原理的門(mén)檻。
根據(jù)卡神在項(xiàng)目自述文件的描述,整個(gè)項(xiàng)目的訓(xùn)練過(guò)程、使用到的技術(shù)都和OpenAI訓(xùn)練ChatGPT的方法基本相同。
那么,這8304行代碼究竟是如何來(lái)復(fù)刻ChatGPT的?
- 預(yù)訓(xùn)練階段,使用全新的Rust實(shí)現(xiàn)訓(xùn)練分詞器;
卡神特別提到,在FineWeb上對(duì)TransformerLLM進(jìn)行預(yù)訓(xùn)練,評(píng)估多個(gè)指標(biāo)下的CORE分?jǐn)?shù); - 中期訓(xùn)練階段,卡神在來(lái)自SmolTalk的用戶-助手對(duì)話、多項(xiàng)選擇題、工具使用數(shù)據(jù)上進(jìn)行中期訓(xùn)練;
- 接下來(lái)是SFT階段,在世界知識(shí)多項(xiàng)選擇題(ARC-E/C、MMLU)、數(shù)學(xué)(GSM8K)、代碼(HumanEval)上評(píng)估聊天模型
- 然后是訓(xùn)練的最后一個(gè)階段,使用「GRPO」在GSM8K上對(duì)模型進(jìn)行強(qiáng)化學(xué)習(xí)微調(diào)(RL)
- 推理方面,卡神選擇在帶有KV緩存的引擎中實(shí)現(xiàn)高效推理,只需要簡(jiǎn)單的prefill/decode,tool-use(在輕量級(jí)沙箱中的Python解釋器),通過(guò)CLI或類ChatGPT的網(wǎng)頁(yè)界面與其交互。
- 撰寫(xiě)一份單一的Markdown成績(jī)單,總結(jié)并將整個(gè)過(guò)程游戲化。
最后一個(gè)酷似ChatGPT的Mini高級(jí)應(yīng)用就躍然眼前了!
圖片
為什么可以訓(xùn)練如此之快?AI老鳥(niǎo)總結(jié)卡神的Trick
當(dāng)然,成本能夠如此之低,自然還是卡神的智慧。在上面各個(gè)環(huán)節(jié)都設(shè)計(jì)得非常巧妙。
比如你去從文件結(jié)構(gòu)去看,會(huì)發(fā)現(xiàn)比較有意思的是:有 data loader、data set engine,還有個(gè)叫 GPT pi 的東西,看起來(lái)挺有趣。還有 muon optimizer,這里還有 distributed muon,細(xì)心地網(wǎng)友稱:這估計(jì)是給 H100 GPU 用的。
另外,參數(shù)部分也挺吸引人。序列長(zhǎng)度是 24,層數(shù) 12,768 維度,看起來(lái)是個(gè)中小型模型。因?yàn)槲易约阂苍诖钅P停钥吹竭@些配置挺有參考價(jià)值。
網(wǎng)友注意到一個(gè)trick的細(xì)節(jié)。他爆料到,一般來(lái)說(shuō),Karpathy 總喜歡讓數(shù)字“好看”——比如用 2 的平方倍數(shù)。
但其實(shí)這次,上面這些參數(shù)都不是嚴(yán)格的 2 的平方,但可能能被分解成一些平方的倍數(shù)。比如上面的這三個(gè)參數(shù):24、12、768,都不是。所以他猜測(cè)卡神肯定是發(fā)現(xiàn)最后這幾個(gè)數(shù)字更合適。
“我本來(lái)預(yù)期 hidden size 會(huì)是 148,不知道他為什么選了 768?!?/span>
還有,正則方面,卡神沒(méi)有采用 Pytorch自帶的 RoPE(旋轉(zhuǎn)位置編碼),而是采用了自己寫(xiě)的版本。
實(shí)現(xiàn)特別簡(jiǎn)潔,簡(jiǎn)直是我見(jiàn)過(guò)最優(yōu)雅的代碼。他的思路是把向量一分為二,然后用旋轉(zhuǎn)矩陣分別處理,再拼接回來(lái)。雖然我還沒(méi)完全吃透旋轉(zhuǎn)矩陣的部分,但能看出這是個(gè)非常輕量、教學(xué)導(dǎo)向的實(shí)現(xiàn)。
這還沒(méi)完,在 自回歸注意力(causal self-attention) 模塊里,卡神把 query、key、value 的線性層分開(kāi)實(shí)現(xiàn)。其實(shí)也可以優(yōu)化成一次線性變換,然后再分割結(jié)果張量,這樣可以減少內(nèi)存讀寫(xiě)。
激活函數(shù)方面,他使用了一個(gè)叫 ReLU2(ReLUSquared) 的激活函數(shù),據(jù)說(shuō)在一些實(shí)驗(yàn)中收斂更快。
卡神還提到了預(yù)計(jì)算 旋轉(zhuǎn)嵌入(rotary embeddings) 的技巧:提前把 cos 和 sin 值算好放在 GPU 內(nèi)存里,因?yàn)樗鼈儾灰蕾囉?xùn)練參數(shù)。
在優(yōu)化器部分,他把參數(shù)拆成兩組:embedding 和 LM head 用 AdamW,矩陣參數(shù)用 Muon Optimizer。這個(gè)優(yōu)化器是最近新出的,據(jù)說(shuō)在特征學(xué)習(xí)(feature learning)上表現(xiàn)不錯(cuò)。
當(dāng)然,也有一些業(yè)界所公認(rèn)的Trick,比如大框架還是經(jīng)典的 Transformer 結(jié)構(gòu):自注意力 + MLP + 殘差。
再比如采用 KV cache,來(lái)加速推理。代碼里根據(jù) cache 是否存在分支執(zhí)行不同邏輯,這點(diǎn)和大多數(shù) LLM 實(shí)現(xiàn)類似。
還有,MLP 部分,卡神沒(méi)用 Mixture of Experts,理由很合理:MoE 更適合推理階段,而不是研究階段。MLP 更易于理解和調(diào)試。
下一步:發(fā)展成一個(gè)研究工具或基準(zhǔn)
卡神在X上表示,項(xiàng)目還沒(méi)完工,自己的目標(biāo)是將完整的“強(qiáng)基線”堆棧整合到一個(gè)內(nèi)聚、精簡(jiǎn)、可讀、可修改且最大程度可分叉的倉(cāng)庫(kù)中。
而NanoChat 將成為 LLM101n(仍在開(kāi)發(fā)中)的頂點(diǎn)項(xiàng)目。
我認(rèn)為它也有潛力發(fā)展成為一個(gè)研究工具或基準(zhǔn),類似于之前的 nanoGPT。它遠(yuǎn)未完成、調(diào)整或優(yōu)化(實(shí)際上我認(rèn)為可能還有不少唾手可得的成果),但我認(rèn)為它的整體框架已經(jīng)足夠完善,可以上傳到 GitHub 上,以便所有部分都能得到改進(jìn)。
寫(xiě)在最后
當(dāng)然,這套復(fù)刻框架,肯定不能真正意義上直接幫各位得到一個(gè)ChatGPT 1:1的復(fù)刻版。
因?yàn)榫窒蘧蛿[在那里。性能上,如果想要運(yùn)行流暢度,就可能需要自己上手微調(diào)。那這就需要用戶得有點(diǎn)技術(shù)背景才能玩轉(zhuǎn)它。
比如,如果你的 顯存(VRAM) 比較小,就得調(diào)整超參數(shù)。這對(duì)新手來(lái)說(shuō)可能是個(gè)門(mén)檻。
但小編看來(lái),更多的意義,還是在于,讓“高在天上”的 LLM產(chǎn)品,變得更加評(píng)價(jià)、可及。
也就是說(shuō),卡神的這個(gè)項(xiàng)目繼續(xù)讓 AI 開(kāi)發(fā)更大眾化了,讓更多人,尤其是算力不夠的學(xué)校、學(xué)生們能參與、實(shí)驗(yàn)動(dòng)手了起來(lái)。
而這則會(huì)進(jìn)一步帶動(dòng)AI應(yīng)用的繁榮。
想一想,如果連大學(xué)學(xué)生、業(yè)余開(kāi)發(fā)者都能低成本訓(xùn)練模型,也許能催生很多有創(chuàng)意的應(yīng)用。
因?yàn)檫@個(gè)項(xiàng)目是開(kāi)源的,所有人按照自己需求進(jìn)行調(diào)整、修改,得到自己想要的結(jié)果。
使用 nanochat,你幾乎可以調(diào)任何東西。無(wú)論是換 tokenizer、改訓(xùn)練數(shù)據(jù)、調(diào)整超參數(shù),還是優(yōu)化算法,都可以自由嘗試——有很多潛在思路可以探索。
如果你希望訓(xùn)練更大的模型,也很容易做到。
代碼庫(kù)的設(shè)計(jì)是完全可擴(kuò)展的:你只需要通過(guò)參數(shù) --depth 來(lái)改變模型層數(shù),其他相關(guān)參數(shù)都會(huì)自動(dòng)按比例調(diào)整。
這意味著它的“復(fù)雜度”只靠這一個(gè)滑桿就能控制。
正如一位網(wǎng)友所說(shuō),看起來(lái),NanoChat雖然只是小步前進(jìn),但它可能引發(fā)大波浪。
項(xiàng)目提供了詳細(xì)的指導(dǎo)文檔,它還支持把文件打包成可查詢的數(shù)據(jù)塊,很友好。這一點(diǎn)我挺欣賞——能看出作者是站在用戶角度思考的。沒(méi)錯(cuò)。
現(xiàn)在,大家都能理解Karpathy為什么會(huì)被稱之為“卡神”了吧!太牛了!
圖片
寫(xiě)完這篇稿子一看,哇塞,這個(gè)項(xiàng)目已經(jīng)狂飆到了8.2K星!


































