偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié) 精華

發(fā)布于 2024-7-22 10:40
瀏覽
1收藏

一、背景介紹

LLM 的模型參數(shù)量很大,其模型效果也需要巨大的語料庫支撐,LLM 預(yù)訓(xùn)練需要的 Token 數(shù)已經(jīng)從早期的 300B Token 逐漸增加到 1.4T,甚至進(jìn)一步擴(kuò)展到 3T 以上。本文中我們具體介紹 LLM 預(yù)訓(xùn)練語料庫的來源,構(gòu)建語料庫的預(yù)處理過程以及 LLM 預(yù)訓(xùn)練的 Dataset 存儲、混合、加載方式。

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

二、常見語料庫

雖然不同 LLM 的模型大小不同,預(yù)訓(xùn)練的 Token 數(shù)也各不一樣,但是其原始的語料都大同小異,主要有幾種類型:CommonCrawl、Wikipedia、Books、Code、ArXiv、Reddit links 等。

2.1 CommonCrawl

CommonCrawl 是一個(gè)免費(fèi)、開放的網(wǎng)絡(luò)爬蟲數(shù)據(jù)集,旨在提供大規(guī)模的網(wǎng)頁抓取數(shù)據(jù),使研究人員、開發(fā)者和數(shù)據(jù)科學(xué)家能夠訪問和分析互聯(lián)網(wǎng)上的信息。該數(shù)據(jù)集由 Common Crawl Foundation 維護(hù),該基金會是一個(gè)非營利性組織,致力于促進(jìn)網(wǎng)絡(luò)信息的開放共享。

CommonCrawl 數(shù)據(jù)集非常大,并且在不斷地更新中,具體可參考 Common Crawl - Overview,其中最新的 CC-MAIN-2023-50 共包含 3.35B 個(gè)網(wǎng)頁,壓縮后的數(shù)據(jù)超過 130TB。具體如下圖所示:

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

由于 CommonCrawl 數(shù)據(jù)集過于龐大,并且包含很多噪聲,處理的成本很高,因此也有其他研究者提供了相應(yīng)處理過的子集,比如 C4(Colossal Clean Crawled Corpus),可以參考 GitHub - google-research/text-to-text-transfer-transformer。

2.2 Wikipedia

Wikipedia 是一個(gè)由全球志愿者維護(hù)的在線百科全書項(xiàng)目。其包含多種語言,涉及的領(lǐng)域也非常廣,并且質(zhì)量非常高。比如如下圖所示,“Large language model” 頁面有 29 種語言,并且分了各個(gè)部分進(jìn)行介紹:

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

2.3 Books

書籍是另一種高質(zhì)量的語料庫,與其他語料庫相比,其涵蓋的語言、領(lǐng)域更加廣泛,內(nèi)容也更加正式。總體來說,使用書籍作為語料庫預(yù)訓(xùn)練 LLM 可以獲得如下好處:

  • 廣泛的知識涵蓋:書籍包含很多領(lǐng)域,比如科學(xué)、歷史、文學(xué)以及技術(shù)等。書籍能使 LLM 接觸豐富多樣的知識,有助于提高其對各種主題的理解和表達(dá)能力。
  • 豐富的語言表達(dá):書籍中通常包含豐富而復(fù)雜的語言表達(dá),包括各種風(fēng)格、修辭和專業(yè)術(shù)語。通過學(xué)習(xí)書籍中的語言使用方式,LLM 可以更好地捕捉到語境、上下文和語法結(jié)構(gòu),提高其生成自然語言的能力。
  • 專業(yè)的領(lǐng)域知識:一些書籍涉及特定領(lǐng)域的深度知識,如科學(xué)、法律、醫(yī)學(xué)等。在 LLM 的訓(xùn)練中使用這些書籍可以使模型更好地理解和生成與這些領(lǐng)域相關(guān)的內(nèi)容。
  • 多樣性的文本結(jié)構(gòu):書籍中的文本結(jié)構(gòu)多種多樣,包括章節(jié)、段落、腳注等。通過訓(xùn)練模型處理這些不同層次和結(jié)構(gòu)的文本,有助于提高其對復(fù)雜文檔和長文本的理解和處理能力。
  • 知識結(jié)構(gòu)和推理能力:書籍中的內(nèi)容通常有一定的邏輯和知識結(jié)構(gòu),通過訓(xùn)練模型學(xué)習(xí)這些結(jié)構(gòu),可以提高其在理解和生成邏輯推理、連貫性論述方面的能力。
  • 語言多樣性:書籍中使用的語言可能涵蓋多種方言、俚語和文學(xué)風(fēng)格,這有助于訓(xùn)練模型更好地理解和生成多樣化的語言表達(dá)。

