行 MLPerf BERT 訓(xùn)練基準(zhǔn):數(shù)據(jù)準(zhǔn)備、環(huán)境配置與完整執(zhí)行指南)
tinygrad 在 tinybox 上運(yùn)行 MLPerf BERT 訓(xùn)練基準(zhǔn)數(shù)據(jù)準(zhǔn)備、環(huán)境配置與完整執(zhí)行指南【免費(fèi)下載鏈接】tinygradYou like pytorch? You like micrograd? You love tinygrad! ??項(xiàng)目地址: https://gitcode.com/GitHub_Trending/tiny/tinygrad本篇指南圍繞 examples/mlperf/training_submission_v4.1/tinycorp/benchmarks/bert/implementations/tinybox_green/README.md 展開講解如何用 tinygrad 在 tinybox green6×RTX 4090與 tinybox red6×RX 7900 XTX兩臺(tái)硬件平臺(tái)上完成 MLPerf Training v4.1 BERT掩碼語言建模預(yù)訓(xùn)練基準(zhǔn)的復(fù)現(xiàn)從環(huán)境安裝、維基百科語料下載與預(yù)處理到一鍵運(yùn)行run_and_time.sh并產(chǎn)出 MLPerf 合規(guī)日志。讀完本文你將掌握該提交的完整執(zhí)行鏈路以及背后model_train.py中 BERT 訓(xùn)練循環(huán)、LAMB 優(yōu)化器、Beam Search 編譯參數(shù)與日志系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié)。1. 基準(zhǔn)問題與提交概況該 README 描述的 Problem 是使用 BERTBidirectional Encoder Representations from Transformers進(jìn)行 NLP 預(yù)訓(xùn)練屬于 MLPerf Training v4.1 的 closed division、available on-premise 提交提交方為 tinycorp。目錄examples/mlperf/training_submission_v4.1/tinycorp/下包含兩個(gè)實(shí)現(xiàn)tinybox_green/NVIDIA 平臺(tái)的 BERT 實(shí)現(xiàn)另有 resnet 實(shí)現(xiàn)。tinybox_red/AMD 平臺(tái)的 BERT 實(shí)現(xiàn)額外帶一個(gè)setup.sh硬件調(diào)優(yōu)腳本。對應(yīng)的硬件規(guī)格記錄在 systems/tinybox_green.json 與 systems/tinybox_red.json 中兩份配置高度對稱配置項(xiàng)tinybox greentinybox redCPUAMD EPYC 7532 32-Core Processor1 路64 vCPU同左內(nèi)存128GB8×16GB DDR4同左存儲(chǔ)4TB RAID 陣列 1TB 啟動(dòng)盤NVMe SSD同左加速卡6× NVIDIA GeForce RTX 409024GB GDDR6X6× AMD Radeon RX 7900 XTX24GB GDDR6卡間/主機(jī)互連PCIe 4.0 x16同左操作系統(tǒng)Ubuntu 22.04.4同左軟件棧Python 3.10.12CUDA 12.4Python 3.10.12ROCm 6.1.3tinygrad 版本commitb5546912e24e0a864b35924da4efa5d71cfe368b同左兩平臺(tái)均為單節(jié)點(diǎn) 6 卡、24GB 顯存/卡因此訓(xùn)練超參GPUS6、BS66、EVAL_BS6完全一致僅底層驅(qū)動(dòng)與 Beam Search 配置有差異見下文。2. 環(huán)境要求與軟件安裝README 明確要求從 master 分支安裝 tinygrad 與 mlperf-logginggit clone https://github.com/tinygrad/tinygrad.git python3 -m pip install -e .[mlperf].[mlperf]是 pyproject.toml 中聲明的可選依賴組用于拉取 mlperf-logging 等基準(zhǔn)所需依賴。隨后安裝兩個(gè)額外包pip install tqdm tensorflowtqdm訓(xùn)練進(jìn)度條訓(xùn)練腳本直接from tqdm import tqdm見 examples/mlperf/model_train.py。tensorflowBERT 預(yù)訓(xùn)練數(shù)據(jù)預(yù)處理階段生成 TFRecord 數(shù)據(jù)所需。2.1 tinybox_greenP2P 驅(qū)動(dòng)README 要求按照 tinygrad 的 open-gpu-kernel-modules550.54.15-p2p 分支說明安裝 P2P 驅(qū)動(dòng)。該驅(qū)動(dòng)是生產(chǎn)環(huán)境 tinybox green 的默認(rèn)配置This is the default on production tinybox green。2.2 tinybox_red自定義 amdgpu 驅(qū)動(dòng)tinybox red 需要禁用 cwsr并發(fā) wave 調(diào)度相關(guān)特性并增大 MESMicro Engine Scheduler超時(shí)安裝針對 Ubuntu 22.04 定制的 amdgpu 驅(qū)動(dòng)v6.1.3。這也是 setup.sh 存在的背景。3. 數(shù)據(jù)準(zhǔn)備下載與校驗(yàn)BERT 預(yù)訓(xùn)練使用維基百科語料。下載腳本位于 extra/datasets/wikipedia_download.pyBASEDIR/raid/datasets/wiki WIKI_TRAIN1 VERIFY_CHECKSUM1 python3 extra/datasets/wikipedia_download.pyBASEDIR數(shù)據(jù)存放根目錄訓(xùn)練腳本默認(rèn)BASEDIR/raid/datasets/wiki與此保持一致。WIKI_TRAIN1下載訓(xùn)練用維基轉(zhuǎn)儲(chǔ)。VERIFY_CHECKSUM1下載完成后校驗(yàn)校驗(yàn)和確保數(shù)據(jù)完整。4. 數(shù)據(jù)預(yù)處理預(yù)處理腳本為 extra/datasets/wikipedia.py它基于 MLCommons 官方訓(xùn)練倉庫中 BERT 的create_pretraining_data.py修改而來用于把下載的維基文本切分成帶掩碼的預(yù)訓(xùn)練樣本。腳本頭部注釋列出了可調(diào)環(huán)境變量MAX_SEQ_LENGTH最大序列長度訓(xùn)練時(shí)固定為 512。MAX_PREDICTIONS_PER_SEQ每條序列最多掩碼預(yù)測數(shù)訓(xùn)練時(shí)固定為 76。RANDOM_SEED隨機(jī)種子。DUPE_FACTOR輸入數(shù)據(jù)以不同掩碼重復(fù)的次數(shù)。MASKED_LM_PROBtoken 掩碼概率。SHORT_SEQ_PROB選取短于MAX_SEQ_LENGTH序列的概率。4.1 訓(xùn)練數(shù)據(jù)BASEDIR/raid/datasets/wiki NUM_WORKERS16 python3 extra/datasets/wikipedia.py pre-train all注意 README 的提示預(yù)處理線程數(shù)受可用內(nèi)存限制128GB 內(nèi)存下最多建議 16 線程N(yùn)UM_WORKERS16。如果只想生成某個(gè)特定 topic編號(hào) 0~499BASEDIR/raid/datasets/wiki python3 extra/datasets/wikipedia.py pre-train 424.2 驗(yàn)證數(shù)據(jù)BASEDIR/raid/datasets/wiki python3 extra/datasets/wikipedia.py pre-eval5. 運(yùn)行基準(zhǔn)5.1 tinybox_green直接運(yùn)行examples/mlperf/training_submission_v4.1/tinycorp/benchmarks/bert/implementations/tinybox_green/run_and_time.sh5.2 tinybox_red先做一次性硬件設(shè)置再運(yùn)行examples/mlperf/training_submission_v4.1/tinycorp/benchmarks/bert/implementations/tinybox_red/setup.sh examples/mlperf/training_submission_v4.1/tinycorp/benchmarks/bert/implementations/tinybox_red/run_and_time.shsetup.sh通過 rocm-smi 將 GPU 調(diào)整到基準(zhǔn)所需狀態(tài)rocm-smi --setprofile compute rocm-smi --setmclk 3 rocm-smi --setperflevel high其中--setprofile compute切換到計(jì)算 profile--setmclk 3鎖定顯存時(shí)鐘檔位--setperflevel high將性能等級(jí)設(shè)為 high。腳本中還注釋了一個(gè)可選的功耗上限操作將 6 張卡統(tǒng)一限制到 350W# echo 350000000 | sudo tee /sys/class/drm/card{1..6}/device/hwmon/hwmon*/power1_cap6. run_and_time.sh 逐段解析兩份run_and_time.sh結(jié)構(gòu)相同僅平臺(tái)名與 Beam 參數(shù)不同以 green 版 run_and_time.sh 為例export PYTHONPATH. export MODELbert export SUBMISSION_PLATFORMtinybox_green export DEFAULT_FLOATHALF GPUS6 BS66 EVAL_BS6 export BEAM4 BEAM_UOPS_MAX2000 BEAM_UPCAST_MAX64 BEAM_LOCAL_MAX512 export IGNORE_JIT_FIRST_BEAM1 export BASEDIR/raid/datasets/wiki # pip install -e .[mlperf] export LOGMLPERF1 export SEED$RANDOM DATETIME$(date %m%d%H%M) LOGFILEbert_green_${DATETIME}_${SEED}.log # init BENCHMARK10 INITMLPERF1 python3 examples/mlperf/model_train.py | tee $LOGFILE # run PARALLEL0 RUNMLPERF1 python3 examples/mlperf/model_train.py | tee -a $LOGFILE關(guān)鍵環(huán)境變量說明變量greenred作用MODELbertbert選擇 model_train.py 中的train_bert()入口SUBMISSION_PLATFORMtinybox_greentinybox_red寫入 mllog 的SUBMISSION_PLATFORM字段DEFAULT_FLOATHALFHALF默認(rèn)浮點(diǎn)精度 fp16配合 loss scaling 訓(xùn)練GPUS66使用 6 張卡腳本據(jù)此構(gòu)造CUDA:0..5/AMD:0..5BS/EVAL_BS66 / 666 / 6訓(xùn)練/驗(yàn)證 batch size單卡 BS11、EVAL_BS1 的 6 卡總和BEAM43Beam Search 編譯搜索寬度BEAM_UOPS_MAX/BEAM_UPCAST_MAX/BEAM_LOCAL_MAX2000 / 64 / 512僅 green限制 Beam 搜索的 UOps 數(shù)、upcast 數(shù)與局部 buffer 大小用于控制編譯開銷IGNORE_JIT_FIRST_BEAM11JIT 首次捕獲時(shí)忽略 Beam 搜索避免首步編譯失真BASEDIR/raid/datasets/wiki同左預(yù)處理后數(shù)據(jù)的根目錄LOGMLPERF11啟用 mlperf-loggingmllog合規(guī)日志SEED$RANDOM$RANDOM每次運(yùn)行隨機(jī)種子決定初始化與數(shù)據(jù)順序腳本分兩階段執(zhí)行輸出統(tǒng)一追加到bert_{green|red}_{MMDDHHMM}_{SEED}.log初始化階段BENCHMARK10 INITMLPERF1—— 只跑 10 步 fake dataget_fake_data_bert生成隨機(jī)輸入來清空磁盤緩存diskcache_clear()、預(yù)熱并觸發(fā) Beam 編譯同時(shí)把INIT_START/INIT_STOP等初始化事件寫入 mllog。正式運(yùn)行階段PARALLEL0 RUNMLPERF1—— 加載真實(shí)維基數(shù)據(jù)訓(xùn)練并在達(dá)到目標(biāo)精度后記錄RUN_STOP。7. 訓(xùn)練腳本中的 BERT 實(shí)現(xiàn)細(xì)節(jié)train_bert()examples/mlperf/model_train.py 中MODELbert時(shí)執(zhí)行是本次基準(zhǔn)的核心以下參數(shù)均可通過環(huán)境變量覆蓋超參數(shù)默認(rèn)值來自源碼BS默認(rèn)11 * len(GPUS)fp16/bf16 時(shí)即 6 卡共 66EVAL_BS默認(rèn)1 * len(GPUS)。全局 batch sizeGBS BS * grad_acc其中GRADIENT_ACC_STEPS默認(rèn) 1。學(xué)習(xí)率OPT_BASE_LEARNING_RATE 0.000175 * sqrt(GBS/96)隨 batch 縮放。TRAIN_STEPS 3600000 // GBSNUM_WARMUP_STEPS 1POLY_POWER 1.0多項(xiàng)式衰減。優(yōu)化器LAMBLAMBadamFalseweight_decay0.01beta10.9beta20.999epsilon1e-6bias 與 LayerNorm 參數(shù)進(jìn)入獨(dú)立的LAMB組weight_decay0兩組通過OptimizerGroup聯(lián)合調(diào)度LR 由PolynomialDecayWithWarmup管理。損失縮放fp16 下LOSS_SCALER 2**11backward 前乘、更新前除回并實(shí)現(xiàn)按 global norm 的梯度裁剪global_norm 1.0時(shí)歸一化。評(píng)估MAX_EVAL_STEPS保證EVAL_BS * MAX_EVAL_STEPS 10000目標(biāo)為TARGET 0.72的 masked LM accuracy。模型配置MAX_SEQUENCE_LENGTH512、max_predictions_per_seq76寫入 mllog。訓(xùn)練/評(píng)估步驟使用TinyJitContext(TRAINING1/0)編譯TinyJit Context(TRAINING1) def train_step_bert(input_ids, segment_ids, attention_mask, masked_positions, masked_lm_ids, masked_lm_weights, next_sentence_labels): for t in [input_ids, segment_ids, attention_mask, masked_positions, masked_lm_ids, masked_lm_weights, next_sentence_labels]: if len(GPUS) 1: t.shard_(GPUS, axis0) else: t.to_(GPUS[0]) ...多卡時(shí)輸入張量按 batch 維度shard_(GPUS, axis0)切分到 6 卡權(quán)重通過p.to_(GPUS)復(fù)制到全部設(shè)備數(shù)據(jù)并行。評(píng)估步驟eval_step_bert同樣把結(jié)果聚合回 CPU 后Tensor.realize。數(shù)據(jù)流RUNMLPERF1時(shí)用batch_load_train_bert(BS, seedseed)/batch_load_val_bert(EVAL_BS)examples/mlperf/dataloader.py讀取預(yù)處理后的數(shù)據(jù)INITMLPERF階段則用get_fake_data_bert重復(fù)產(chǎn)出假數(shù)據(jù)以完成編譯預(yù)熱。檢查點(diǎn)與收斂每SAVE_CKPT_FREQ默認(rèn) 1000步保存.safe檢查點(diǎn)并只保留最近KEEP_CKPT_AMOUNT默認(rèn) 5份當(dāng) masked LM accuracy 首次達(dá)到 0.72 時(shí)打印收斂耗時(shí)、寫入RUN_STOP(statusSUCCESS)并保存bert-large.safe后提前終止。8. 日志與合規(guī)輸出LOGMLPERF1時(shí)腳本使用mlperf_logging.mllog輸出合規(guī)事件包括SUBMISSION_ORGtinycorp、SUBMISSION_PLATFORM、SUBMISSION_DIVISIONCLOSED、SUBMISSION_STATUSONPREM以及 GLOBAL_BATCH_SIZE、OPT_NAMELAMB、LARS/LAMB 相關(guān)超參、EVAL_ACCURACY、RUN_STOP 等標(biāo)準(zhǔn)鍵結(jié)果寫入result_bert_{seed}.txt。同時(shí)終端輸出被tee到bert_{green|red}_{MMDDHHMM}_{SEED}.log每一步會(huì)打印運(yùn)行時(shí)間、Python 開銷、取數(shù)開銷、顯存占用與 GFLOPS 等診斷信息便于對照BENCHMARK10階段的預(yù)計(jì)總訓(xùn)練時(shí)長評(píng)估進(jìn)度。9. 快速排查要點(diǎn)若預(yù)處理階段內(nèi)存不足先降低NUM_WORKERS128GB 上限為 16。若INITMLPERF階段編譯過慢可調(diào)小BEAMred 版即從 4 降到 3或調(diào)低BEAM_UOPS_MAX等上限IGNORE_JIT_FIRST_BEAM1可避免首次 JIT 捕獲被 Beam 搜索拖慢。若評(píng)估時(shí)報(bào)EVAL_BS * MAX_EVAL_STEPS斷言失敗說明驗(yàn)證集覆蓋不足需增大MAX_EVAL_STEPS。tinybox red 若出現(xiàn) GPU 掛起/超時(shí)類問題需重新確認(rèn)自定義 amdgpu 驅(qū)動(dòng)的 cwsr 禁用與 MES 超時(shí)配置并重跑setup.sh。綜上這套 v4.1 BERT 提交把數(shù)據(jù)→編譯→訓(xùn)練→合規(guī)日志整條 MLPerf 流水線收斂到兩個(gè) shell 腳本與一個(gè) model_train.py 入口中是研究 tinygrad 在多卡異構(gòu)平臺(tái)上復(fù)現(xiàn)行業(yè)基準(zhǔn)的完整范本。【免費(fèi)下載鏈接】tinygradYou like pytorch? You like micrograd? You love tinygrad! ??項(xiàng)目地址: https://gitcode.com/GitHub_Trending/tiny/tinygrad創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考