NVIDIA NeMo-Skills ile Karmaşık LLM İş Akışlarını Nasıl Sadeleştirirsiniz?

Gelişmiş LLM’leri (Büyük Dil Modelleri) oluşturmanın tipik bir süreci, birkaç aşamadan geçer: sentetik veri üretimi (SDG), denetimli ince ayar (SFT) veya pekiştirmeli öğrenme (RL) ile model eğitimi ve model değerlendirmesi. Her aşama farklı kütüphaneler kullanmayı gerektirir, ancak bu kütüphaneleri bir arada kullanmak genellikle zordur.

Örnek vermek gerekirse, NVIDIA TensorRT-LLM veya vLLM sentetik veri üretimi için kullanılırken, NVIDIA NeMo veya verl eğitim amacıyla kullanılabilir. Bu durumda, bir Hugging Face kontrol noktasını TensorRT-LLM’e dönüştürmek, büyük ölçekli SDG yapmak, verileri ve modeli NeMo formatına dönüştürmek ve ardından çeşitli referanslar üzerinde eğitimi gerçekleştirmek için birçok farklı komut ve konteyner çalıştırmanız gerekir.

Bu karmaşık iş akışını düzene koymak için NVIDIA, NeMo-Skills kütüphanesini geliştirdi. Bu kütüphane, farklı çerçeveleri bir arada ve değiştirilebilir bir şekilde kullanmanıza olanak tanıyan yüksek seviyeli soyutlamalar sunar. NeMo-Skills ayrıca, hızlı yerel prototipten Slurm kümesinde büyük ölçekli işlerin düzenlenmesine geçişi kolaylaştırır.

Proje Akışını Başlatma

Bu yazı, NVIDIA ekibinin AIMO2 Kaggle yarışmasıni kazanmasına yardımcı olan basitleştirilmiş bir boru hattını anlatmaktadır. Süreç, sınırlı matematiksel akıl yürütme yeteneklerine sahip bir model ile başlar ve bu beceriler bir dizi NeMo-Skills işi aracılığıyla geliştirilir.

Bu adımları takip etmek istiyorsanız, sekiz NVIDIA A100 (veya daha yeni) GPU’ya sahip bir NVIDIA DGX kutusuna ya da benzer yapılandırılmış düğümlere sahip bir Slurm kümesine erişiminiz olmalıdır. Uygulamalarda kullanılan tüm komutlar NeMo-Skills ile test edilmiştir.

NeMo-Skills Kurulumu

Karmaşık işleri düzenlemek için NeMo-Skills, Docker konteynerlerini kullanır. Yerel olarak çalıştırıyorsanız NVIDIA Container Toolkit‘i kurmanız gerekecek veya NVIDIA/pyxis‘i destekleyen bir Slurm kümesi kullanmalısınız. Her iki durumda da, NeMo-Skills’i yerel bir iş istasyonunda kurarak Slurm kümenize SSH ile erişim ayarlarını yapmanız önerilir. Bu, kodunuzu yüklemeyi ve işleri planlamayı kolaylaştırır.

Aşağıdaki komutları çalıştırarak kurulumu tamamlayın:

pip install git+https://github.com/NVIDIA/NeMo-Skills.git  
ns setup

Yükseltme talep edildiğinde, bir klasörü /workspace olarak tanımlayın. Bu klasör, sonraki komutlarda kullanılacaktır. Daha fazla bilgi için NeMo-Skills yapılandırmaları belgesine başvurabilirsiniz.

Sonraki bölümlerde, tüm komutlar --cluster=local argümanıyla kullanılacaktır; eğer Slurm üzerinde çalışıyorsanız bu argümanı --cluster=slurm (veya kurulum sırasında belirlediğiniz adı) olarak değiştirmelisiniz. Slurm kullanıyorsanız, tüm komutlar hemen tamamlanacak ve küme kuyruğunda işler planlanacaktır.

Temel Değerlendirme Kurulumu

