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.

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.

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%

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:
- AIMO-2 yarışmasında birinci olarak çıkmış ve OpenMathReasoning veri setini ve OpenMath-Nemotron modellerini geliştirmiştir.
- OpenCodeReasoning ve OpenCodeInstruct koleksiyonlarını oluşturmuştur.
- Llama-Nemotron model serisi için bir kısmını yeniden eğitmiştir.
Projelerinizde NeMo-Skills ile yararlanmak için başlayabilirsiniz.