?
預備知識
運行 NVIDIA 基準測試時,您的系統需要具備以下內容:
- 容器準備、數據集/ 檢查點下載和預處理 Docker Hugging Face 訪問令牌 (用于數據集/ 檢查點下載) Llama 3.1 至少有 2.5 TB 的磁盤空間,LoRA 微調需要 300 GB
- 硬件要求 Llama 2 70B LoRA:NVIDIA DGX B200 或 NVIDIA GB200 NVL72 系統,或多個通過 InfiniBand 連接的 GB200 NVL72 系統,可實現超過 72 個 GPU 的擴展。NVIDIA 針對此基準測試提交的最小數據是 8 個 GPU。 Llama 3.1 405B:至少四個 GB200 NVL72 系統通過 InfiniBand 連接。NVIDIA 針對此基準測試提交的最小數據是 256 個 GPU。
集群設置
運行 NVIDIA MLPerf 訓練基準測試需要:
- 基于 Slurm、Pyxis 和 Enroot 的環境
- 使用 NVIDIA NVLink 和 InfiniBand 進行網絡建設
- 在 RAID0 配置中快速設置本地存儲,以更大限度地減少數據加載瓶頸
NVIDIA 提交集群不支持使用 Docker 運行工作負載。這些集群由 NVIDIA Base Command Manager (BCM) 管理。按照官方說明正確設置 BCM SLURM 集群。
正確設置后,您應能登錄頭節點并訪問 SLURM 命令 ( sinFO、squeue、srun、sbatch) 以在計算節點上啟動作業。
運行基準測試
開始對任何模型進行基準測試所需的步驟包括:
- Build a Docker container.
- 使用 Docker 在任何計算機上運行容器,以下載和處理數據集和檢查點。此步驟可以在任何機器上完成,無論是否在集群中,通常不需要配備 GPU 的系統。確保計算節點可以訪問數據。數據最好存儲在節點的本地;或者,可以通過快速 (并行) 文件系統進行訪問。
- 啟動訓練并解析日志。
Llama 2 70B LoRA
要運行 Llama 2 70B LoRA 的基準測試,請按照本節中的說明操作。
創建容器
- cd NVIDIA/ benchmarks/ llama2_70b_lora/ implementations/ tyche_ngpu72_ngc25.04_nemo
- Docker build -t mlperf-nvidia:llama2_70b_lora-pyt。如果您有要推送鏡像的注冊表,請將注冊表名稱添加到鏡像名稱中。
下載數據集和模型
此基準測試使用了政府報告數據集和 Hugging Face 檢查點。NVIDIA NeMo 需要對數據集和檢查點進行預處理。您需要 Hugging Face 令牌才能下載檢查點。
如需下載并預處理,請執行以下操作:
# create a directory where the data will be stored mkdir < /path/to/dataset > # start the docker container docker run -it -- rm --gpus all --network=host --ipc=host --volume < /path/to/dataset >: /data mlperf-nvidia:llama2_70b_lora-pyt # now you should be inside the container in the /workspace/ft-llm directory. run the download scripts python scripts /download_dataset .py --data_dir /data/gov_report # download dataset python scripts /download_model .py --model_dir /data/model # download preprocessed model checkpoint in NeMo format used for initialization; could take up to 30 minutes |
如果模型下載失敗,您可能需要先導出 HF_TOKEN
,然后再調用 download_model.py
腳本:
export HF_TOKEN=<your /huggingface/token > |
轉換后,您應在/data 目錄下看到以下文件:
/data ├── gov_report │ ├── train.npy │ └── validation.npy └── model ├── context │ ├── io.json │ ├── model.yaml │ └── nemo_tokenizer └── weights ├── common.pt ├── metadata.json ├── module.decoder.final_layernorm._extra_state ├── module.decoder.final_layernorm.weight ├── module.decoder.layers.mlp.linear_fc1._extra_state ├── module.decoder.layers.mlp.linear_fc1.layer_norm_weight ├── module.decoder.layers.mlp.linear_fc1.weight ├── module.decoder.layers.mlp.linear_fc2._extra_state ├── module.decoder.layers.mlp.linear_fc2.weight ├── module.decoder.layers.self_attention.core_attention._extra_state ├── module.decoder.layers.self_attention.linear_proj._extra_state ├── module.decoder.layers.self_attention.linear_proj.weight ├── module.decoder.layers.self_attention.linear_qkv._extra_state ├── module.decoder.layers.self_attention.linear_qkv.layer_norm_weight ├── module.decoder.layers.self_attention.linear_qkv.weight ├── module.embedding.word_embeddings.weight └── module.output_layer.weight |
此時,您可以退出容器。
啟動基準測試
NVIDIA 使用 SLURM 在計算節點上啟動基準測試。兩個文件用于促進作業啟動過程:
- 配置文件 (config_*.sh) ,用于描述模型的超參數,包括節點數量、墻面時間等。通過將每個提交的內容整理成一個文件,可以輕松配置工作負載,以便使用最佳超參數以所需規模運行。
- 一個固定的 run.sub 文件,其中包含用于啟動訓練的 srun 命令,并將配置中的所有超參數傳遞到 Python 腳本。
如要查看典型的配置文件 (本例中為 config_GB200_18x4x1xtp1pp1cp8.sh
) ,其名稱將描述系統的大小和類型:
- GB200:設計為在 GB200 計算機上運行
- 18 4:可解碼為 NNODES x NGPUS 的系統設置 節點數量:GB200 節點數量 NGPUS:每個節點的 GPU 數量
- x1xtp1pp1cp8 是并行化模式 x1 表示 GradientAccumulation,此處等于 1,表示無 GA TP1:無 TensorParallel PP1:無 PipelineParallel CP8:8 路 ContextParallel
這意味著將使用 72-GPU 配置,在單個 GB200 NVL72 機架上運行。基準測試將運行 GA1TP1PP1CP8:全局批量大小 (GBS) = 9。
接下來,仔細查看配置文件的內容。第一部分來自 config_common.sh
,其中包含所有配置使用的超參數和優化標志。某些情況下會覆蓋 config_common.sh
中的標志。設置最大步長、學習率、梯度累積 (MINIBS) 和上述并行化模式。
#!/bin/bash source $( dirname ${BASH_SOURCE[0]}) /config_common .sh # hyperparameters export MAX_STEPS=800 export LR=0.0005 export MINIBS=1 export TP=1 export SP=0 export CP=8 |
下一節將添加系統特定的優化,并在需要時覆蓋通用標志。
export LAYER_CUDA_GRAPH=0 export MCORE_CUDA_GRAPH=1 |
接下來是要傳遞給 SLURM 的系統級設置。
# system parameters export VBOOST_VALUE=0 export DGXNNODES=18 export DGXNGPU=4 export WALLTIME_RUNANDTIME=10 export WALLTIME=$((5 + ${NEXP:-1} * ($WALLTIME_RUNANDTIME + 5))) |
正在針對特定系統大小調整配置,包括優化標志 (影響性能) 和超參數 (影響收) 。可以修改給定配置以在不同大小的系統上運行,但這需要仔細考慮,并且不能保證性能與原始配置一樣出色。
要開始實際訓練,您需要告知腳本數據集/ 模型的位置、日志文件的存儲位置、要使用的容器、源配置文件,然后運行 sbatch
命令:
export DATADIR= "</path/to/dataset>/gov_report" # set your </path/to/dataset> export MODEL= "</path/to/dataset>/model" # set your </path/to/dataset> export LOGDIR= "</path/to/output_logdir>" # set the place where the output logs will be saved export CONT=mlperf-nvidia:llama2_70b_lora-pyt source config_<system>.sh # select config and source it sbatch -N $DGXNNODES -t $WALLTIME run.sub # you may be required to set --account and --partition here |
解析日志
日志文件將包含初始化和其他信息行的大量輸出。MLPerf 相關行以 MLPerf logger 前綴 :::MLLOG
開頭。有一些有趣的標記,如下所示。
Initialization starts:
:::MLLOG {"namespace": "", "time_ms": 1745066769306, "event_type": "INTERVAL_START", "key": "init_start", "value": null, "metadata": {"file": "/workspace/ft-llm/train.py", "lineno": 327}} |
在這里,您可以看到 Python 腳本已啟動。下面,您可以看到使用配置文件選擇的超參數以及默認 (不可變) 參數。
初始化完成,模型預熱后,打印出 init_stop
和 tg_ 16 標記:
:::MLLOG {"namespace": "", "time_ms": 1745066917960, "event_type": "INTERVAL_END", "key": "init_stop", "value": null, "metadata": {"file": "/usr/local/lib/python3.12/dist-packages/mlperf_common/callbacks/logging.py", "lineno": 83}} :::MLLOG {"namespace": "", "time_ms": 1745066917961, "event_type": "INTERVAL_START", "key": "run_start", "value": null, "metadata": {"file": "/usr/local/lib/python3.12/dist-packages/mlperf_common/callbacks/logging.py", "lineno": 83}} |
run_start
行表示計時時鐘的開始。以下行顯示了訓練的進度,包括評估。您可以看到,評估損失正在減少,由 eval_accuracy
標記標記。
當評估精度 (現實中的評估損失) 降至值 0.925 以下時,訓練停止并打印 run_stop
標記:
:::MLLOG {"namespace": "", "time_ms": 1745067009412, "event_type": "POINT_IN_TIME", "key": "eval_accuracy", "value": 0.92474365234375, "metadata": {"file": "/usr/local/lib/python3.12/dist-packages/mlperf_common/callbacks/logging.py", "lineno": 303, "samples_count": 3024}} … :::MLLOG {"namespace": "", "time_ms": 1745067009420, "event_type": "INTERVAL_END", "key": "run_stop", "value": null, "metadata": {"file": "/usr/local/lib/python3.12/dist-packages/mlperf_common/callbacks/logging.py", "lineno": 106, "samples_count": 3024, "status": "success"}} |
如果基準測試收失敗,run_stop 狀態將顯示為`aborted`。MLPerf 分數是 run_stop
和 tg_ 23 的時間之間的差值。在本例中:
分數【毫秒】= (1745067009420 – 1745066917961) 91459 分數【分鐘】= 91459/ 60000 = 1.524
請記住,由于收是非確定性的,因此必須從多次運行中推導出最終分數,因為要收的樣本數量可能會有所不同。在這里,基準測試收于 3072 個樣本,而平均而言,它應該收于大約 3100-3200 個樣本。
Llama 3.1 405B
要運行 Llama 3.1 405B 的基準測試,請按照本節中的說明操作。
創建容器
- cd NVIDIA/ benchmarks/ llama31_405b/ implementations/ tyche_ngpu512_ngc25.04_nemo
- docker build -t mlperf-nvidia:large_language_model-pyt。如果您有想要推送鏡像的注冊表,請隨時將注冊表名稱添加到鏡像名稱中。
下載數據集和模型
有關如何下載數據集和分詞器的說明,請參閱 Llama 3.1 405B 參考自述文件。
環境變量 PREPROCESSED_PATH
指向預處理的數據集。下載的文件應以 .idx 和 .bin 結尾。
c4-train.en_<number>_text_document where number belongs to 0~7. c4-validation-91205-samples |
環境變量 TOKENIZER_PATH
指向此基準測試中使用的分詞器。下載的文件包括:
special_tokens_map.json tokenizer.json tokenizer.model tokenizer.model.v1 tokenizer_config.json |
您可以通過運行清理腳本來清理不必要的文件:
bash scripts /cleanup .sh |
最終的 PREPROCESSED_PATH
目錄應包含:
c4-train.en_6_text_document.bin c4-train.en_6_text_document.idx c4-train.en_7_text_document.bin c4-train.en_7_text_document.idx c4-validation-91205-samples.en_text_document.bin c4-validation-91205-samples.en_text_document.idx |
檢查點
在基準測試區域,通過 Meta 官方 Hugging Face 檢查點恢復訓練。請參考參考 README 中的說明下載 BF16 模型檢查點。請注意,在繼續之前,請確保您當前的工作目錄能夠容納 > 1.5 TB 的數據。
假設您在給定目錄下運行下載命令,其位置存儲在 LOAD_CHECKPOINTS_PATH
環境變量下。下載檢查點后,您應能找到一個 405B 文件夾,其中包含當前目錄下的上下文和權重子文件夾:
<LOAD_CHECKPOINTS_PATH> └── 405b ├── context │ ├── nemo_tokenizer │ │ ├── special_tokens_map.json │ │ ├── tokenizer_config.json │ │ └── tokenizer.json │ ├── io.json │ └── model.yaml └── weights ├── __0_0.distcp ├── __0_1.distcp ├── .metadata ├── common.pt └── metadata.json |
啟動基準測試
NVIDIA 使用 SLURM 在計算節點上啟動基準測試。為簡化作業啟動過程,與 Llama 2 70B LORA 類似,使用了兩個文件:
- 配置文件 (config_*.sh) ,用于描述模型的超參數,包括節點數量、墻面時間等。通過選擇合適的文件,您可以輕松配置工作負載,使其使用最佳超參數以所需規模運行。
- 一個固定的 run.sub 文件,其中包含用于啟動訓練的 srun 命令,并將配置中的所有超參數傳遞到 Python 腳本。
要查看典型的配置文件 (在本例中為 config_GB200_128x4x112xtp4pp8cp2_cg_dplast.sh) ,其名稱描述了系統的大小和類型:
- GB200:設計為在 GB200 計算機上運行
- 128 4:可解碼為 NNODES x NGPUS 的系統設置 節點數量:GB200 節點數量 NGPUS:每個節點的 GPU 數量
- x112xtp4pp8cp2 是并行化模式: x112 表示 GradientAccumulation,此處等于 112 TP4:4 路 TensorParallel PP8:8 路 PipelineParallel CP2:2 路 ContextParallel
這意味著將在 8 個 GB200 NVL72 機架上運行 512-GPU 配置,每個機架使用 64 個 GPU。基準測試將運行 GA112TP4PP8CP2:全局批量大小 (GBS) = 896。
為了更深入地了解配置文件的內容,第一部分源配置包含以下各項使用的超參數和優化標志:所有配置、使用 Blackwell GPU 的配置以及使用 CUDA 圖形的配置。在某些情況下,config_common.sh
中的標志會被覆蓋。稍后,設置梯度累積 (MINIBS) 、并行化模式、微批量大小、模型大小 (凍結) 和最大步長。
source $( dirname ${BASH_SOURCE[0]}) /config_common .sh source $( dirname ${BASH_SOURCE[0]}) /config_common_blackwell .sh source $( dirname ${BASH_SOURCE[0]}) /config_common_cg .sh export MINIBS=112 export TENSOR_MODEL_PARALLEL=4 export PIPELINE_MODEL_PARALLEL=8 export INTERLEAVED_PIPELINE=8 export CONTEXT_PARALLEL=2 export MICRO_BATCH_SIZE=1 export MODEL_SIZE= "405b" export MAX_STEPS=450 |
接下來,設置性能優化標志:
export FP8_PARAM_GATHER=True export TP_COMM_OVERLAP=True export ASYM_PP_EMBED=True export ASYM_PP_LOSS=True export TP_PP_DP_MAPPING=True # Binding export BINDCMD="bindpcie --cpu=node" |
接下來是要傳遞給 SLURM 的系統級設置:
export DGXNNODES=128 export DGXNGPU=4 export DGXSYSTEM=$( basename $(readlink -f ${BASH_SOURCE[0]}) | sed 's/^config_//' | sed 's/\.sh$//' ) export WALLTIME_RUNANDTIME=180 export WALLTIME=$((5 + ${NEXP:-1} * ($WALLTIME_RUNANDTIME + 5))) |
要開始實際訓練,您需要告知腳本數據集/ 檢查點的位置、日志文件的存儲位置、要使用的容器、源配置文件,然后運行 sbatch
命令:
export PREPROC_DATA= "/path/to/your/preprocessed_c4" export TOKENIZER= "/path/to/your/tokenizer.model" export LOAD_CHECKPOINTS_PATH= "/path/to/your/downloaded/checkpoint" export LOAD_CHECKPOINT= "/load_checkpoints/405b" export LOGDIR=< /path/to/output/dir > # set the place where the output logs will be saved export CONT=mlperf-nvidia:large_language_model-pyt source config_GB200_128x4x112xtp4pp8cp2_cg_dplast.sh # select config and source it sbatch -N ${DGXNNODES} -- time =${WALLTIME} run.sub # you may be required to set --account and --partition here |
解析日志
日志文件應大致類似于 Llama 2 70B LoRA 日志。目標準確度 (評估損失) 為 5.6。一旦達到目標,訓練將停止,并打印 run_stop
標記。
?