在Megatron-Deepspeed項目中如何下載和預處理Wikipedia數據集

更詳細的查看 https://github.com/marsggbo/Megatron-DeepSpeed/blob/main/tutorials/gpt2_wikipedia.md

  1. 下載Wikipedia壓縮數據集(enwiki-latest-pages-articles.xml.bz2

  2. 再使用wikiextractor工具將數據集解壓縮

pip install wikiextractor
python -m wikiextractor.WikiExtractor --json enwiki-latest-pages-articles.xml.bz2

解壓縮後會得到一個文件夾text,結構如下:

text
├── AA
  ├── wiki_00
  ├── wiki__01
  ├── ...
├── AB
├── AC
├── AD
├── AE
├── ...
├── GD
└── GE

文件夾包含多個子文件夾,每個子文件夾包含多個json格式的數據集,即wiki_00其實是json格式的文件

  1. 對解壓後的數據集做預處理

我們在訓練GPT的時候,解壓後的數據集還不能直接拿來用,我們還需要用Megatron-Deepspeed提供的tools/preprocess_data.pytext目錄下數據集做預處理,最終會得到兩個二進制文件,後綴分別是binidx

不過tools/preprocess_data.py只能對單個的json文件做處理,而第二步中我們有幾十萬個json文件,這個該怎麼辦呢?一種處理辦法就是把第三步中的所有json文件合併到一個json文件中去,最後再對後並後的文件做預處理就可以了。在於處理之前,你需要先運行下面大命令下載GPT相關的文件,這主要是用來預處理的

wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-vocab.json
wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-merges.txt

下載好後,執行下面的代碼即可

#!/bin/bash  
  
# 設置ROOT路徑  
ROOT="/data/personal/nus-hx/Wikipedia/text"  

# 檢查是否存在 wiki_all.json 文件,如果存在則刪除  
if [ -f "$ROOT/wiki_all.json" ]; then  
    rm "$ROOT/wiki_all.json"  
fi  
  
# 創建一個空的 wiki_all.json 文件  
touch "$ROOT/wiki_all.json"
  
# 遍歷ROOT路徑下所有的文件  
find $ROOT -type f -name "*" -print0 | while IFS= read -r -d $'\0' file; do  
    # 將所有文件內容追加到wiki_all.json文件中  
    cat "$file" >> "$ROOT/wiki_all.json"  
done  

cd /path/to/Megatron-Deepspeed
python tools/preprocess_data.py \
--input "$ROOT/wiki_all.json" \
--output-prefix my-gpt2 \
--dataset-impl mmap \
--tokenizer-type GPT2BPETokenizer   \
--append-eod  \
--vocab-file gpt2-vocab.json \
--merge-file gpt2-merges.txt  \
--workers 16 \
--partitions 16

參考:https://github.com/NVIDIA/Megatron-LM/issues/117

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章