離開OpenAI待業(yè)的Karpathy做了個大模型新項目,Star量一日破千
閑不下來的 Andrej Karpathy 又有了新項目!
過去幾天,OpenAI 非常熱鬧,先有 AI 大牛 Andrej Karpathy 官宣離職,后有視頻生成模型 Sora 撼動 AI 圈。
在宣布離開 OpenAI 之后,Karpathy 發(fā)推表示「這周可以歇一歇了?!?/span>
圖源:https://twitter.com/karpathy/status/1757986972512239665
這種無事要做的狀態(tài)讓馬斯克都羨慕(I am envious)了。
但是,如果你真的認為 Karpathy 會閑下來,那就有點「too young, too navie」了。
這不,有眼尖的網(wǎng)友發(fā)現(xiàn)了 Karpathy 的新項目 ——minbpe,致力于為 LLM 分詞中常用的 BPE(Byte Pair Encoding, 字節(jié)對編碼)算法創(chuàng)建最少、干凈以及教育性的代碼。
僅僅一天的時間,該項目的 GitHub 標星已經(jīng)達到了 1.2 k。
圖源:https://twitter.com/ZainHasan6/status/1758727767204495367
有人 P 了一張圖,表示 Karpathy 為大家「烹制了一頓大餐」。
圖源:https://twitter.com/andrewcyu/status/1758897928385561069
更有人歡呼,Karpathy is back。
圖源:https://twitter.com/fouriergalois/status/1758775281391677477
我們來看一看「minbpe」項目具體講了些什么。
項目介紹
GitHub 地址:https://github.com/karpathy/minbpe
我們知道,BPE 算法是「字節(jié)級」的,在 UTF-8 編碼的字符串上運行。該算法通過 GPT-2 論文和 GPT-2 相關的代碼在大語言模型(LLM)中得到推廣。
現(xiàn)如今,所有現(xiàn)代的 LLM(比如 GPT、Llama、Mistral)都使用 BPE 算法來訓練它們的分詞器(tokenizer)。
Karpathy 的 minbpe 項目存儲庫中提供了兩個 Tokenizer,它們都可以執(zhí)行分詞器的 3 個主要功能:1)訓練 tokenizer 詞匯并合并給指定文本,2)從文本編碼到 token,3)從 token 解碼到文本。
詳細的存儲庫文件分別如下:
- minbpe/base.py:實現(xiàn) Tokenizer 類,是基類。它包含了訓練、編碼和解碼存根、保存 / 加載功能,還有一些常見的實用功能。不過,該類不應直接使用,而是要繼承。
- minbpe/basic.py:實現(xiàn) BasicTokenizer,這是直接在文本上運行的 BPE 算法的最簡單實現(xiàn)。
- minbpe/regex.py:實現(xiàn) RegexTokenizer,它通過正則表達式模式進一步拆分輸入文本。作為一個預處理階段,它在分詞之前按類別(例如字母、數(shù)字、標點符號)拆分輸入文本。這確保不會發(fā)生跨類別邊界的合并。它是在 GPT-2 論文中引入的,并繼續(xù)在 GPT-4 中使用。
- minbpe/gpt4.py:實現(xiàn) GPT4Tokenizer。此類是 RegexTokenizer 的輕量級封裝,它精確地復現(xiàn)了 tiktoken(OpenAI 開源分詞神器)庫中 GPT-4 的分詞。封裝處理有關恢復 tokenizer 中精確合并的一些細節(jié),并處理一些 1 字節(jié)的 token 排列。需要注意,奇偶校驗尚未完全完成,沒有處理特殊的 token。
腳本 train.py 在輸入文本 tests/taylorswift.txt 上訓練兩個主要的 tokenizer,并將詞匯保存到磁盤以進行可視化。Karpathy 稱,該腳本在他的 MacBook (M1) 上運行大約需要 25 秒。
Karpathy 還表示,所有文件都非常短且注釋詳盡,并包含使用示例。如下為 BPE 維基百科文章的復現(xiàn)例子。
from minbpe import BasicTokenizer
tokenizer = BasicTokenizer()text = "aaabdaaabac"
tokenizer.train(text, 256 + 3) # 256 are the byte tokens, then do 3 merges
print(tokenizer.encode(text))# [258, 100, 258, 97, 99]
print(tokenizer.decode([258, 100, 258, 97, 99]))# aaabdaaabac
tokenizer.save("toy")# writes two files: toy.model (for loading) and toy.vocab (for viewing)
此外還提供了如何實現(xiàn) GPT4Tokenizer,以及它與 tiktoken 的比較。
text = "hello123!!!? (?????!) ??"
# tiktoken
import tiktoken
enc = tiktoken.get_encoding("cl100k_base")print(enc.encode(text))# [15339, 4513, 12340, 30, 320, 31495, 230, 75265, 243, 92245, 16715, 57037]
# ours
from minbpe import GPT4Tokenizer
tokenizer = GPT4Tokenizer()print(tokenizer.encode(text))# [15339, 4513, 12340, 30, 320, 31495, 230, 75265, 243, 92245, 16715, 57037]
當然,Karpathy 不滿足只推出 GitHub 項目,他表示視頻很快就會發(fā)布。