更詳細的查看 https://github.com/marsggbo/Megatron-DeepSpeed/blob/main/tutorials/gpt2_wikipedia.md
-
下載Wikipedia壓縮數據集(enwiki-latest-pages-articles.xml.bz2)
-
再使用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格式的文件
- 對解壓後的數據集做預處理
我們在訓練GPT的時候,解壓後的數據集還不能直接拿來用,我們還需要用Megatron-Deepspeed提供的tools/preprocess_data.py
對text
目錄下數據集做預處理,最終會得到兩個二進制文件,後綴分別是bin
和idx
。
不過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