LLM becerilerini geliştirmeden önce, modelin mevcut durumunu görmek için orijinal modeli değerlendirmeniz gerekir. Bu eğitici içerik Qwen2.5 14B Instruct modeli ile çalışacak ve AIME24 ve AIME25 kullanarak modelin matematiksel akıl yürütme yeteneklerini değerlendirecektir. vLLM değerlendirme kütüphanesi olarak kullanılacaktır.

Kodu indirmek için gerekli komutlar aşağıda verilmiştir:

# modeli indirme
ns run_cmd --expname=download-14b --log_dir=/workspace/Qwen2.5-14B-Instruct --cluster=local 
    huggingface-cli download Qwen/Qwen2.5-14B-Instruct --local-dir /workspace/Qwen2.5-14B-Instruct
# benchmark verilerini hazırlama
ns prepare_data aime24 aime25
# değerlendirmeyi başlatma
ns eval 
    --cluster=local 
    --expname=baseline-eval 
    --run_after=download-14b 
    --model=/workspace/Qwen2.5-14B-Instruct 
    --server_type=vllm 
    --server_gpus=8 
    --benchmarks=aime24:8,aime25:8 
    --output_dir=/workspace/evals/baseline
# sonuçları özetleme
ns summarize_results --cluster=local /workspace/evals/baseline --wandb_name=baseline-evals

Değerlendirme komutu, AIME24/25 benchmark’larında her örnek için sekiz üretim gerçekleştirecek ve summarize_results ortalama pass@1, pass@8 ve majority@8 metriklerini raporlayacaktır.

--------------------------------- aime24 --------------------------------
evaluation_mode | num_entries | avg_tokens | symbolic_correct | no_answer
pass@1[8]       | 30          | 829        | 11.67%           | 0.00%
majority@8      | 30          | 829        | 13.33%           | 0.00%
pass@8          | 30          | 829        | 33.33%           | 0.00%


--------------------------------- aime25 --------------------------------
evaluation_mode | num_entries | avg_tokens | symbolic_correct | no_answer
pass@1[8]       | 30          | 834        | 11.67%           | 0.42%
majority@8      | 30          | 834        | 20.00%           | 0.00%
pass@8          | 30          | 834        | 26.67%           | 0.00%

Not edin ki tam olarak aynı rakamları bulamayabilirsiniz. Bu durum, LLM üretimlerinin rastgele doğasından kaynaklanmaktadır. Gerçekleştirdiğiniz sonuçların detaylarına NeMo-Skills değerlendirme belgesinden ulaşabilirsiniz.

TensorRT-LLM veya vLLM ile SDG Kullanımı

Kurulan temel performansın üzerine çıkmak için bazı sentetik matematik verileri üretebilirsiniz. OpenMathReasoning tarifi doğrultusunda, AoPS forum tartışmalarından küçük bir set kullanarak problemleri çıkartabilirsiniz. Ardından, bu problem çözümlerini QwQ 32B kullanarak yaratabilirsiniz. Oluşan problem-çözüm çiftleri, eğitim için kullanılacaktır.

Bu basitleştirilmiş işlem hattı oldukça temel olup önemli adımlar (doğru yanıtların çıkarılması ve doğruluk filtreleme gibi) atlamaktadır. Ancak bu, 14B modeline uzun akıl yürütme becerisini öğretmek için yeterli olmalı ve temel sonuçları önemli ölçüde iyileştirecektir.

Öncelikle verileri ve problem çıkartımını hazırlamak için aşağıdaki komutları çalıştırın:

ns run_cmd --expname=prepare-data --log_dir=/workspace/prepare-data --cluster=local 
    'cd /workspace && 
    export DOWNLOAD_PREFIX=https://raw.githubusercontent.com/NVIDIA/NeMo-Skills/refs/heads/main/recipes/openmathreasoning && 
    wget $DOWNLOAD_PREFIX/scripts/prepare_raw_data.py && 
    wget $DOWNLOAD_PREFIX/prompts/extract-problems.yaml && 
    wget $DOWNLOAD_PREFIX/scripts/postprocess_problem_extraction.py && 
    python prepare_raw_data.py && 
    head -n 1000 raw_aops_data.jsonl > data.jsonl'