2.4 Code

當(dāng)前很多 LLM 預(yù)訓(xùn)練語料中也會加入 Code,比如來自 Github、Gitlab 或者編程問答網(wǎng)站(比如 StackOverflow)的語料,因?yàn)槠洳粌H對 LLM 理解編程語言,代碼注釋和生成代碼很有幫助,也有研究表明其對 LLM 的推理能力至關(guān)重要。

2.5 ArXiv

ArXiv(??https://arxiv.org/??) 是一個(gè)包含各個(gè)學(xué)科領(lǐng)域的預(yù)印本(Preprint)平臺,涵蓋數(shù)學(xué)、物理、計(jì)算機(jī)科學(xué)等多個(gè)學(xué)科,包含大量領(lǐng)域特定的術(shù)語和語言,比如數(shù)學(xué)符號、專業(yè)術(shù)語等。在預(yù)訓(xùn)練語料中加入 ArXiv 中的論文可以使 LLM 接觸到廣泛的學(xué)術(shù)知識、提高對不同學(xué)科的理解能力。

2.6 Stack Exchange

Stack Exchange (??https://stackexchange.com/??)是一個(gè)高質(zhì)量問答網(wǎng)站,涵蓋從計(jì)算機(jī)科學(xué)到化學(xué)等多個(gè)領(lǐng)域。

三、數(shù)據(jù)預(yù)處理

3.1 概述

收集到預(yù)料數(shù)據(jù)往往不會直接用于預(yù)訓(xùn)練,因?yàn)槠渫ǔ1容^大,并且包含很多冗余和噪聲,需要進(jìn)一步的過濾清理,此外,有些數(shù)據(jù)(尤其抓取的網(wǎng)頁數(shù)據(jù))中還可能包含一些敏感信息,比如個(gè)人的身份信息、家庭信息以及其他色情或者敏感信息,都需要進(jìn)一步的處理。

如下圖 Fig. 7 (來自 [2303.18223] A Survey of Large Language Models)所示,常見的數(shù)據(jù)處理包含質(zhì)量過濾(Quality Filtering)、去重(De-deplication)、隱私擦除(Privacy Reduction)、Tokenization、數(shù)據(jù)混合等:

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

3.2 LLaMA-1

LLaMA 是 Meta 發(fā)布的 LLM,如下圖所示為 LLaMA-1 中預(yù)訓(xùn)練語料的來源、混合比例等統(tǒng)計(jì)信息,經(jīng) Tokenizer (采用 BPE 算法)后生成 1.4T Token:

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

針對不同的數(shù)據(jù)采用了不同的預(yù)處理策略:

  • English CommonCrawl:使用 CCNet Pipeline 處理了 2017 年到 2020 年的 5 個(gè) CommonCrawl 數(shù)據(jù)。預(yù)處理包括:按行進(jìn)行重復(fù)數(shù)據(jù)刪除、基于fastText 語言分類器刪除非英語數(shù)據(jù)、使用 ngram 語言模型刪除低質(zhì)數(shù)據(jù)。
  • C4:雖然 C4 數(shù)據(jù)集來自 CommonCrawl,但是作者發(fā)現(xiàn)使用不同預(yù)處理的 CommonCrawl 數(shù)據(jù)集可以提升性能,因此依舊使用了 C4。同時(shí)也應(yīng)用了重復(fù)數(shù)據(jù)刪除、語言識別相關(guān)操作。
  • Github:來自 Google 的 BigQuery,只保留符合 Apache、BSD 和 MIT 許可的項(xiàng)目。此外,根據(jù)行的長度或字母和數(shù)字的比例采用啟發(fā)式方法過濾低質(zhì)量文件。此外,也采用正則表達(dá)式刪除標(biāo)題等內(nèi)容。最后,還在文件級按匹配度進(jìn)行去重。
  • Wikipedia:來自 2022 年 6月-8月版本,共 20 種語言。去除了超鏈接、注解和其它格式化樣式。
  • Books:包含兩部分?jǐn)?shù)據(jù),來自 Gutenberg 項(xiàng)目的書籍,以及來自 The Pile 的 Books3 部分。按照書籍粒度進(jìn)行去重,刪除超過 90% 重復(fù)內(nèi)容的書籍。
  • ArXiv:作者以 Latex 格式處理 ArXiv 論文,并刪除第一節(jié)之前的所有內(nèi)容以及參考文獻(xiàn),同時(shí)刪除 .tex 文件中的注釋、用戶自己編寫的定義和宏,以提高論文的一致性。
  • Stack Exchange:作者僅保留 Stack Exchange 中 28 個(gè)最大的主題,并從文本中刪除 HTML 標(biāo)簽,按分?jǐn)?shù)(從高到低)對答案進(jìn)行排序。

