Dolma:把預訓練語料的清理流程拆成可重跑的管線
Data and tools for generating and inspecting OLMo pre-training data.
秒懂
- 它是什麼?
- Dolma 同時是一個 3 兆 token 的開放語料庫,以及一套用來產生與檢查這類語料的 Python 工具組。它解決的是語料清理無法重現的問題,代價是你得接受它的標記器與去重策略已經替你做了決定。
- 適合誰用?
- Dolma 適合需要為預訓練語料建立可重跑清理流程的團隊,特別是已經在用 OLMo 系列模型、或需要比對不同過濾規則效果的研究者。如果你只是想要一份現成語料,直接從 HuggingFace 下載 allenai/dolma 就好,工具組對你沒有用處;如果你的語料是私有領域文本且過濾邏輯與 Gopher、C4 差異很大,內建標記器的價值也有限。
- 可以商用嗎?
- 可以。Apache-2.0 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
- 還在維護嗎?
- 有在維護。儲存庫最近一次提交在 22 天前。
- 用什麼語言寫的?
- 主要是 Python(依據 GitHub 的語言統計)。
以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。
開源專案深度解析
Dolma 要解的是語料清理無法重現這件事
訓練一個語言模型之前,通常得先決定哪些文件要留、哪些要丟。這個決定往往散落在數十個臨時腳本裡,換一個人接手就重跑不出同樣的結果。Dolma Toolkit 把這整段流程收斂成一套有名字的子命令與設定檔,讓同一份原始語料經過同一組規則之後,產出可以預期的結果。
它的目標讀者有兩類。一類是要為自己的模型準備預訓練語料的人,需要一套能跑在單機也能跑在叢集上的工具;另一類是研究資料組成如何影響模型行為的人,需要一份公開且規則明確的語料當基準。Dolma Dataset 就是為後者準備的:README 說明它是 3 兆 token、混合網頁內容、學術出版品、程式碼、書籍與百科材料的語料,作為 AI2 自家 OLMo 模型的訓練語料而建立。
這裡有個容易混淆的地方。Dolma 是資料集也是工具組,但兩者的授權不同。資料集採用 ODC-BY,工具組所在的 repo 採用 Apache-2.0。想把 Dolma 產出的語料再散布出去,要看的是資料集那一端的條款,不是程式碼那一端。
標記器與 Bloom filter 去重構成管線的兩端
從 repo 的說明來看,Dolma Toolkit 的處理模型是「文件流進、標記加上去、重複的丟掉」。標記器負責判斷一份文件是否符合某種品質規則,repo 內建了三套常見的規則:Gopher、C4 與 OpenWebText。這三套規則各自來自不同的語料建構經驗,對文件長度、符號比例、重複行比例這類指標的容忍度不一樣,所以同一份語料經過不同標記器之後留下的東西不會相同。
去重那一端用的是以 Rust 實作的 Bloom filter。README 把它列為獨立特點,強調速度。Bloom filter 的取捨是固定的:它用機率性的資料結構換取記憶體與速度,代價是可能把沒重複的文件誤判為重複。文件裡沒有給出誤判率的具體數字,所以實際影響要看你的語料規模與設定的參數,這點必須自己量。
兩端之間還有一個容易被忽略的設計:自訂標記器。內建三套規則涵蓋的是英文網頁文本的常見情境,遇到非英文、程式碼或領域文本時,內建規則未必合用,這時得自己寫標記器接進管線。這也是判斷要不要採用的關鍵分岔點。
安裝與執行:從 pip install dolma 開始
README 給的安裝方式只有一行:pip install dolma。沒有提到需要先編譯 Rust 元件,也沒有列出系統層級的相依套件,從文字上看就是一個標準的 Python 套件安裝流程。實際安裝時是否會拉進預編譯的 Rust 二進位檔,文件沒有交代,這是採用前值得先在自己環境試一次的地方。
repo 的說明把使用方式指向 docs 目錄,沒有在 README 裡展開完整的子命令清單。能從文字確認的只有幾件事:工具支援單機、叢集與雲端環境;支援自訂標記器;支援 AWS S3 相容的儲存位置。這三項是 README 明確列出的能力,其餘參數與設定鍵的細節要看 docs。
因此這篇文章不會列出我沒有把握的設定鍵名稱。要確認實際介面,最直接的做法是安裝後執行 dolma --help,看子命令與參數是否與文件一致。這種做法聽起來平淡,但對於一套會直接決定訓練語料內容的工具,先確認介面再寫進自動化腳本,比事後才發現參數改名要省事。
內建標記器是便利,也是預設立場
Gopher、C4、OpenWebText 這三套規則之所以被內建,是因為它們在英文網頁語料的清理上有公開可查的經驗基礎。但把它們當成預設值使用,等於接受了一套關於「什麼是好文件」的判斷,而這套判斷是為特定語料與特定語言設計的。
如果你的語料是中文、日文或程式碼倉庫,內建標記器的過濾條件可能過度刪除或幾乎不過濾。文件沒有提供各標記器在不同語言上的表現數據,所以這不是一個可以從 README 推論的問題,只能自己抽樣比對過濾前後的文件分布。
另一個限制來自去重的機率性質。Bloom filter 不會告訴你「這份文件確定重複」,它只會說「可能重複」。在需要精確去重的場景,例如要產出一份可被引用、每份文件都能追溯來源的語料,機率性去重會留下不確定性。這種不確定性在預訓練規模下通常可接受,在資料稽核場景下則不然。
與純腳本清理的差異在哪
最直接的替代方案是自己寫 Python 腳本搭配 multiprocessing 做過濾與去重。兩者的差別不在於能不能做,而在於做了之後留下什麼。自寫腳本通常不會留下規則的版本紀錄,也不會有內建標記器這種可以直接引用的現成實作,換人接手時得重新讀一遍程式碼才能知道當初為什麼這樣過濾。
Dolma 的取捨是把規則具名化。代價是彈性:當你的過濾邏輯與內建規則差異很大時,你是在一個為別人設計的框架裡寫自己的東西,還得先理解它的資料流。如果你只需要過濾三種檔案格式、語料規模在單機可處理的範圍內,自寫腳本可能更快也更透明。
另一個方向是直接用 HuggingFace 上的 allenai/dolma 語料,完全不碰工具組。這條路省掉所有清理工作,但你也就接受了 AI2 的過濾決定,而且無法針對自己的下游任務調整。三條路的分界點是:你要的是現成語料、可重跑的清理流程,還是一份完全自己掌控的規則集。
維護節奏與授權的實際影響
從釋出紀錄看,v1.2.0 在 2025 年 6 月,v1.2.1 在同年 7 月,前一個版本 v1.1.2 則在 2025 年 2 月。這個節奏說明專案仍在維護,修補版與次版本交替出現,不是一年一動的狀態。repo 未被封存,最後推送時間在 2026 年 8 月,代表程式碼仍在更新。
升級成本主要落在兩處。一是標記器行為若在新版本中調整,同一份語料重跑會得到不同結果,這對已經發表的實驗是麻煩事,所以鎖定版本號是必要的。二是 Rust 元件的相依,若你的環境無法取得預編譯檔,升級時可能得處理編譯問題。
授權方面,工具組是 Apache-2.0,寬鬆且允許商業使用;資料集是 ODC-BY,要求署名。兩者不衝突,但用途不同:拿工具組跑自己的私有語料,約束來自 Apache-2.0;散布 Dolma 語料本身或其衍生版本,則要滿足 ODC-BY 的署名條件。這裡不構成法律意見,實際條款請自行閱讀原文。
採用前該確認的幾件事
第一,確認安裝後的實際介面。README 只給了 pip install dolma 一行,其餘指向 docs,所以在你把任何指令寫進 CI 之前,先在本機跑一次確認子命令名稱與參數。
第二,確認你的語言與領域是否落在內建標記器的適用範圍。做法是抽樣一批文件,分別用 Gopher、C4 與 OpenWebText 標記器跑過,比較留下的文件數量與內容。這個比較不需要跑完整語料,抽樣就足以看出方向。
第三,確認去重的誤判在你的場景是否可接受。如果你的產出需要每份文件都能追溯到來源,機率性去重會是問題;如果只是預訓練語料,通常可以接受。這個判斷取決於你的下游用途,而不是工具本身的優劣。
第四,確認文件與程式碼的落差。repo 的 docs 目錄是主要說明來源,README 本身相當精簡。若某個功能只在 README 出現而 docs 沒有對應章節,最好先假設它的行為需要實測。
編輯結論
Dolma 適合需要為預訓練語料建立可重跑清理流程的團隊,特別是已經在用 OLMo 系列模型、或需要比對不同過濾規則效果的研究者。如果你只是想要一份現成語料,直接從 HuggingFace 下載 allenai/dolma 就好,工具組對你沒有用處;如果你的語料是私有領域文本且過濾邏輯與 Gopher、C4 差異很大,內建標記器的價值也有限。採用前先確認三件事:pip install dolma 之後跑一次 dolma --help 確認子命令與你手上的版本相符,確認你的去重規模是否落在 Bloom filter 可接受的誤判範圍內,以及確認 Dolma Dataset 的 ODC-BY 授權與你下游產出的授權要求是否相容。
社群筆記