data.jsonl dosyasından alınan alanlar, extract-problems.yaml‘da doldurulacak ve bu son istem, bir LLM’ye geçirilecektir. Detaylar için veri dosyasını ve istem betiğini inceleyebilirsiniz. İstem formatı ile ilgili daha fazla bilgi için NeMo-Skills istemleri dokümantasyonuna başvurabilirsiniz.

Sonrasında, üretim boru hattını kullanarak NeMo-Skills Python API ile devam edin:

# run_sdg.py
from nemo_skills.pipeline.cli import generate, wrap_arguments

cluster = "local"
num_gpus = 8

postprocess_cmd = (
    f"python /workspace/postprocess_problem_extraction.py "
    f"    /workspace/sdg/problems/output.jsonl "
    f"    /workspace/sdg/extracted-problems.jsonl "
)

generate(
    ctx=wrap_arguments(
        f"++prompt_config=/workspace/extract-problems.yaml "
        f"++prompt_template=qwen-instruct "
    ),
    cluster=cluster,
    input_file="/workspace/data.jsonl",
    output_dir="/workspace/sdg/problems",
    postprocess_cmd=postprocess_cmd,
    expname="problem-extraction",
    run_after=["prepare-data", "download-14b"],
    model="/workspace/Qwen2.5-14B-Instruct",
    server_type="vllm",
    server_gpus=num_gpus,
    # Aşağıdaki parametreleri çıkararak wandb günlüğünü devre dışı bırakabilirsiniz
    log_samples=True,
    wandb_group="sdg",
)

Çıktıları yakından görmek için sdg/extracted-problems.yaml dosyasını kontrol edebilirsiniz. Burada yeni bir alan, çıkarılan problemleri içermelidir. Çözüm üretmek için, uzun akıl yürütme çözümleri üreten checkpoint‘i TensorRT-LLM formatına dönüştürün.

# modeli indirme
ns run_cmd --expname=download-qwq --log_dir=/workspace/QwQ-32B --cluster=local 
    huggingface-cli download Qwen/QwQ-32B --local-dir /workspace/QwQ-32B
# trtllm formatına dönüştürme
ns convert 
    --cluster=local 
    --expname=convert-qwq-trtllm 
    --run_after=download-qwq 
    --input_model=/workspace/QwQ-32B 
    --output_model=/workspace/qwq32b-trtllm 
    --convert_from=hf 
    --convert_to=trtllm 
    --num_gpus=8 
    --model_type=qwen 
    --hf_model_name=Qwen/QwQ-32B 
    --max_seq_len 10000

Sonraki adım, çözümleri geliştirmektir. Şu kodu sdg.py scriptinin sonuna ekleyin ve tekrar çalıştırın. Varsayılan olarak, eğer problem çıkarma işlemi tamamlandıysa bu adım atlanacaktır çünkü NeMo-Skills bunun tamamlandığını tespit edebilir.

generate(
    ctx=wrap_arguments(
        f"++prompt_config=generic/math "
        f"++inference.temperature=0.6 "
        f"++inference.tokens_to_generate=8192 "
        f"++prompt_template=qwen-instruct "
    ),
    cluster=cluster,
    input_file="/workspace/sdg/extracted-problems.jsonl",
    output_dir="/workspace/sdg/solutions",
    expname="solution-generation",
    run_after=["problem-extraction", "convert-qwq-trtllm"],
    model="/workspace/qwq32b-trtllm",
    server_type="trtllm",
    server_gpus=num_gpus,
    # Aşağıdaki parametreleri çıkararak wandb günlüğünü devre dışı bırakabilirsiniz
    log_samples=True,
    wandb_group="sdg",
)

Bu işin tamamlanması birkaç saat sürebilir. Slurm kümesinde birden fazla düğümde çalıştırabiliyorsanız, num_chunks=N ekleyerek bu işlemi N bağımsız işe paralel hale getirebilirsiniz. Ekstra parametreler ve daha fazlası hakkında bilgi almak için NeMo-Skills üretimi belgesine gözatabilirsiniz.