3.3 RefinedWeb

RefinedWeb 是阿布扎比的 TII 基于 CommonCrawl 構(gòu)建的語料庫,其數(shù)據(jù)集經(jīng)過嚴(yán)格的過濾和去重,總共包含 5T Token,不過只開源了 600B Token 的子集。同時(shí)還發(fā)布了 Falcon-7B 和 Falcon-40B,分別基于 1.5 T Token 和 1 T Token 訓(xùn)練而來,其 80% 以上數(shù)據(jù)來自 RefinedWeb。

如下圖所示為 RefinedWeb 的構(gòu)建過程,其包含幾種主要的預(yù)處理過程:

  • URL filtering:目的是為了過濾掉欺詐、色情、暴力和賭博等網(wǎng)站。作者首先收集了一個(gè) 4.6M 的黑名單網(wǎng)站列表,然后構(gòu)建了一個(gè) URL 打分機(jī)制,以避免黑名單中的誤報(bào),比如流行的博客、醫(yī)療、法律等頁面。此外,后續(xù)的預(yù)訓(xùn)練中也要與其他優(yōu)質(zhì)語料庫混合,因此也過濾了高質(zhì)量的語料來源,比如Wikipedia和arXiv等。
  • Text extraction:提取頁面中的主要內(nèi)容,忽略目錄、頁眉、頁腳和廣告等。
  • Language identification:使用 CCNet 中的 fastText 語言分類器,可以將文檔分類為 176 種語言,作者刪除了排名靠前的語言中得分低于 0.65的文檔。此階段清理了一半左右的文檔。
  • Repetition removal:作者基于啟發(fā)式方法刪除了重復(fù)的行、段落等內(nèi)容。
  • Document-wise filtering:文檔中包含了很多機(jī)器生成的垃圾郵件等內(nèi)容,其不適于語言建模,作者通過總長度、字符和單詞比率等因素刪除了異常頁面。這個(gè)階段需要針對每種語言調(diào)整。
  • Line-wise corrections:許多文檔的行中存在無關(guān)的交錯(cuò),比如社交媒體的點(diǎn)贊、導(dǎo)航按鈕等。因此,作者設(shè)計(jì)了一個(gè)行校正器,對行進(jìn)行修正,同時(shí)如果修改超過文檔的 5%,則刪除整個(gè)文檔。
  • Fuzzy deduplication:作者在文檔級別采用了 MinHash 來刪除相似的文檔。
  • Exact deduplication:作者在序列級別采用精確字符串匹配的方式進(jìn)一步對文檔進(jìn)行去重,可以刪除特定的內(nèi)容,比如特定的免責(zé)聲明或通知等。

?

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

3.4 Baichuan 2

Baichuan 2 是百川發(fā)布的 LLM,其構(gòu)建了中英語料數(shù)據(jù)集,預(yù)訓(xùn)練語料同樣包含網(wǎng)頁、書籍、論文和代碼。大致的數(shù)據(jù)分布如下圖 Figure 1 所示(圖片來自 [2309.10305] Baichuan 2: Open Large-scale Language Models):

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

對于數(shù)據(jù)處理,作者聚焦在數(shù)據(jù)頻率和質(zhì)量上,數(shù)據(jù)頻率主要依賴聚類和去重。關(guān)于數(shù)據(jù)去重和聚類,Baichuan 2 采用基于 LSH 特征和稠密 Embedding 特征的方案。根據(jù)聚類,可以對單個(gè)文檔、段落和句子進(jìn)行重復(fù)數(shù)據(jù)刪除以及打分,然后這些分?jǐn)?shù)也可以用于預(yù)訓(xùn)練中的數(shù)據(jù)采樣。

