• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 數據中心/云端

    重現 NVIDIA MLPerf v5.0 的 LLM 基準測試訓練成績

    ?

    預備知識

    運行 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) 以在計算節點上啟動作業。

    運行基準測試

    開始對任何模型進行基準測試所需的步驟包括:

    1. Build a Docker container.
    2. 使用 Docker 在任何計算機上運行容器,以下載和處理數據集和檢查點。此步驟可以在任何機器上完成,無論是否在集群中,通常不需要配備 GPU 的系統。確保計算節點可以訪問數據。數據最好存儲在節點的本地;或者,可以通過快速 (并行) 文件系統進行訪問。
    3. 啟動訓練并解析日志。

    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 在計算節點上啟動基準測試。兩個文件用于促進作業啟動過程:

    1. 配置文件 (config_*.sh) ,用于描述模型的超參數,包括節點數量、墻面時間等。通過將每個提交的內容整理成一個文件,可以輕松配置工作負載,以便使用最佳超參數以所需規模運行。
    2. 一個固定的 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_&lt;number&gt;_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 文件夾,其中包含當前目錄下的上下文和權重子文件夾:

    &lt;LOAD_CHECKPOINTS_PATH&gt;
    └── 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 類似,使用了兩個文件:

    1. 配置文件 (config_*.sh) ,用于描述模型的超參數,包括節點數量、墻面時間等。通過選擇合適的文件,您可以輕松配置工作負載,使其使用最佳超參數以所需規模運行。
    2. 一個固定的 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 標記。

    ?

    0

    標簽

    人人超碰97caoporen国产