Eğer W&B günlüğü aktifse, orada nesneleri inceleyebilirsiniz. Şekil 1, ns generate boru hattının W&B panosundaki çıktısını göstermektedir. Bir deney açarak, Dosyalar sekmesine geçebilir ve samples.json üzerine tıklayarak bulabilirsiniz.

Screenshot showing the output of ns generate pipeline logged in the Weights & Biases dashboard.
Şekil 1:ns generate boru hattının W&B panosundaki çıktısı

NeMo ile Model Eğitimi

Sentetik veriler hazır olduğunda, bunları modeli ince ayar yapmak için kullanabilirsiniz. Aşağıdaki bölümler, NeMo-Aligner veya NeMo-RL kullanarak eğitimi nasıl gerçekleştireceğinizi gösterecektir.

Öncelikle verileri gerekli formata hazırlayın:

ns run_cmd --log_dir=/workspace/prepare-sft-data --expname=prepare-sft-data --run_after=solution-generation --cluster=local 
    'python -m nemo_skills.training.prepare_data 
      ++input_files=/workspace/sdg/solutions/output.jsonl 
      ++output_path=/workspace/sft-data.jsonl 
      ++prompt_config=generic/math 
      ++prompt_template=qwen-instruct 
      ++filters.remove_contaminated=false 
      ++add_unlabeled=true 
      ++filters.remove_no_think_tags=true 
      ++filters.trim_solutions=false'

Sonra, modelinizi dönüştürün. Bu adımı NeMo-RL eğitimi için atlayabilirsiniz.

ns convert 
    --cluster=local 
    --expname=convert-14b-nemo 
    --run_after=download-14b 
    --input_model=/workspace/Qwen2.5-14B-Instruct 
    --output_model=/workspace/qwen2.5-14b-instruct-nemo 
    --convert_from=hf 
    --convert_to=nemo 
    --num_gpus=8 
    --model_type=qwen 
    --hf_model_name=Qwen/Qwen2.5-14B-Instruct

NeMo-Aligner backend’i için, aşağıdaki eğitim komutunu kullanın. W&B günlüğünü devre dışı bırakmak için --disable_wandb ekleyebilirsiniz.

ns train 
    --cluster=local 
    --expname=training 
    --run_after=convert-14b-nemo 
    --run_after=prepare-sft-data 
    --output_dir=/workspace/training 
    --nemo_model=/workspace/qwen2.5-14b-instruct-nemo 
    --num_nodes=1 
    --num_gpus=8 
    --training_data=/workspace/sft-data.jsonl 
    ++model.data.train_ds.max_seq_length=8192 
    ++model.data.train_ds.global_batch_size=32 
    ++model.tensor_model_parallel_size=4 
    ++model.context_parallel_size=2 
    ++model.optim.lr=1e-5 
    ++trainer.sft.max_epochs=2

NeMo-RL backend’i için, bu komutları kullanabilirsiniz. W&B günlüğünü devre dışı bırakmak için yine --disable_wandb ekleyin. Eğitim komutlarından yalnızca birini çalıştırmalısınız, diğerini çalıştırmayın ya da yolları ve deney isimlerini değiştirin.

ns nemo_rl sft 
    --cluster=local 
    --expname=training 
    --run_after=download-14b 
    --run_after=prepare-sft-data 
    --output_dir=/workspace/training 
    --hf_model=/workspace/Qwen2.5-14B-Instruct 
    --num_nodes=1 
    --num_gpus=8 
    --training_data=/workspace/sft-data.jsonl 
    --cache_dir=/workspace/nemo-rl-cache 
    --final_hf_path=/workspace/training/qwen2.5-14b-improved-hf 
    ++sft.max_num_epochs=4 
    ++policy.dtensor_cfg.tensor_parallel_size=8 
    ++policy.max_total_sequence_length=8192 
    ++policy.train_global_batch_size=32 
    ++policy.optimizer.kwargs.lr=1e-5 
    ++policy.dtensor_cfg.sequence_parallel=true 
    ++policy.dtensor_cfg.activation_checkpointing=true