其整個(gè)數(shù)據(jù)預(yù)處理過程及各階段清理的數(shù)據(jù)占比如下圖 Figure 2 所示,其中灰色部分為刪除的數(shù)據(jù)比例:

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

Baichuan 2 的 Tokenizer 同樣采用 BPE(來自 SentencePiece),Tokenizer 后包含 2.6T Token,如下圖 Table 2 所示為 Baichuan 2 與其他模型的詞表大小及壓縮率比較:

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

3.5 Qwen

Qwen 是阿里發(fā)布的 LLM,其預(yù)訓(xùn)練數(shù)據(jù)集包含網(wǎng)頁、百科全書、書籍以及代碼等,其數(shù)據(jù)集同樣是多語言的,主要是英文和中文。

為了保證預(yù)訓(xùn)練數(shù)據(jù)的質(zhì)量,作者同樣采用了全面的預(yù)處理:

  • 針對網(wǎng)頁數(shù)據(jù),先從 HTML 中提取文本并使用語言識別工具來確定語言。
  • 為了增加數(shù)據(jù)多樣性,同樣進(jìn)行了數(shù)據(jù)去重,包括歸一化后的精確匹配去重和使用 MinHash 和 LSH 算法的模糊重復(fù)去重。
  • 為了過濾低質(zhì)數(shù)據(jù),作者結(jié)合了基于規(guī)則和基于機(jī)器學(xué)習(xí)的方法,具體來說,使用多種模型對內(nèi)容進(jìn)行打分,包括語言模型、文本質(zhì)量評分模型以及識別潛在攻擊性和不當(dāng)內(nèi)容的模型。
  • 為了進(jìn)一步提高數(shù)據(jù)質(zhì)量,作者有選擇地對某些數(shù)據(jù)進(jìn)行上采樣,以確保模型接受更多高質(zhì)量數(shù)據(jù)。
  • 此外,有些研究表明,在預(yù)訓(xùn)練中使用多任務(wù)指令數(shù)據(jù)可以增強(qiáng)其 zero-shot 和 few-shot 數(shù)據(jù),因此作者額外添加了高質(zhì)量的指令數(shù)據(jù)。

其 Tokenizer 遵照 GPT-3.5 和 GPT-4,同樣采用 BPE 方法,其詞表大小為 152K,最終生成 3T Token。

3.6 Skywork

Skywork-13B 是昆侖萬維的天工團(tuán)隊(duì)發(fā)布的 LLM,其首先構(gòu)建了一個(gè)巨大的、高質(zhì)量的數(shù)據(jù)集 SkyPile,超過 6T Token,并開源了一個(gè) 150B Token 的子集,其原始語料為網(wǎng)頁數(shù)據(jù),地址為 Skywork/SkyPile-150B · Datasets at Hugging Face。SkyPile 的數(shù)據(jù)包含多個(gè)來源,絕大部分是公開可訪問的。

Skywork 的數(shù)據(jù)處理和其他模型類似,包含幾個(gè)部分:

  • Structural Extraction:數(shù)據(jù)集主要來源是網(wǎng)頁,因此第一階段的目標(biāo)是提取相關(guān)內(nèi)容,同時(shí)刪除導(dǎo)航欄、特定站點(diǎn)的聯(lián)系信息等無關(guān)文本元素,保留連續(xù)的中長文本段落。
  • Distribution Filtering:LLM 預(yù)訓(xùn)練往往需要包含廣泛的領(lǐng)域知識,之前的模型通常是為每個(gè)文檔或網(wǎng)頁分配類別標(biāo)簽,從而手動決定語料庫的組成。而本文中,作者摒棄了以標(biāo)簽為中心的方法,核心是對文本片段之間的語義親和性進(jìn)行測試,從而識別并刪除重復(fù)率高的文本塊。
  • Deduplication:本文中作者把 Deduplication 當(dāng)作 Distribution Filtering 的一部分。
  • Quality Filtering:作者同樣使用 CCNet Pipeline 來執(zhí)行過濾任務(wù),以刪除劣質(zhì)內(nèi)容和排除中文、英文以外的頁面。作者訓(xùn)練了一個(gè)二分類器,來預(yù)測給定網(wǎng)頁適合作為 Wikipedia 參考的可能性。這一階段的結(jié)果會被組織成不同的質(zhì)量類別,并且只保留高質(zhì)量的組。

