Önceki yazıda, NVIDIA Blackwell‘in en son MLPerf eğitim testlerinde, yedi kriterde de en hızlı eğitim sürelerini sağladığını açıkladık. Bu yazıda, NVIDIA’nın MLPerf v5.0 raporlarının Llama 2 70B LoRA ince ayarı ve Llama 3.1 405B ön eğitim performansını yeniden üretmek için bir kılavuz sunuyoruz. Gönderim depolarında, puanları yeniden üretmek için gereken talimatları içeren README dosyaları yer almaktadır. Örneğin, Llama 2 70B LoRA ince ayar benchmark ve Llama 3.1 405B benchmark belgeleri incelenebilir.
Gerekli Ön Koşullar
NVIDIA benchmark’larının çalıştırılması için aşağıdaki koşullara dikkat edilmesi gerekmektedir:
- İçerik hazırlığı, veri kümesi/ kontrol noktası indirme ve ön işleme
- Docker: Docker kurulumunun tamamlanması gerekmektedir.
- Hugging Face erişim tokeni: Veri kümesi ve kontrol noktası indirme için gereklidir.
- Llama 3.1 için: En az 2.5 TB depolama alanı; LoRA ince ayarı için: 300 GB gereklidir.
- Donanım Gereksinimleri
- Llama 2 70B LoRA: En az sekiz GPU’dan oluşan bir NVIDIA DGX B200 veya NVIDIA GB200 NVL72 sistemi veya InfiniBand ile bağlantılı birden fazla GB200 NVL72 sistemi gereklidir.
- Llama 3.1 405B: InfiniBand ile bağlantılı en az dört GB200 NVL72 sistemi gereklidir ve en küçük NVIDIA gönderimi için 256 GPU kullanılmalıdır.
Küme Kurulumu
NVIDIA’nın MLPerf Eğitim benchmark’larının çalıştırılması için aşağıdaki ekipman ve yazılımların kurulu olması gereklidir:
- Slurm, Pyxis ve Enroot tabanlı bir ortam
- NVIDIA NVLink ve InfiniBand ile ağ bağlantıları
- RAID0 yapılandırmasında hızlı yerel depolama: Veri yükleme darboğazlarını azaltmak için gereklidir.
NVIDIA gönderim kümeleri, Docker ile çalıştırılacak iş yüklerini desteklemez. Kümeler, NVIDIA Base Command Manager (BCM) ile yönetilmektedir. BCM SLURM kümesi kurulumunu doğru yapmak için resmi talimatları takip edin. Doğru bir kurulumdan sonra, ana düğüme giriş yaparak SLURM komutlarına (sinfo, squeue, srun, sbatch) erişebilmeniz gerekir.
Benchmark’ların Çalıştırılması
Herhangi bir modelin benchmark’ını başlatmak için şu adımlar izlenmelidir:
- Bir Docker konteyneri oluşturun.
- Herhangi bir makinede (kümledeki veya dışındaki) konteyneri çalıştırarak veri kümesini ve kontrol noktasını indirin ve işleyin. Bu adım, GPU olmayan bir sistemde bile gerçekleştirilebilir. Verinin hesaplama düğümleri tarafından erişilebilir olmasını sağlayın; tercihen veri düğümde yerel olarak depolanmalıdır.
- Eğitimi başlatın ve günlükleri analiz edin.
Llama 2 70B LoRA
Llama 2 70B LoRA benchmark’larını çalıştırmak için bu bölümdeki talimatları izleyin.
Konteyneri Oluşturma
- mlcommons/training_results_v5.0 GitHub deposunu klonlayın.
- Şu dizine geçin: NVIDIA/benchmarks/llama2_70b_lora/implementations/tyche_ngpu72_ngc25.04_nemo.
- Docker build -t mlperf-nvidia:llama2_70b_lora-pyt komutunu çalıştırın. Eğer imajı itmek istediğiniz bir kayıt deposu varsa, imaj isimine kayıt adı ekleyin.
Veri Kümesini ve Modeli İndirme
Bu benchmark, GovReport veri kümesi ve bir Hugging Face kontrol noktası kullanmaktadır. Her ikisinin de NVIDIA NeMo kullanılarak kullanılabilmesi için ön işlenmesi gerekmektedir. Kontrol noktasını indirmek için bir Hugging Face tokenine ihtiyacınız var.
İndirmek ve ön işleme yapmak için şu adımları izleyin:
# Veri kümesinin saklanacağı dizini oluşturun
mkdir </path/to/dataset>
# Docker konteynerini başlatın
docker run -it --rm --gpus all --network=host --ipc=host --volume </path/to/dataset>:/data mlperf-nvidia:llama2_70b_lora-pyt
# Şimdi, konteynerin içindeyken /workspace/ft-llm dizininde indirme scriptlerini çalıştırın
python scripts/download_dataset.py --data_dir /data/gov_report # veri kümesini indirin
python scripts/download_model.py --model_dir /data/model # NeMo formatında ön işlenmiş model kontrol noktasını indirin; bu işlem 30 dakikaya kadar sürebilir
Model indirme işlemi başarısız olursa, download_model.py
scriptini çalıştırmadan önce HF_TOKEN ortam değişkenini dışa aktarmanız gerekebilir:
export HF_TOKEN=<your/huggingface/token>
Dönüştürme işlemi tamamlandıktan sonra, /data dizininde şu dosyaları görmelisiniz:
├── 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
Bu noktada konteynerden çıkabilirsiniz.
Benchmark’ı Başlatma
NVIDIA, hesaplama düğümlerinde benchmark’ları başlatmak için SLURM kullanmaktadır. İş yükünün nasıl başlatılacağını kolaylaştırmak için iki dosya kullanılmaktadır:
- Modelin hiperparametrelerini, düğüm sayısını, çalışma süresini vb. tanımlayan bir yapılandırma dosyası (config_*.sh). Her gönderim için tek bir dosya düzenleyerek, çalıştırılacak yükün optimal hiperparametrelerle istenen ölçekte kolayca yapılandırılmasını sağlar.
- Hiperparametreleri Python scriptine iletmek amacıyla srun komutları içeren sabit bir run.sub dosyası.
Örneğin, config_GB200_18x4x1xtp1pp1cp8.sh adlı tipik bir yapılandırma dosyasını inceleyebilirsiniz; ismi sistemi temsil etmektedir:
- GB200: GB200 makinesinde çalıştırmak üzere tasarlanmıştır.
- 18×4: Bir sistem ayarı olarak NNODES x NGPUS şeklinde yorumlanabilir
- NNODES: GB200 düğümlerinin sayısı
- NGPUS: Düğüm başına GPU sayısı
- x1xtp1pp1cp8 ise bir paralelleştirme şemasını gösterir:
- x1: Gradient Accumulation (GA) değeri 1, yani GA yok.
- TP1: Tensor Parallel yok.
- PP1: Pipeline Parallel yok.
- CP8: 8 yönlü Context Parallel.
Bu ayarların gösterdiği gibi, 72-GPU yapılandırması kullanılacak ve tek bir GB200 NVL72 rafında çalışacaktır. Benchmark, GA1TP1PP1CP8 ile global batch boyutunun 9 olduğu bir yapı ile çalışacaktır.
Sonraki adımda, yapılandırma dosyasının içeriğini incelemeniz gerekmektedir. İlk kısım, tüm yapılandırmalar için kullanılan hiperparametreler ve optimizasyon bayraklarını içeren config_common.sh dosyasını kaynak olarak alır. Bazı durumlarda, bu dosyadaki bir bayraktaki değer değiştirilebilir. Maksimum adım sayısını, öğrenme oranını, gradient accumulation (MINIBS) ve daha önce belirtilen paralelleştirme şemasını ayarlayın.
#!/bin/bash
source $(dirname ${BASH_SOURCE[0]})/config_common.sh
# Hiperparametreler
export MAX_STEPS=800
export LR=0.0005
export MINIBS=1
export TP=1
export SP=0
export CP=8
Sonraki kısım, sistem özgü optimizasyonları ekleyerek, varsa ortak bayrakları geçersiz kılma imkanı sağlar.
export LAYER_CUDA_GRAPH=0
export MCORE_CUDA_GRAPH=1
Ardından, SLURM‘a iletilmesi gereken sistem seviyesinde ayarlar yer alır.
# Sistem parametreleri
export VBOOST_VALUE=0
export DGXNNODES=18
export DGXNGPU=4
export WALLTIME_RUNANDTIME=10
export WALLTIME=$((5 + ${NEXP:-1} * ($WALLTIME_RUNANDTIME + 5)))
Yapılandırmalar, belirli bir sistem boyutu için optimize edilmektedir. Bu, performansı etkileyen optimizasyon bayrakları ve yakınsamanın etkililiğini artıran hiperparametreleri içerir. Mevcut yapılandırmayı farklı bir boyutta çalıştırmak mümkündür ancak dikkatli değerlendirme gerektirir ve orijinal yapılandırma kadar performans gösteremeyebilir.
Gerçek eğitim sürecine başlamak için, script’e veri kümesinin/modelin nereye yerleştirileceğini, günlük dosyasının nerede saklanacağını, hangi konteynerin kullanılacağını belirtmeniz gerekir. Ayrıca yapılandırma dosyalarını kaynak olarak alıp sbatch komutunu çalıştırın:
export DATADIR="</path/to/dataset>/gov_report" # kendi </path/to/dataset> dizininizi ayarlayın.
export MODEL="</path/to/dataset>/model" # modelin yerini ayarlayın.
export LOGDIR="</path/to/output_logdir>" # çıkış günlüklerinin saklanacağı yeri ayarlayın.
export CONT=mlperf-nvidia:llama2_70b_lora-pyt
source config_<system>.sh # yapılandırmayı seçip kaynak alın
sbatch -N $DGXNNODES -t $WALLTIME run.sub # burada --account ve --partition ayarlamanız gerekebilir.
Günlükleri Analiz Etme
Günlük dosyası, başlangıç ve diğer bilgi satırlarından oluşan bol miktarda çıktı içerebilir. MLPerf ile ilgili olan satırlar, :::MLLOG
ile başlayacaktır. Bazı ilginç işaretler şu şekildedir:
Başlangıçta şu işaret görünür:
:::MLLOG {"namespace": "", "time_ms": 1745066769306, "event_type": "INTERVAL_START", "key": "init_start", "value": null, "metadata": {"file": "/workspace/ft-llm/train.py", "lineno": 327}}
Buradan, Python scriptinin başladığını anlayabilirsiniz. Ardından, yapılandırma dosyasında seçtiğiniz hiperparametreler ile varsayılan (değiştirilemeyen) ayarlar görülmektedir.
İlk aşama tamamlandığında, modelin ısınması ile birlikte init_stop
ve run_start
işaretleri yazılır:
:::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
işareti, zamanlayıcı saatinin başlangıcını belirtir. Eğitim ilerlemesi ile ilgili sonraki satırlar, değerlendirmeleri içerir. Değerlendirme kaybı aşağı doğru düştüğünde, bu eval_accuracy
ile işaretlenir.
Değerlendirme doğruluğu (değerlendirme kaybı olarak ifade edilir) %92.5’in altına düştüğünde, eğitim durur ve run_stop
işareti yazılır:
:::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"}}
Eğer benchmark, başarısız olursa, run_stop
durumu “aborted” olarak görüntülenir. MLPerf skoru ise run_stop
ve run_start
zaman damgaları arasındaki farktır. Bu durumda:
Skor [milisaniye] = (1745067009420 – 1745066917961) = 91459
Skor [dakika] = 91459/60000 = 1.524
Unutmayın ki, çünkü yakınsama belirsizdir, nihai skoru birkaç çalışmadan çıkarmak gereklidir; çünkü yakınsamak için gereken örnek sayısı değişiklik gösterebilir. Bu örnekte, benchmark 3,072 örnekte yakınsadığı görülmüştür, ancak ortalama olarak 3,100-3,200 örnekte yakınsaması beklenir.
Llama 3.1 405B
Llama 3.1 405B benchmark’larını çalıştırmak için bu bölümdeki talimatları izleyin.
Konteyneri Oluşturma
- mlcommons/training_results_v5.0 GitHub deposunu klonlayın.
- Şu dizine geçin: NVIDIA/benchmarks/llama31_405b/implementations/tyche_ngpu512_ngc25.04_nemo.
- docker build -t mlperf-nvidia:large_language_model-pyt komutunu çalıştırın. Hedeflediğiniz bir kayıt deposuna, imaj adına eklemek isteyebilirsiniz.
Veri Kümesini ve Modeli İndirme
Veri kümesi ve tokenizasyon ile ilgili daha fazla bilgi için Llama 3.1 405B referans README belgelerinin incelenmesi gerekmektedir.
PREPROCESSED_PATH ortam değişkeni, ön işlenmiş veri kümesini işaret eder. İndirilen dosyalar .idx ve .bin ile bitmelidir.
c4-train.en_<number>_text_document where number belongs to 0~7.
c4-validation-91205-samples
TOKENIZER_PATH ortam değişkeni, bu benchmark’da kullanılan tokenizere işaret eder. İndirilen dosyalar arasında:
special_tokens_map.json
tokenizer.json
tokenizer.model
tokenizer.model.v1
tokenizer_config.json
Gereksiz dosyaları temizlemek için cleanup.sh scriptini çalıştırabilirsiniz:
bash scripts/cleanup.sh
Sonunda, PREPROCESSED_PATH dizini şu dosyaları içermelidir:
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
Kontrol Noktası
Benchmark bölgesinde, Meta’nın resmi Hugging Face kontrol noktasından eğitim devam ettirilmelidir. BF16 model kontrol noktasını indirmek için gerekli talimatlar, referans README‘sında yer almaktadır. Devam etmeden önce, bulunduğunuz çalışma dizininin >1.5 TB veri tutabileceğinden emin olun.
İndirme komutunu geçerli dizinde çalıştırdığınızda, LOAD_CHECKPOINTS_PATH ortam değişkeninde belirtilen dizinde bir 405B klasörü bulmalısınız. Bu klasör, alt klasörler olarak context ve weights içerir:
<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
Benchmark’ı Başlatma
NVIDIA, hesaplama düğümlerinde benchmark’ları başlatmak için yine SLURM kullanmaktadır. Yüklerin başlatılmasına yardımcı olmak için, Llama 2 70B LoRA benchmark’ında olduğu gibi, iki dosya kullanılmaktadır:
- config_*.sh: Modelin hiperparametreleri, düğüm sayısı, çalışma süresi vb. hakkında bilgi veren bir yapılandırma dosyası.
- Kullanımda olan tüm hiperparametrelerle eğitim başlatma komutlarını içeren bir sabit run.sub dosyası.
Örneğin, config_GB200_128x4x112xtp4pp8cp2_cg_dplast.sh dosyasını inceleyebilirsiniz; isim, sistemin boyutunu ve tipini tanımlar:
- GB200: GB200 makinesi üzerinde çalıştırmak üzere tasarlanmıştır.
- 128×4: Bir sistem ayarı olarak NNODES x NGPUS
- NNODES: GB200 düğümlerinin sayısı.
- NGPUS: Düğüm başına GPU sayısı.
- x112xtp4pp8cp2: Bir paralelleştirme şemasını gösterir:
- x112: Gradient Accumulation (GA) = 112.
- TP4: 4-yönlü Tensor Parallel.
- PP8: 8-yönlü Pipeline Parallel.
- CP2: 2-yönlü Context Parallel.
Buna göre, 512-GPU yapılandırması, sekiz GB200 NVL72 rafında kullanılacaktır. Benchmark, GA112TP4PP8CP2 ile global batch boyutu 896 olacaktır.
Yapılandırma dosyasının içeriğini kontrol edin; ilk kısım config_common.sh, tüm yapılandırmalar için hiperparametreler ve optimizasyon bayrakları içerir. Hangi yapılandırmada değişiklikler varsa belirleyin; gradient accumulation, paralelleştirme şeması ve maksimum adım sayısını ayarlayın:
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
Sonrasında performans optimizasyon bayraklarını ayarlayın:
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
# Bağlama
export BINDCMD="bindpcie --cpu=node"
Ardından, SLURM‘a iletilmesi gereken sistem ayarları yer alır:
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)))
Eğitim sürecini başlatmak için, veri kümesi/ kontrol noktasının nerede olduğunu, günlük dosyasının kaydedileceği yeri, kullanılacak konteyneri belirtmeniz şarttır. Yapılandırmaları kaynak olarak alıp sbatch komutunu çalıştırmalısınız:
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> # çıkış günlüklerinin saklanacağı yeri ayarlayın.
export CONT=mlperf-nvidia:large_language_model-pyt
source config_GB200_128x4x112xtp4pp8cp2_cg_dplast.sh # yapılandırmayı seçin ve kaynak alın.
sbatch -N ${DGXNNODES} --time=${WALLTIME} run.sub # burada --account ve --partition ayarlamanız gerekebilir.
Günlükleri Analiz Etme
Günlük dosyaları, büyük ölçüde Llama 2 70B LoRA günlüklerine benzemelidir. Hedef doğruluk (%5.6) eğitim tamamlandıktan sonra yazdırılır ve run_stop
işareti yazılır.