İnce ayar yapılandırmaları hakkında daha fazla bilgi edinmek için NeMo-Skills eğitim belgelerine göz atabilirsiniz. W&B günlüğü aktifleştirildiyse eğitim metriklerini orada gözlemleyebilirsiniz.

Şekil 2: Eğitim metrikleri Weights & Biases dashboard’unda

Son Değerlendirme

Model gelişimini kontrol etmek için başka bir değerlendirme gerçekleştirin. Kontrol noktasını hızlı değerlendirme için Hugging Face formatına geri dönüştürün. NeMo-RL backend’i kullanıyorsanız bu adımı atlayabilirsiniz.

# HF formatına dönüştürme
ns convert 
   --cluster=local 
   --expname=convert-14b-hf 
   --run_after=training 
   --input_model=/workspace/training/model-averaged-nemo 
   --output_model=/workspace/training/qwen2.5-14b-improved-hf 
   --convert_from=nemo 
   --convert_to=hf 
   --num_gpus=8 
   --model_type=qwen 
   --hf_model_name=Qwen/Qwen2.5-14B-Instruct
# değerlendirmeyi başlatma
ns eval 
    --cluster=local 
    --expname=final-eval 
    --run_after=convert-14b-hf 
    --run_after=training 
    --model=/workspace/training/qwen2.5-14b-improved-hf 
    --server_type=vllm 
    --server_gpus=8 
    --benchmarks=aime24:8,aime25:8 
    --output_dir=/workspace/evals/after-training 
    ++inference.tokens_to_generate=16384
# sonuçları özetleme
ns summarize_results --cluster=local /workspace/evals/after-training --wandb_name=after-training-evals

Bu değerlendirme, her iki benchmarkda da iyi gelişmeler göstermelidir. Şekil 3, W&B panosunda değerlendirme sonuçlarını göstermektedir. Çalışmalar paneline geçerek, sütunları özelleştirmek için Columns seçeneğine tıklayın.

--------------------------------- aime24 --------------------------------
evaluation_mode | num_entries | avg_tokens | symbolic_correct | no_answer
pass@1[8]       | 30          | 13362      | 27.92%           | 55.83%
majority@8      | 30          | 13362      | 40.00%           | 16.67%
pass@8          | 30          | 13362      | 50.00%           | 16.67%


--------------------------------- aime25 --------------------------------
evaluation_mode | num_entries | avg_tokens | symbolic_correct | no_answer
pass@1[8]       | 30          | 13445      | 17.92%           | 53.33%
majority@8      | 30          | 13445      | 26.67%           | 10.00%
pass@8          | 30          | 13445      | 36.67%           | 10.00%
Şekil 3: Elde edilen değerlendirme sonuçları W&B dashboard’unda

NeMo-Skills ile Herhangi Bir LLM’yi Geliştirin

NeMo-Skills ile, LLM yeteneklerini geliştirmek için gereken çeşitli aşamaları bağlayarak karmaşık boru hatları oluşturabilirsiniz. Bu, farklı eğitim ve çıkarım çerçeveleri arasında sorunsuz geçiş yapmanızı sağlar. Bu eğitimde kullanılan tüm komutlar, tüm işi planlayarak tek bir script olarak birleştirilebilir. Sadece bir satır değişikliği ile hızlı yerel prototipten büyük ölçekli deneylere geçiş yapabilirsiniz.

Bir alıştırma olarak, NeMo-Skills belgelerinde belirtilen ekstra filtreleme adımlarını eklemeyi deneyin. Ayrıca, her problemin birden fazla çözümünü üretmeyi ve bunun son değerlendirme sonuçlarını nasıl etkilediğini görebilirsiniz. Tüm aşamaları – veri üretiminden model eğitimine ve değerlendirmeye kadar – yöneten tek bir script’in olması, iş akışında değişiklik yapmayı oldukça kolaylaştırır.

NVIDIA ekibi NeMo-Skills’i kullanarak, popüler pek çok model ve veri seti geliştirmiştir. Özellikle:

Projelerinizde NeMo-Skills ile yararlanmak için başlayabilirsiniz.

Kaynak

Nvdia Blog

Exit mobile version