其 Tokenizer 同樣采用 BPE,詞表分布如下圖 Table 2 所示:

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

Skywork-13B 模型的預(yù)訓(xùn)練語料包含 3.2T Token,從 SkyPile 采樣而來,其預(yù)訓(xùn)練分為兩個(gè)階段,第一階段使用 2T Token,分布如下圖 Table 1 所示,第二階段采樣剩下的 1.2T Token:

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

3.7 DeepSeek

在 CC_Cleaner:一種絲滑高效且易擴(kuò)展的數(shù)據(jù)清洗流程 中也介紹了幻方 AI LLM 的詳細(xì)數(shù)據(jù)集預(yù)處理流程,大體過程類似,這里不再具體介紹。

3.8 總結(jié)

從上可以看出,預(yù)訓(xùn)練語料預(yù)處理基本上涵蓋幾個(gè)步驟:

  • 過濾:

按 URL 過濾:按網(wǎng)站剔除欺詐、成人等網(wǎng)站頁面,同樣也可以刪除與其他數(shù)據(jù)集可能重復(fù)的頁面,比如 Wikipedia、arXiv 等。

按語言過濾(fastText 語言分類):比如只保留英文和中文。

按質(zhì)量過濾:比如使用語言模型判斷序列的困惑度,然后刪除低質(zhì)數(shù)據(jù)。

  • 去重:
  • 文檔級去重:采用 MinHash 等方式刪除高度重復(fù)的文檔。
  • 句子級去重:通過精確字符串匹配,或者基于 Embedding 的語義相似性刪除重復(fù)的語句。
  • 交叉去重:預(yù)訓(xùn)練語料可能來自不同的數(shù)據(jù)集,也需要交叉比對去重,比如從 CommonCrawl 中刪除 Wikipedia、arXiv 等數(shù)據(jù);此外,通常也需要刪除與評估集重疊的數(shù)據(jù),避免數(shù)據(jù)泄露。
  • 隱私和許可:
  • 隱私去除:為了避免隱私泄露,需要移除或者脫敏隱私數(shù)據(jù),比如個(gè)人身份信息,姓名、身份證、住址等。
  • 許可規(guī)范:在采集預(yù)訓(xùn)練語料時(shí)需要遵循相應(yīng)的許可協(xié)議,避免出現(xiàn)侵權(quán)等問題。比如代碼數(shù)據(jù)中只保留符合 Apache、BSD 和 MIT 許可的項(xiàng)目。
  • 分詞:預(yù)訓(xùn)練語料在輸入模型之前都需要經(jīng)過 Tokenizer 分詞,大部分模型都采用 BPE 算法。
  • 數(shù)據(jù)混合:預(yù)訓(xùn)練語料通常包含不同的數(shù)據(jù)集,有些質(zhì)量比較高,比如書籍、Wikipedia 等,然而其數(shù)據(jù)量可能不多,此時(shí)在真正訓(xùn)練的時(shí)候可以給予更高的采樣權(quán)重。

四、數(shù)據(jù)存儲和加載

目前很多 LLM 預(yù)訓(xùn)練會采用 NVIDIA 的 Megatron-LM 項(xiàng)目或者是 Microsoft 基于此改進(jìn)的 DeepSpeed-Megatron 項(xiàng)目,其預(yù)訓(xùn)練數(shù)據(jù)集的存儲格式和加載方式是一致的,此處我們以此為例進(jìn)行介紹。

4.1 原始 Dataset 結(jié)構(gòu)

實(shí)際的預(yù)訓(xùn)練語料在訓(xùn)練之前都會先經(jīng)過 Tokenizer 分詞,轉(zhuǎn)換為 Binary 數(shù)據(jù)集(還沒有 shuffle 和采樣)。分詞后的數(shù)據(jù)都以 Token ID 的方式存儲,數(shù)據(jù)的大小基本等價(jià)于 Token 數(shù)乘以每個(gè) Token ID 的字節(jié)數(shù)。

  • 如果詞表大小比較小,小于 65536,則可以用 Uint16 表示,存儲占磁盤大小基本等于 2*Token 數(shù)。
  • 很多中文 LLM 需要包含中文詞表,詞表數(shù)往往超過這個(gè)限制,需要使用 Uint32,導(dǎo)致數(shù)據(jù)大小變?yōu)?4*Token 數(shù)。

同時(shí),數(shù)據(jù)集通常包含不同來源,比如 CommonCrawl,Wikipedia,而且數(shù)據(jù)集有大有小,為了避免單個(gè)數(shù)據(jù)集過大,會將數(shù)據(jù)集切分為不同的 part,每個(gè) part 都相當(dāng)于一個(gè)新的子集,但是來自同一個(gè)數(shù)據(jù)集的不同 part 需要有相同的權(quán)重。此外,每個(gè) part 都有 idx 和 bin 兩個(gè)文件。如下所示為一些子數(shù)據(jù)集的示例:

  • en-CommonCrawl-part18.idx
  • en-CommonCrawl-part18.bin
  • en-Wikipedia-part0.idx
  • en-Wikipedia-part0.bin

其中 idx 文件對應(yīng)索引文件,bin 對應(yīng)實(shí)際的 Token ID,如下圖所示:

  • Index:包含 Head 和 Buffer 兩部分(實(shí)際是連續(xù)的)

Head:存儲 magic、version、dtype、len 和 doc_count

Buffer: 存儲 Bin 中 Document 的起始位置和大小

  • Bin:存儲實(shí)際的 Document,比如根據(jù)points[m]和sizes[m]即可以從 Bin 中獲得Document m。

?

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

需要說明的是,每個(gè) Document 都已經(jīng) Token 化,并且已經(jīng)添加過起始 Token <s> 和終止 Token </s>。

4.2 GPT Dataset 結(jié)構(gòu)

在 Dataset Blending 混合階段可以計(jì)算獲得每個(gè) GPT Dataset 數(shù)據(jù)需要生成多少個(gè) Sample,根據(jù) Sample 數(shù)目也可以進(jìn)一步計(jì)算得到該 Dataset 需要過幾個(gè) Epoch。

如下圖所示:

  • _num_tokens:根據(jù) Dataset 中每個(gè) Document 的 size 累積即可獲得當(dāng)前 Dataset 總的 Tokens 數(shù)目。
  • _num_epochs:根據(jù)需要采樣的 num_samples,序列長度(seq_length),每個(gè) Epoch 總的 Tokens 數(shù)目(tokens_per_epoch)即可以計(jì)算獲得數(shù)據(jù)需要過幾個(gè) Epoch。需要說明的是,倒數(shù)第二行的(total_tokens - 1)是因?yàn)?Sample 中的 Token 個(gè)數(shù)會比 seq_length 多 1 個(gè),但是多的這一個(gè)又會作為下一個(gè) Sample 的起始 Token,因此總共需要的 Tokens 數(shù)目為 num_samples * seq_length + 1。

?

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

此外,Dataset 還需要有一定的 Shuffle 操作,總的來說有兩個(gè) Shuffle:

  • Dataset 中的不同 Document 會進(jìn)行 Shuffle,對應(yīng)doc_idx。
  • Dataset 中的 Sample 也會 Shuffle,對應(yīng)shuffle_idx。

如下圖所示:

  • shuffle_idx:長度為 num_sample,存儲的是 shuffle 過的 Sample 索引,圖中的示例為 16 個(gè) Sample,也就是實(shí)際訓(xùn)練的時(shí)候先讀  Sample 5,然后讀 Sample 1,以此類推。
  • doc_idx:根據(jù)原始數(shù)據(jù)可以知道數(shù)據(jù)集中有多少個(gè) Document,然后根據(jù)該數(shù)據(jù)集需要重復(fù)的 Epoch 數(shù)目即可以得到總共需要有多少個(gè) Document。圖中的示例假設(shè) Dataset 中總共有 0, 1, 2, 3, 4, 5 這 6 個(gè) Document,對應(yīng)的 Epoch 為 4,需要說明的是,最后一個(gè) Epoch 需要特殊處理,后續(xù)再介紹。
  • sample_idx:長度為 num_sample + 1,因?yàn)槠渲写鎯Φ氖?Sample 的起始位置和終止位置,也就是該 Sample 對應(yīng)了 doc_idx 中的哪些 Document。

比如 shuffle_idx 中的綠色 4這個(gè) Sample 由 sample_idx 中第 4 個(gè)位置和第 5 個(gè)位置確定。

sample_idx 的第 4 個(gè)位置的 idx 對應(yīng)起始的 Document 索引的位置,也就是綠色箭頭指向的 doc_idx 中的 3,而 offset 為 2,則表明要從Document 3的第 2+1=3 個(gè) Token 開始。

sample_idx 的第 5 個(gè)位置的 idx 對應(yīng)終止的 Document 索引的位置,也就是綠色箭頭指向的 doc_idx 中的 0,而 offset 為 3,則表明要從Document 0的第 3 個(gè) Token 終止,但是每個(gè) Sample 中在結(jié)束位置需要有一個(gè)額外的 Token,因此實(shí)際是從第 4 個(gè) Token 終止。

  • sample:根據(jù)上述的起始 Document idx 和 offset 以及終止 Document idx 和 offset 即可以獲取到最終的 Sample,其中最后一個(gè) * Token 也會被下一個(gè) Sample 復(fù)用。因?yàn)?GPT 訓(xùn)練的目的是讓每一個(gè)位置預(yù)測下一個(gè)位置的 Token,因此input和target正好交錯(cuò) 1 個(gè) Token,這也是為什么 Sample 中的 Token 數(shù)目要比 seq_length 多 1。

?

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

如下圖所示為 GPTDataset 中獲取一個(gè) Sample 的示例:

  • 首先,從 shuffle_dix 中獲取 shuffle 過的 sample index
  • 然后,從 sample_idx 中獲取第一個(gè)和最后一個(gè)Document 的 idx 的位置和 offset
  • 最后,根據(jù) idx 的起始和終止位置可以獲得當(dāng)前 Sample 由哪些 Document 組成,當(dāng)然,其中的第一個(gè)和最后一個(gè) Document 還需要根據(jù) offset 截?cái)?。需要說明的是,有些 Document 比較長,因此有可能存在一個(gè) Sample 來自同一個(gè) Document,也就是doc_index_f 等于 doc_iindex_l。

?

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

如下所示,如果第一步不取 shuffle_idx,也就是直接打印真實(shí)的第 0,1,2 個(gè) Sample,可以看出 Sample 的長度為 4097(seq_length==4096),并且每個(gè) Sample 中的最后一個(gè)和下一個(gè) Sample 的第一個(gè)重疊,比如 1670 和 10870。

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

如下圖所示為構(gòu)建 doc_idx 的過程,可以看出其最后一個(gè) Epoch 進(jìn)行了特殊處理,這是因?yàn)楦鶕?jù) num_sample 算出來的 Epoch 很可能不是整數(shù),也就是必然有些 Document 重復(fù)多,有些重復(fù)少,但需要盡可能地保證所有 Document 的采樣概率相同。

比如,Document [0, 1, 2, 3] 重復(fù) 2.5 次:

  • 如果直接全局 shuffle 再截?cái)?,比如?[2, 0, 3, 2, 1, 3, 0, 3, 2, 0, 1, 1],截?cái)嗪鬄?[2, 0, 3, 2, 1, 3, 0, 3, 2, 0],這樣 Document 0,2,3 都出現(xiàn)了 3 次,而 Document 1 只出現(xiàn)了 1 次。
  • 如果最后一個(gè) Epoch 獨(dú)立 Shuffle,比如 [2, 0, 3, 3, 1, 0 ,2, 1,0,3,2,1],此時(shí)截?cái)嗪鬄?[2, 0, 3, 3, 1, 0 ,2, 1,0,3],可以保證采樣次數(shù)最多差 1。
  • 目前還不確定為什么不每個(gè) Epoch 都獨(dú)立 shuffle 拼接后再截?cái)唷?/li>

?

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

實(shí)際上獲得的 doc_idx 并沒有經(jīng)過截?cái)啵€是完整的 Epoch,因此在 shuffle_idx(也就是 shuffle Samples)時(shí)也需要特殊處理最后一個(gè) Epoch:

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

4.3 GPT Dataset Blending

LLM 在訓(xùn)練數(shù)據(jù)集中往往包含多個(gè)子數(shù)據(jù)集,實(shí)際訓(xùn)練的時(shí)候每個(gè)數(shù)據(jù)集會使用不同的權(quán)重。比如說有如下三個(gè)數(shù)據(jù)集(數(shù)據(jù)集在之前的步驟中已經(jīng) shuffle):

  • A:100 Samples,采樣權(quán)重 0.3
  • B:50 Samples,采樣權(quán)重 0.2
  • C:400 Samples,采樣權(quán)重 0.5


假設(shè)需要訓(xùn)練 1000 個(gè) Samples,則相當(dāng)于:

  • A:使用 300 個(gè) Samples,也就是數(shù)據(jù)過 3 輪
  • B:使用 200 個(gè) Samples,也就是數(shù)據(jù)過 4 輪
  • C:使用 500 個(gè) Samples,也就是數(shù)據(jù)過 1.25 輪

構(gòu)建混合數(shù)據(jù)集 index 的目標(biāo)是構(gòu)建訓(xùn)練需要的 1000 個(gè) Samples 的索引,需要知道:

  • Sample 來自哪個(gè) Dataset:dataset_index
  • 對應(yīng) Dataset 的第幾個(gè) Sample:dataset_sample_index

對應(yīng)計(jì)算過程如下:

  • 遍歷每個(gè) Sample 位置

根據(jù)當(dāng)前位置之前已經(jīng)采樣過的 Sample 計(jì)算對應(yīng) Dataset 的權(quán)重,比如 A 為 0.34(+0.04),B 為 0.18(-0.02),C 為 0.45(-0.05),表明已采樣的 Sample 中 Dataset C 占比與設(shè)定目標(biāo)相差更多,因此此處從 Dataset C 中采樣

C 中樣本計(jì)數(shù) +1(也就是如果最后把 dataset_sample_index 中來自 Dataset C 的數(shù)據(jù)拿出來,則按順序應(yīng)該是 [0, 1, 2, …, 498, 499])

更新 dataset_index 和 dataset_sample_index

需要說明的是,上述的 Sample 可以理解為拼接好的滿足 max_seq 的序列,來自同一個(gè) Dataset,但可能來自不同的句子。

具體代碼位于 ??https://github.com/bigscience-workshop/Megatron-DeepSpeed/blob/main/megatron/data/helpers.cpp#L36-L97??,如下所示:

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

此外,原始 Megatron-DeepSpeed 中的 dataset_index 存儲的是 uint8 類型,也就是最多只能有 256 個(gè) Dataset,但是實(shí)際上當(dāng)前 LLM 預(yù)訓(xùn)練的 Dataset 可能很多,比如有 1000 多個(gè),此時(shí)有兩種方案:

  1. 修改代碼,dataset_index 存儲改為 uint16 或 uint32。
  2. 將 Dataset 合并到 256 個(gè)以內(nèi),但是需要保證合并的 Dataset 的 Weight 相同,并且在 shuffle 前合并,不然不等價(jià)。

4.4 數(shù)據(jù)加載

如下圖所示,BlendableDataset 為實(shí)際 LLM 預(yù)訓(xùn)練使用的 Dataset,其在初始化階段完成索引構(gòu)建(可以 Cache),訓(xùn)練中直接遍歷相應(yīng)的 Sample 即可(返回?cái)?shù)據(jù)包含子數(shù)據(jù)集索引及在子數(shù)據(jù)集中的位置索引):

LLM 預(yù)訓(xùn)練語料、預(yù)處理和數(shù)據(jù)集索引、加載總結(jié)-AI.x社區(qū)

五、參考鏈接

  1. ??https://commoncrawl.org/overview??
  2. ??https://data.commoncrawl.org/crawl-data/CC-MAIN-2023-50/index.html??
  3. ??https://arxiv.org/abs/2303.18223??
  4. ??https://www.high-flyer.cn/en/blog/cc_cleaner/??
  5. ??https://arxiv.org/abs/2309.10305??
  6. ??https://huggingface.co/datasets/Skywork/SkyPile-150B??
  7. ??http://arxiv.org/abs/2310.19341??
  8. ??https://github.com/NVIDIA/Megatron-LM??
  9. ??https://github.com/microsoft/Megatron-DeepSpeed??
  10. ??https://lifearchitect.ai/whats-in-my-ai/??

本文轉(zhuǎn)載自??AI閑談??,作者: AI閑談 ????

1
收藏 1
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