TRL documentation
Asenkron GRPO
Asenkron GRPO
Bu eğitimci
vllm,transformers>=5.2.0vekernelsgerektirir (eğitim, FlashAttention'ı Hub üzerinden bu bileşen aracılığıyla yükler). Dağıtık eğitim için yalnızca FSDP2 desteklenir (DeepSpeed ZeRO desteklenmez).Şu anda
vllmvetransformersçelişkili bağımlılık kısıtlamalarına sahip. Bunu aşmak için önce vLLM'yi kurun, ardından transformers'ı zorla kurun ve son olarak transformers'ın kabul ettiği sürümü sabitleyen TRL'in ek paketi üzerindenkernels'i ekleyin:pip install vllm pip install 'transformers>=5.2.0' --no-deps pip install 'trl[kernels]'
Genel Bakış
experimental.async_grpo.AsyncGRPOTrainer, aynı GRPO algoritmasını uygular ancak rollout üretimini eğitimden ayırır. Arka plan işçisi, eğitim döngüsünün bunları tüketirken bir vLLM sunucusundan sürekli olarak tamamlamaları akış olarak almasını sağlar; böylece üretim ve gradyan güncellemeleri sırayla değil, üst üste gerçekleşir. API, GRPOTrainer ile aynıdır — GRPO yönteminin kendisiyle ilgili tüm ayrıntılar için (avantaj hesaplama, KL tahmini, kayıp formülasyonu, ödül fonksiyonları vb.) GRPO Trainer belgelerine bakın. GRPOTrainer'daki tüm özellikler mevcut değildir; desteklenen parametreler için experimental.async_grpo.AsyncGRPOConfig'e başvurun.
Bu eğitimci Quentin Gallouédec ve Amine Dirhoussi tarafından katkı sağlanmıştır.
GRPOTrainer'dan farkı
Standart GRPOTrainer'da üretim ve eğitim ardışık olarak gerçekleşir: bir parti üretilir, kayıp hesaplanır, ağırlıklar güncellenir ve bu işlem tekrarlanır. Üretimin aynı GPU'larda çalıştığı vLLM colocate modu dahil olmak üzere, bir faz tamamlanmadan diğeri başlayamaz.
experimental.async_grpo.AsyncGRPOTrainer bu iki kaygıyı ayırır:
- Rollout worker (arka plan süreci) — vLLM sunucusuna istemler gönderir, tamamlamaları ödül fonksiyonlarıyla puanlar, avantajları hesaplar ve eğitime hazır örnekleri bir kuyruğa iter.
- Eğitim döngüsü (ana süreç) — kuyruktan örnekleri alır, kırpılmış vekil kaybı (clipped surrogate loss) hesaplar ve model ağırlıklarını günceller.
Rollout worker, trainer'dan türetilen ayrı bir süreçte çalıştığından ödül hesaplama, eğitim döngüsüyle GIL için asla yarışmaz. Bu durum, reward_funcs, tools ve environment_factory (ikincisi için OpenEnv kılavuzu'na bakın; bu kılavuz sözleşmeyi ve mevcut entegrasyonları kapsar) olarak iletebileceğiniz şeyler için iki sonuç doğurur:
Rollout worker'ı ayrı bir süreçte çalıştırdığımız için, ona iletilen her şey pickled edilir. Bu nedenle her ödül fonksiyonu, araç ve
environment_factory(ve bunların kapattığı her şey) picklable olmalıdır: modül düzeyinde bir fonksiyon,functools.partialveya çağrılabilir sınıf örneği kullanın. Araçlar istisnadır: model, bir aracı adıyla çağırır, bu yüzden her araç__name__altında kaydedilmeli ve modül düzeyinde bir fonksiyon olmalıdır. Lambda'lar ve kapanışlar (closures),trainer.train()sırasındaTypeErrorfırlatır. Bu, ödül fonksiyonlarının süreç içi çağrıldığı ve kapanışların (closures) çalıştığı GRPOTrainer'dan bir farktır.The rollout process also runs with
CUDA_VISIBLE_DEVICES="", so it cannot use the GPU. A GPU-backed reward model (e.g. anAutoModelForSequenceClassificationscorer) still loads without error but silently falls back to CPU (note that in GRPOTrainer, such a reward model shares the trainer’s GPUs). Keep reward functions CPU-side and lightweight (verifiers likeaccuracy_reward, format/length checks).GPU ödül modeline gerçekten ihtiyacınız varsa, önerilen yaklaşım, modelin kendi çıkarım motorunun arkasında sunulmasıdır (vLLM, TGI, …) ve bunun ayrı GPU'larda yapılmasıdır; ardından hafif, picklable bir ödül fonksiyonu HTTP üzerinden bu modele çağrı yapar. Bu sayede ödül modeli kendi cihazında kalırken rollout süreci yalnızca CPU'da çalışır ve eğitimciden bağımsız olarak ölçeklenir.
Araçlar ve ortam yöntemleri senkron veya asenkron olabilir. Senkron araçlar, max_concurrent_rollouts boyutunda bir iş parçacığı havuzunda çalışır; bu sayede yavaş bir araç, diğer devam eden vLLM isteklerini asla engellemez. Tek bir asistan turu içinde, araç çağrıları modelin onları ürettiği sırada çalışır. Dolayısıyla en fazla max_concurrent_rollouts senkron araç aynı anda çalışır; bu nedenle paylaşılan durumu okuyan veya yazan bir aracın iş parçacığı güvenli (thread-safe) olması gerekir.
Her weight_sync_steps eğitim adımı sonrasında, güncellenmiş ağırlıklar NCCL üzerinden vLLM sunucusuna aktarılır; böylece sonraki üretimler en güncel politikayı yansıtır.
Üretim ve eğitim eşzamanlı olarak çalıştığı için, eğitim örnekleri modelin biraz daha eski bir sürümü tarafından üretilmiş olabilir. max_staleness parametresi, bir örneğin atılmadan önce kaç ağırlık güncellemesi geride kalabileceğini kontrol eder.
Eşzamanlılık
vLLM sunucusuna gönderilen eşzamanlı istek sayısı max_concurrent_rollouts ile sınırlandırılır. Varsayılan olarak max(max_staleness, 1) × per_device_train_batch_size × gradient_accumulation_steps × num_processes olarak otomatik ayarlanır — eğitimcinin örnekler bayatlamadan önce tüketebileceği maksimum örnek sayısı. Bundan fazlasını üretmek israftır çünkü fazla örnekler atılır.
max_concurrent_rollouts bir tavan değeridir, fiilen uçuşta olan istek sayısını belirtmez. İşçi, sunucunun /metrics uç noktasını birkaç saniyede bir sorgular ve bunun altında canlı bir sınır tutar (rollout/concurrency_cap): belirli bir eşzamanlılık seviyesinin ötesinde, KV önbelleği dolduğu, diziler önemsizleştirilip yeniden hesaplandığı ve önbelleğe alınmış öneklerin atılıp yeniden doldurulduğu için ek istekler vLLM’i yavaşlatır. Sınır, başlangıçta sunucudan açılışta okunan KV cache tokens / max_model_len değerine ayarlanır: tam uzunlukta sığabilecek kadar istek, böylece ilk adım sistemde aşırı yüklenmeye neden olamaz. Kullanım 0,6’nın altında kaldığı ve kuyrukta bekleyen bir şey olmadığı sürece, bir sınır miktarı kadar rollout tamamlanıp her seferinde sınır %25 oranında artar, tavan değere kadar. KV önbelleği kullanımı 0,8’i aştığında sınır %30 oranında düşürülür; çalışan hiçbir istek iptal edilmez, yalnızca havuz yeni sınırın altına inene kadar kabul durur ve o zamana kadar ek bir düşüş uygulanmaz. Sunucu /metrics uç noktasını açmıyorsa, sınır tavan değerde kalır.
Kontrol noktası ve devam: ignore_data_skip varsayılan olarak True'dir; temel Trainer'ın atla ve yeniden oynat döngüsü, canlı bir rollout kuyruğuna uygulanmaz. Bunun yerine, henüz eğitim görmemiş ilk istemin indeksi, her kontrol noktasıyla birlikte rollout_state.json dosyasına kaydedilir ve devam sırasında geri yüklenir; böylece işçi, örnekleri yeniden oynatmadan o isteme hızlıca ilerler. Bu, üreticinin değil eğitim konumudur: işçi, rollout kuyruğu derinliği kadar eğitimin önünde çalışır ve bu tamponlanan örnekler çalışmanın sona ermesiyle kaybolur; dolayısıyla üreticinin konumundan devam etmek, oluşturulmuş ancak eğitim görmemiş istimleri atlar. Akış veri kümeleri (IterableDataset) yeniden konumlandırılamaz; işçileri devam sırasında 0. istimden yeniden başlar. FSDP ile bf16=True (varsayılan) veya fp16=True kullanıldığında, ana ağırlıklar fp32 olsa bile model.safetensors bu veri türünde yazılır; bu nedenle itilen kontrol noktası, sunulan modelin boyutundadır, iki katı değil. fp32 ana ağırlar ve optimizör durumu yine de devam dosyalarına (pytorch_model_fsdp.bin, optimizer.bin) gider; devam sırasında okunan dosyalar bunlardır, bu yüzden devam etme işleminden etkilenmez. FSDP olmadan kontrol noktası aynı zamanda devam dosyasıdır, bu nedenle ana veri türünü korur.
Hızlı başlangıç
# train_async_grpo.py
from datasets import load_dataset
from trl.experimental.async_grpo import AsyncGRPOTrainer
from trl.rewards import accuracy_reward
dataset = load_dataset("trl-lib/DeepMath-103K", split="train")
trainer = AsyncGRPOTrainer(
model="Qwen/Qwen3-4B",
reward_funcs=accuracy_reward,
train_dataset=dataset,
)
trainer.train()vLLM sunucusu ve eğitimci ayrı GPU'larda çalışmalıdır. GPU'larınızı bölmek için CUDA_VISIBLE_DEVICES kullanın. Örneğin, 2 GPU ile vLLM sunucusunu GPU 0'da, eğitimciyi ise GPU 1'de aşağıdaki gibi çalıştırabilirsiniz:
# Terminal 1: vLLM server on GPU 0 (dev mode + NCCL weight transfer are required)
CUDA_VISIBLE_DEVICES=0 VLLM_SERVER_DEV_MODE=1 vllm serve Qwen/Qwen3-4B \
--max-model-len 4096 \
--logprobs-mode processed_logprobs \
--api-server-count 8 \
--weight-transfer-config '{"backend":"nccl"}'
--max-model-lendeğerini, beklediğiniz maksimum toplam dizi uzunluğuna (istek + tamamlama) ayarlayın. Daha düşük bir değer, sunucudaki GPU bellek kullanımını azaltarak KV önbelleği için daha fazla bellek boşaltır ve verimliliği artırır. İyi bir başlangıç noktası, yapılandırmanızdaki istek uzunluğu ilemax_completion_lengthdeğerinin toplamıdır.
# Terminal 2: training on GPU 1
CUDA_VISIBLE_DEVICES=1 accelerate launch train_async_grpo.pyAMD GPU'ları
Trainer, AMD GPU'lerde (ROCm) ek bir kurulum gerektirmeden çalışır: yukarıdaki komutlar olduğu gibi işe yarar. Eğitim, AMD GPU'lerde kernels-community/aiter-flash-attn dikkat çekirdeğini, NVIDIA Blackwell GPU'lerde kernels-community/flash-attn4 ve diğer NVIDIA GPU'lerde kernels-community/flash-attn3 kullanır; tümü kernels kütüphanesi tarafından Hub'dan indirilir. Dikkat logitlerini sınırlayan (attn_logit_softcapping) modeller, örneğin Gemma 2, AMD GPU'lerde veya NVIDIA Blackwell GPU'lerde desteklenmez.
Görüntü-dil modelleri
Görüntü-dil modelleri (Qwen3.5, Qwen3.6, Qwen3-VL, …) sadece metin veri kümelerinde eğitilebilir. Model kimliğini normalde olduğu gibi iletin; başka hiçbir değişiklik gerekmez:
CUDA_VISIBLE_DEVICES=0 VLLM_SERVER_DEV_MODE=1 vllm serve Qwen/Qwen3.5-2B \
--max-model-len 4096 \
--logprobs-mode processed_logprobs \
--api-server-count 8 \
--weight-transfer-config '{"backend":"nccl"}'Görüntü kulesi dondurulmuştur. Sadece metin içeren bir veri seti asla görüntü jetonları üretmez, bu nedenle kule ileri geçiş tarafından asla kullanılmaz. Metin kulesinin dışındaki her şey (görüntü kulesi, çok modlu projeksiyoncu) için requires_grad=False değerine sahiptir: gradyan ve optimizör durumu almaz ve ağırlık senkronizasyonu onu tamamen atlar — sunucu, kontrol noktasından yüklediği değerleri korur. Kule yine de yüklendiği için ağırlıkları için GPU belleği maliyeti oluşturur.
Görseller henüz desteklenmiyor. Görsel içeren istemler, vLLM sunucusuna veya eğitim ileri geçişine iletilmez. Çok modlu eğitim, görsel ızgarasından 3B M-RoPE konumlarını oluşturmak için dolgu olmadan paketleme yoluna da ihtiyaç duyar; bu yol burada uygulanmamıştır.
Top-k ve top-p örneklemesi
Top-k ve top-p, örneklem dağılımını tüm sözlük yerine kısıtlı bir aday kümesi üzerinde yeniden normalize eder. Sunucunun log-olasılıkları bunu yansıtır (--logprobs-mode processed_logprobs), bu nedenle eğitimcinin de aynı küme üzerinde normalize etmesi gerekir; aksi halde tüm önem oranları yanlı olur: bir token’ın tüm sözlük altındaki olasılığı, aslında çekildiği aday kümesi altındaki olasılıktan daha düşüktür (DeepSeek-V3.2, bölüm 3.1). top_p < 1 veya top_k > 0 durumunda, işçi her örneklenen token için sunucudan aday kümesini ister ve eğitimci log-olasılıkları bu küme üzerinde yeniden normalize eder. Bunun için iki ek sunucu bayrağı gerekir ve vLLM aday kümesinin boyutunu bununla sınırladığı için top_k ayarlanmalıdır:
CUDA_VISIBLE_DEVICES=0 VLLM_SERVER_DEV_MODE=1 vllm serve Qwen/Qwen3-4B \
--max-model-len 4096 \
--logprobs-mode processed_logprobs \
--api-server-count 8 \
--weight-transfer-config '{"backend":"nccl"}' \
--return-sampling-mask \
--enable-scale-outconfig = AsyncGRPOConfig(top_p=0.95, top_k=512)--return-sampling-mask, vLLM'nin aday kümesini (vLLM 0.28 veya üzeri, V2 model runner'ında: sunucu bayrağı reddediyorsa VLLM_USE_V2_MODEL_RUNNER=1) kaydetmesini sağlar; --enable-scale-out, bu kümeyi döndüren token-in-token-out uç noktasını açığa çıkarır. İşçi, başlarken sunucuda her iki ayarı da kontrol eder. Eski bir vLLM bu kümeyi döndüremediğinden, eğitimci tüm sözlük üzerinde normalleştirmeye devam eder ve yanlı orana dair bir uyarı verir.
Puan ortalaması
Sunucunun log-olasılıkları eğitimcinin (trainer) log-olasılıklarıyla asla birebir eşleşmez: farklı çekirdekler (kernels), farklı bir hassasiyet, birkaç adım geride kalmış bir politika. Önem ağırlıkları (importance weights) tek başına bunu düzeltmez, çünkü örneklenen bir token'ın örnekleyici altında sıfıra ortalama olmaz, bu yüzden her güncelleme politikanın örnekleyiciye doğru çekilmesine de neden olur (Skor merkezleme). Varsayılan olarak eğitimci, her konumda bu beklentiyi çıkarır (score_centering=True), örnekleyicinin num_sampler_logprobs en olası token'ları üzerinde tahmin edilir ve örnekleyiciye göre önem oranı dışarıda kalan token'lar düşürülür [vllm_importance_sampling_clip_min, vllm_importance_sampling_clip_max]. Bunun için worker, sunucudan üretilen her token'ın üst log-olasılıklarını ister ve bunları token başına serialize eder: büyük bir num_sampler_logprobs sunucuyu yavaşlatır ve onun --max-logprobs kabul ettiği sınırı belirler. score_centering=False sadece kırpılmış amaç fonksiyonuyla (clipped objective) eğitim yapar. sampling/masked_mean sınırların düşürdüğü token'ların oranıdır ve sampling/sampler_mass de üst token'larla kapsanan örnekleyicinin (sampler) olasılık kütlesidir.
En yüksek log-olasılıkların (log-probabilities) seri hale getirilmesi, vLLM API sunucusunda CPU işidir ve varsayılan tek API sunucusuyla
num_sampler_logprobs=8değeri, üretim (generation) verimliliğini yarıya indirir. vLLM 0.32 veya üzeri sürümlerde sunucuyu--api-server-count 8bayrağıyla başlatın: tek bir H100 üzerinde 1,5B ile 7B parametreli modellerde ölçüldüğünde, en yüksek 8 log-olasılık bu durumda üretim verimliliğinin %3'ünden azına mal oluyor. vLLM 0.31'de aynı bayrak hâlâ %20 ile %40 arasında bir kayba yol açıyor; bu sorun vllm-project/vllm#58181 ile yamalandı.
LoRA
Tam model yerine bir LoRA adaptörü eğitmek için peft_config geçin:
from peft import LoraConfig
trainer = AsyncGRPOTrainer(
model="Qwen/Qwen3-4B",
reward_funcs=reward_len,
train_dataset=dataset,
peft_config=LoraConfig(r=32, lora_alpha=64, target_modules="all-linear"),
)Her ağırlık senkronizasyonunda güncellenmiş politika sunucuya iletilmelidir. Varsayılan olarak eğitimci, adaptörü temel modele birleştirir ve tam birleşik ağırlıkları gönderir; bu, 7B'lik bir model için her senkronizasyonda yaklaşık 15 GB'dır. vLLM sunucusunu --enable-lora ile başlatırsanız, bunun yerine yalnızca adaptör gönderilir; r=32 için yaklaşık 160 MB'dır:
CUDA_VISIBLE_DEVICES=0 VLLM_SERVER_DEV_MODE=1 VLLM_ALLOW_RUNTIME_LORA_UPDATING=1 vllm serve Qwen/Qwen3-4B \
--max-model-len 4096 \
--logprobs-mode processed_logprobs \
--api-server-count 8 \
--weight-transfer-config '{"backend":"nccl"}' \
--enable-lora \
--max-lora-rank 32 \
--max-loras 6VLLM_ALLOW_RUNTIME_LORA_UPDATING=1, eğitimcinin her yeni adaptörü gönderdiği uç noktayı açığa çıkarır. --enable-lora kullanılsa bile --weight-transfer-config parametresini koruyun: eğitimci yalnızca başlangıçta bir senkronizasyon modu seçer ve bu noktada sunucu zaten çalışır durumdadır; birleşik senkronizasyon ise yedek çözümdür.
--max-lora-rank, 1, 8, 16, 32, 64, 128, 256, 320, 512 değerlerinden biri olmalıdır. Sunucunun sunabileceği en yüksek rankı belirler, sunacağı rankı değil; bu nedenle r=4 adaptörü 8 altında sorunsuz çalışır. --max-loras, en az max_staleness + 2 olmalıdır: eğitimci, eski bir politika altında başlayan bir rollout'un ortada politika değiştirmek yerine o politika altında tamamlanabilmesi için max_staleness + 1 adaptör sürümünü kayıtlı tutar ve her senkronizasyonda en eski sürümü boşaltmadan önce bir sonraki sürümü yükler. Eğitimci, başlangıçta her iki değeri de kontrol eder ve sunucuyu hangi değerlerle yeniden başlatacağınızı belirtir.
vLLM, adaptörleri ağ üzerinden değil diskten yüklediği için eğitimci, her sürümü <output_dir>/.vllm_lora/ altında yazar ve sunucuya yolu verir. Sunucu farklı bir makinede çalışıyorsa, bu dizinin her ikisinin de görebildiği bir dosya sisteminde bulunması gerekir.
<output_dir>/.vllm_lora/bir sunum önbelleğidir, eğittiğiniz adaptörün saklandığı yer değildir. Yalnızca en son sürümleri barındırır ve her biri, güncellik penceresinden düştükten kısa süre sonra silinir. Adaptörünüzü koruyan şey checkpoint'lerdir, bu nedenle onları kapatmayın:save_strategy="no"ile saatler süren bir çalıştırma biter ve arkasında hiçbir şey bırakmaz.output_dir'ın sunucu tarafından okunabilir olması ve işin ömründen uzun süre var olması gerekir; bu nedenle, yavaş bir paylaşımlı dosya sisteminden senkronizasyonları uzak tutsa bile düğüm yerel geçici alanı işe yaramaz.
Adapter senkronizasyonu her zaman daha hızlı değildir. vLLM, birleşik ağırlıklar yerine bir LoRA adaptörü sunarken token başına yaklaşık 1.33–1.39x daha yavaş üretim yapar ve üretim genellikle RL'de duvar saati süresini belirleyen ana faktördür. Buna karşılık, her senkronizasyonda çok daha kısa bir duraklama ve senkronizasyon bant genişliğinin yaklaşık %1'i elde edilir. Üretim verimliliği darboğazınızsa, birleşik senkronizasyon genellikle hâlâ daha iyi bir seçimdir.
Rollout döngüsünü özelleştirme
Üretim, ödül, avantaj ve filtreleme işlemleri experimental.async_grpo.AsyncRolloutLoop içindeki rollout sürecinde çalışır. Bunlardan birini değiştirmek için döngünün bir alt sınıfını oluşturup ilgili adımın metodunu geçersiz kılın ve bu alt sınıfı bir trainer alt sınıfında loop_cls olarak ayarlayın. Trainer’ın yapıcısı değişmez.
| Yöntem | Çağrıldı | Varsayılan |
|---|---|---|
filter_prompt(row_index, row, epoch) | her istem başına, üretimden önce | her istemi kabul eder |
generate_one(prompt, tools, group_id) | her rollout başına bir kez | çok turlu araç döngüsü |
generate_one_turn(prompt_ids) | örnekleme isteği başına bir kez | yapılandırmanın örnek alma ayarlarıyla tek bir vLLM isteği |
compute_advantages(group) | her grup için bir kez, ödüller group.rewards içine toplanır toplanmaz | grupta standartlaştırılmış ödül |
setup(), close() | döngülerin ne zaman başlayıp duracağı | hiçbir şey |
Örneğin, politikanın zaten çözdüğü istemleri örneklemeyi durduran bir müfredat, eşiği bir yapılandırma alt sınıfında tanımlanır:
from dataclasses import dataclass
import numpy as np
from trl.experimental.async_grpo import AsyncGRPOConfig, AsyncGRPOTrainer, AsyncRolloutLoop
@dataclass
class CurriculumConfig(AsyncGRPOConfig):
pass_rate_cap: float = 0.9
class CurriculumRolloutLoop(AsyncRolloutLoop):
def filter_prompt(self, row_index, row, epoch):
return self.pass_rates.get(row_index, 0.0) < self.config.pass_rate_cap
async def setup(self):
self.pass_rates = {}
def compute_advantages(self, group):
scored = group.rewards[~np.isnan(group.rewards)]
if len(scored):
self.pass_rates[group.row_index] = float(np.mean(scored > 0))
return super().compute_advantages(group)
class CurriculumTrainer(AsyncGRPOTrainer):
loop_cls = CurriculumRolloutLoopÖdüller, reward_funcs, get_reward tanımlayan ortamlar ve özel bir generate_one'ün experimental.async_grpo.Rollout üzerinde ayarladığı reward üzerinden toplanır: bir yargıçla puanlamak için asenkron bir ödül fonksiyonu iletin veya puanlamayı generate_one içinde yapın. compute_advantages, puanlanan ödüllerinin tümü eşit olduğu için daha sonra atılan gruplar dahil olmak üzere her grup için çalışır; atma işlemi avantajlara değil, ödüllere bakar. Döngü, türetilmiş bir süreçte oluşturulduğundan, alt sınıfı modül düzeyinde tanımlayın. İstemcileri, döngünün olay döngüsünde çalışan setup içinde oluşturun; bunun yerine __init__'i geçersiz kılmayın. filter_prompt tarafından reddedilen bir istem, atılan bir grup gibi o çağ için atlanır ve ona sayılır. Bir çağdaki tüm istemleri reddederse döngü bir hata fırlatır.
Tasarım felsefesi
Bu eğitimci bilinçli olarak minimal tutulmuş olup genel amaçlı bir çözüme dönüşmesi hedeflenmemektedir. Desteklenmeyen bir özelliğe ihtiyacınız varsa, depoyu klonlayıp eğitimciyi doğrudan ihtiyaçlarınıza göre uyarlamanızı öneririz. Yeni özellikler yalnızca anlamlı bir topluluk talebi olduğunda değerlendirilecektir.
Kaydedilen metrikler
Bir rollout, bir gradyan haline gelmeden önce birkaç aşamadan geçer. Önce bir prompttan nihai batch kompozisyonumuza kadar olan farklı aşamalara bir bakalım:
Dataset row = PROMPT (message list + reward kwargs)
└─ GROUP (1 prompt, `num_generations` rollouts, 1 advantage baseline)
└─ ROLLOUT (1 conversation, keyed by `rollout_id`)
├─ TURN (1 vLLM /v1/completions call + tool messages fed back)
│ └─ TurnRecord (prompt_ids, output_ids, output_log_probs)
└─ reconcile (`_chain_to_sequences` classifies drift per turn: CLEAN/REALIGN/FORK)
└─ SEQUENCE (≥1 per rollout; new one per fork; dropped if no trained token)
└─ SAMPLE (Sequence + group advantage + reward + metrics)
════════════ Trainer process boundary: `rollout_buffer` (mp.Queue) ════════════
└─ SAMPLE (Pulled 1 at a time; dropped if staleness > `max_staleness`)
└─ ROW (Planner inserts it into one of `dp` prefix tries, attention-cost-balanced)
└─ MICRO-BATCH (`dp` rows, one per rank)
└─ PACKED ROW (Collator lays each trie out: unique tokens, depth as `position_ids`)
└─ FORWARD (`compute_loss`, bs=1, padding stripped, FA3 per trie segment)
└─ OPTIMIZER STEP (from `grad_accum` micro-batches)Üstten alta okunduğunda:
- a group,
num_generationskez üretilen tek bir prompt'tur. Avantaj taban çizgisi bu grubun içinde hesaplanır; bu nedenle puanlanan birim de gruptur. - a rollout tek bir sohbettir. Her tur, tüm mesaj listesini yeniden belirteçlere ayırır (re-tokenize), bu nedenle turlar arasındaki sapma sonunda uzlaştırılmalıdır.
- reconciling, bir rollout'u birden fazla sequence'e fork edebilir; bu nedenle tek bir konuşma birden fazla eğitim örneği üretebilir.
- a örnek, bir dizi ile onun avantajı, ödülü ve metrikleridir. Bu, süreç sınırını geçen şeydir.
- sınırın ötesinde trainer, örnekleri rows (her DP rank için bir tane) olarak planlar, her satırı bir prefix trie içine katlayarak paylaşılan tokenlerin yalnızca bir kez iletilmesini sağlar ve
grad_accummikro-toplu işlemleri tek bir optimizer adımında biriktirir.
Buna göre metriklerimizi, hangi aşamanın (veya varlığın) hakkında olduklarına göre bölüyoruz:
| namespace | saydığı varlık |
|---|---|
rollout/ | bir tam konuşmayı temsil eder: turları, dallanmaları, üretiminin ne kadar sürdüğü |
completions/ | modelin (vLLM) bir istem için ürettiği çıktı |
tools/ | araç çağrıları metrikleri |
sample/ | kuyrukta geldiği haliyle tek bir eğitim örneğini temsil eder |
batch/ | bir mikro-toplu (micro-batch) veya bir optimizör adımı (bir veya birden fazla örnekten oluşturulur) |
perf/ | ölçülen saniyeler ve FLOP |
sampling/ | eğitilen politikanın, token'ları üreten örnekleyiciden ne kadar uzakta olduğunu |
Token metriklerinin belirsizliğini gidermek için bazı terimleri de tanımlayalım:
- oluşturulan jetonlar, modelin ürettiği jetonlardır (
completions/*). - forwarded jetonlar, forward geçişinin işlediği tüm jetonlardır: istem, varsa araç sonuçları ve üretilen jetonlar.
- trained tokenlar,
completion_mask == 1olan alt kümedir ve kayıp bu alt küme üzerinden hesaplanır. Örneğin, bir fork veya realign işlemi, zaten üretilmiş tokenları bağlama (context) olarak düşürebilir; bu nedenle trained ≠ generated.
Toplu işlem numaralarının nasıl oluşturulduğu
satır, tek bir DP rank'ın tek bir mikro-batch'te ileriye aktardığı şeydir: tek bir prefix forest'a paketlenmiş birkaç örnek, böylece paylaştıkları tokenlar yalnızca bir kez ileriye aktarılır — bkz. Tree packing. Planlayıcı, örneklerin hangi satıra yerleştirileceğini belirler (dikkat maliyetini dengeleyerek hiçbir rank'ın geride kalmamasını sağlar) ve paklemeyi bir veri toplayıcı (data collator) gerçekleştirir.
Tüm metriklerimizde “step” her zaman TAM bir optimizer adımını ifade eder, asla bir micro-batch değildir. gradient_accumulation_steps micro-batch bir adım oluşturur ve _per_step adlı her metrik, global_step, logging_steps ve Trainer sözlüğünün geri kalanıyla uyumlu şekilde optimizer başına adımı temsil eder. Bir metrik micro-batch başına ise bu açıkça belirtilir (batch/microbatches_per_step) ya da satır başına bir büyüklüktür (batch/row_*, batch/samples_per_row).
Dolayısıyla bir adım, sabit sayıda row-slots içerir:
row-slots per step = gradient_accumulation_steps x world_sizebu da parti metriklerinin birbirleriyle karşılaştırılabileceğiniz bir merdiven oluşturmasını sağlar:
sample sample/forwarded_tokens_mean
└─ packed into a ROW batch/samples_per_row, batch/row_tokens_mean
└─ one row per DP rank = one micro-batch
└─ gradient_accumulation_steps micro-batches = one STEP
batch/samples_per_step, batch/forwarded_tokens_per_stepDolayısıyla batch/samples_per_step ≈ row-slots x batch/samples_per_row ve aynı mantık token'lar için de geçerlidir. İki taraf yalnızca adım içindeki mikro-partiler arasındaki değişkenliğe kadar eşleşir — adım başına metrikler toplamlar, satır başına olanlar ise ortalamalardır — bu nedenle tam bir eşleşme yerine yüzde birin kesri kadar bir sapma bekleyin.
batch/row_fill_frac, örnekler uzun olduğunda dikkat edilmesi gereken metriktir: 10k token'lık bir örnek, 32k bütçesini kötü bir şekilde doldurur (üçü sığar, dördü asla sığmaz, bu yüzden paketleyici genellikle ikisini alır ve satır ~%77 dolu kalır), oysa 1k token'lık örnekler onu neredeyse mükemmel bir şekilde doldurur. Bu bir hata değil, kuantizasyondur ve token_budget ayarlanabilir parametredir — her dizide dikkat (attention) O(L²) olduğundan, uzun dizilerden oluşan daha dolu bir satırın bellek maliyetinin doğrusal olarak artmadığını göz önünde bulundurmak gerekir.
Ağaç paketleme
Bir satır, bir prefix trie'dir, birleştirme değildir: birden fazla örnek tarafından paylaşılan bir token yalnızca bir kez iletilir ve dikkat mekanizması her örneğe yalnızca kendi geçmişini gösterir. Tek bir istemcinin (prompt) tüm rollout'ları bu istemciyi tekrarlar ve çok turlu bir rollout'un her turu sohbeti yeniden gönderir, bu da dekodlayıcının iş yükünü packing oranı (ham tokenlar ÷ iletilen tokenlar) kadar azaltır. Bu yalnızca bir yerleşim değişikliğidir: her eğitim tokenı kendi hedefini, avantajını ve eski log-olasılığını korur ve log-olasılığı, örneğin tek başına iletilmesiyle eşleşir.
Nerede gerçekleşir:
planner TreeRow.add the trie grows sample by sample; a sample is priced by its novel tokens
│ (TreeRow.fits), so `token_budget` bounds unique tokens, not raw ones
collator TreeRow.pack DFS layout: unique tokens, depth as position_ids, one loss term per
│ original trained token (token_index), and per segment its queries and
│ the K/V indices of its root-to-segment path, all built on CPU
attention tree_attention gather K/V along the paths, one FA3 varlen call, causalBir istemin iki dağıtımında nasıl çalıştığı:
1. Rollouts r0: p1 p2 p3 a1 a2
r1: p1 p2 p3 b1 b2 10 raw tokens
2. Trie (one per row) S0 [p1 p2] ─┬─ S1 [p3 a1 a2] nodes are keyed on (token, next token),
└─ S2 [p3 b1 b2] so the fork happens one token early and
every node predicts exactly one token;
chains without a fork become segments
3. Packed row idx 0 1 | 2 3 4 | 5 6 7
(DFS order) input_ids p1 p2 | p3 a1 a2 | p3 b1 b2 8 tokens: MLPs, norms and projections
position_ids 0 1 | 2 3 4 | 2 3 4 run once per unique token
segment S0 | S1 | S2
4. Attention seg queries K/V gathered kv_index
(one FA3 call) S0 [p1 p2] [p1 p2] 0 1
S1 [p3 a1 a2] [p1 p2 | p3 a1 a2] 0 1 2 3 4
S2 [p3 b1 b2] [p1 p2 | p3 b1 b2] 0 1 5 6 7
FA3 aligns the causal mask bottom-right K: p1 p2 p3 a1 a2
when queries are fewer than keys, so a Q: p3 ■ ■ ■ · ·
segment's queries see their ancestors and a1 ■ ■ ■ ■ ·
their own causal past, and nothing else. a2 ■ ■ ■ ■ ■
5. Loss p2 (idx 1) predicts p3 for both rollouts; token_index points every trained
token of every rollout at the position that predicts itBirkaç sonuç:
- Ortak bir önek paylaşıldığında: bir istemin (prompt) rollout'ları ve istemler arasında ortak bir sistem istemi veya araç şeması. Planlayıcı, örneklemeyi, istemi zaten bulunan ve
group_id'sini tutan satıra gönderir. Bu satır dolduğunda, örneklemeye bir sıra hâlâ boşsa veya en yüklü satırı artırmıyorsa başka bir satıra gider; bu durum mikro-topluğun (micro-batch) süresini belirler; aksi halde mikro-topluğun kapanması sağlanır. - Paylaşılan hiçbir şey düz paketleme değildir: her örnek, yolu kendisi olan tek bir segmenttir; bu da sıradan, dolgu içermeyen FA3 varlen paketlemesidir.
- Sadece K/V kopyalanır: paylaşılan önek, her torun segmenti için bir kez toplanır; bu, paketlenmemiş eğitimin tuttuğuyla yaklaşık aynıdır ve GQA ile küçük kalır.
- Gated DeltaNet hibritleri desteklenir (Qwen3.5, Qwen3.6, Qwen3-Next, …): bunların konvolüsyonu her token’ın kendi öncüllerini okur ve parçalı delta kuralı her segmenti ebeveyninin son durumundan başlatır (
trl/experimental/async_grpo/tree_gated_delta_rule.py). Bunun için, bu katmanların ağaç paketleme yamalarının değiştirdiği modül düzeyindeki fonksiyonları çağırdığıtransformers>=5.15.0sürümü gereklidir. Dikkat dışındaki başka herhangi bir katmana sahip modeller başlatma sırasında reddedilir.
Ne sağlar: hiçbir şey paylaşılmadığında, düz padding'siz paketleme hızında çalışır ve hızlanma, paketleme oranıyla yaklaşık olarak artar (Qwen3-0.6B/1.7B, H100 üzerinde 3.4 oranında yaklaşık 2.8–3x). Oran, paylaşılan önek × satır başına örnek sayısıdır, bu nedenle batch/samples_per_row birincil göstergedir: 1'e yakınsa hiçbir şey paylaşılamaz ve kaldıraç token_budget'tır.
Tüketim üzerinden değerlendirin, batch/trained_tokens_per_step / perf/fwd_bwd_s. Paketlenmiş bir mikro-toplu işlem daha fazla örnek içerdiğinden perf/fwd_bwd_s artar ve ileri yönlendirilen tokenlara bölünen perf/mfu_* düşer — bunların hiçbiri bir gerileme değildir. Satır başına daha fazla örnek, adım başına daha fazla rollout çekildiği anlamına da gelir, bu da üretim kısıtlı bir çalışmayı daha da öyle yapar.
Satırları uzatan veya azaltan her şey paylaşımı kaldırır. Önce
fork_threshold_tokensdeğerini kontrol edin: bir tur, yeniden tokenizasyon kayması bu kadar token olduğunda ancak kendi satırına ayrılır ve ajan tabanlı kayma genellikle varsayılan1024değerine karşı onlarca token olduğundan hiçbir tur ayrılmaz ve bir sohbet, rank başına tek satıra çöker.rollout/fork_frachangi rejimde olduğunuzu belirtir.
Rollout kuyruğu
Worker, puanlanmış örnekleri bir kuyruğa iter ve trainer ondan çeker. Bu tek kuyruğu dört metrik tanımlar ve farklı sorulara yanıt verir:
| metrik | question |
|---|---|
sample/rollout_queue_size | şu anda bekleyen örnek sayısı |
sample/time_in_queue_s | eğitilmeden önce tek bir örnek orada ne kadar süre bekledi — politika dışı olmasının saniye yarısı |
perf/rollout_wait_s | kuyruk boş olduğu için eğitim ne kadar süre boyunca engellenmiş olarak kaldı |
rollout/backpressure_s | kuyruk dolu olduğu için üretim (işçi) ne kadar süre boyunca engellenmiş bekledi |
Son iki metrik (perf/rollout_wait_s ve rollout/backpressure_s) birbirinin aynasıdır ve asla aynı anda büyük olmaz! Bunları kuyruk boyutuyla birlikte okuyarak darboğazın hangi tarafta olduğunu anlarsınız:
- kuyruk neredeyse boş,
perf/rollout_wait_syüksek → üretim kısıtlı. Eğitmen aç kalıyor;rollout/generated_tok_s,rollout/concurrencyverollout/score_queue_sizedeğerlerine bakın. - kuyruk neredeyse dolu,
rollout/backpressure_syüksek → trainer-bound. Üretim kısıtlanıyor ve çıktısı kuyrukta bekliyor, bu yüzdensample/staleness_meandeğerinin yükseldiğini izleyin. - her ikisi de sıfıra yakın → dengeli!
Tamamlamalar
Bir completion, rollout'un tüm turlarında sayılan, vLLM'in bir prompt için ürettiğidir.
| metrik | anlam |
|---|---|
completions/mean_length | rollout başına üretilen token sayısı, tüm turlar üzerinde ortalama |
completions/min_length, completions/max_length | penceredeki en kısa ve en uzun rollout |
completions/clipped_ratio | son turu EOS ile bitmeyen, yani max_completion_length tarafından kesilen rollout'ların oranı. |
Rollout'lar
Bir rollout, tek bir tam konuşmadır: oraya ulaşmak için yapılan her araç gidiş-dönüşü dahil olmak üzere, tamamlanana kadar üretilen bir istemdir. num_generations rollout aynı istemi paylaşır ve bir grup oluşturur.
| metrik | anlam |
|---|---|
rollout/duration_s | bir rollout için duvar saati süresi, dağıtım (dispatch) anından döngünün tamamlanan rollout'u toplamasına kadar. |
rollout/generated_tok_s | son aralık boyunca (pencereleme yapılarak) üretim verimi, böylece bir duraksama görünür |
rollout/concurrency | vLLM'ye uçuştaki rollouts. |
rollout/turns_mean, rollout/turns_max | sohbet başına ortalama ve maksimum tur sayısı |
rollout/samples_per_rollout | sohbet başına üretilen örnek sayısı. 1.0, dallanma (forking) gerçekleşmediği anlamına gelir; (<1.0, bazı sohbetlerin hiç eğitilebilir örnek üretmediği anlamına gelir) |
rollout/fork_frac, rollout/realign_frac | her tur sınırında yeniden jetonlaştırma sapmasının nasıl sınıflandırıldığı |
rollout/drift_tokens_mean, rollout/drift_tokens_max | Bir turun yeniden tokenizasyonuyla geçersiz kılınan tutulan token sayısını karşılaştırın fork_threshold_tokens |
rollout/score_queue_size | puanlanmayı bekleyen tamamlanmış gruplar. |
rollout/score_s, rollout/score_wait_s, rollout/score_block_s | scoring: bir grubun puanlanma süresi, puanlanmak için bekleyen grup bekleme süresi ve puanlama kuyruğunun dolu olması nedeniyle üretimin ne kadar süre engellendiği |
rollout/vllm_retry_total | yeniden denenen vLLM istekleri. Bozulmuş bir sunucu, aksi takdirde açıklanamayan yavaşlık gibi görünür. Bu, istekleri sunucuya değil de üretilen metne göre saydığı için completions/ altında değil de burada yer alır: yeniden denenmiş bir istek hiç tamamlama üretmemiştir |
rollout/backpressure_s | rollout kuyruğu dolu olduğu için üretimin ne kadar süre engellendiğini gösterir. rollout kuyruğu hakkında bilgi için bkz. |
rollout/concurrency_cap | Uçuştaki rollout'lar için geçerli üst sınır. KV cache tokens / max_model_len (en fazla max_concurrent_rollouts) ile başlar ve vLLM yüküne göre değişir. eşzamanlılık bölümüne bakın. |
rollout/kv_cache_usage | vLLM KV önbellek kullanımı (motorlar üzerindeki maksimum) son sorgulama anında. Üst sınır, 0,8'i aştığında kesilir ve 0,6'nın altında kaldığı sürece büyür |
rollout/vllm_running_requests | sunucunun motorlarının çözümlediği istekler (vLLM'in num_requests_running değeri, motorlar üzerinden toplanmış). rollout/concurrency ile arasındaki fark, yanıtları oluşturan API sunucu sürecinde bekleyen isteklerdir |
rollout/vllm_queued_requests | sunucunun kabul etmiş ancak henüz zamanlamamış olduğu istekler (motorlar üzerinden toplanan vLLM'in num_requests_waiting değeri). Bu değer sıfırdan farklıyken üst sınır artmaz |
rollout/vllm_preemptions_total | Sunucunun, günlük kaydı penceresi sırasında önceliği kesilen istekleri (vLLM'in num_preemptions_total değeri, motorlar üzerinden toplanmış) belirtir. Yalnızca raporlanır: bir ağırlık senkronizasyonu sunucunun önbelleklerini sıfırlar ve bu da çalışan tüm isteklerin önceliğini keser; bu nedenle bir baskı sinyali değildir. |
frac_reward_zero_std, reward_kept | grupların, puanlanan tüm ödül eşit olduğu veya puanlanabilir rollout sayısının ikiden az olduğu için atılma oranı (GRPO yalnızca ilk durumu sayar) ve eğitim yapılan grupların ortalama ödülü. reward, atılanlar dahil olmak üzere puanlanan her grup için politikanın ödülüdür, bu nedenle izlenmesi gereken metrik budur |
Tüm rollout'ları aynı ödülü almış (veya bunlardan ikiden azı puanlanabilir olmuş) bir grup kuyruğa eklenmek yerine düşürülür: varsayılan avantajlarla her yerde sıfır avantaja sahiptir, bu nedenle bir ileri ve geri geçiş maliyeti oluşturur ve hiçbir şeyi değiştirmez. Batch etkilenmez, hâlâ tutulan gruplardan samples_per_step değerini doldurur, bu yüzden birçok grup düşürüldüğünde bir adım daha fazla üretim gerektirir. Düşürülen bir grup yine de bir epoch'a sayılır; epoch, prompt'lar üzerinde tek bir geçiş olarak kalır.
Araçlar
Yalnızca model araçları çalıştırdığında kaydedilir. tools/<name>/*, rewards/<func>/*'in ödül fonksiyonu başına tekrarlandığı gibi, araç adı başına tekrarlanır; çünkü başarısız olan tek bir araç, tümünün ortalamasında görünmez. Yerleşik araç döngüsü ve OpenEnv harness eğitimcisi (HarnessAsyncGRPOTrainer, bkz. harness'lerde eğitim) aynı adları kaydettiğinden, tek bir panoda her ikisi de okunabilir; path sütunu, her metriğin hangi bileşen tarafından üretildiğini belirtir.
| metrik | path | anlam |
|---|---|---|
tools/call_frequency, tools/failure_frequency | yerleşik, test çerçevesi | rollout başına çağrı sayısı ve başarısız olanların oranı. Döngüyü yöneten test platformu yolunda bir başarısızlık, metni bir hataya benzeyen bir araç sonucudur |
tools/latency_s, tools/<name>/latency_s | yerleşik, beyaz kutu test çerçevesi | aracı çalıştırırken harcanan süre. Beyaz kutu test düzeneği yolunda, bir model turunun yanıtı ile bir sonraki turun isteği arasındaki duvar saati süresidir ve bu süre, test düzeneği ek yükünü de içerir. Döngü sahibi yolun gecikmesi yoktur: OpenEnv izi, girdilerini zaman damgası ile işaretlemediğinden, bu sürenin türetilebileceği bir veri bulunmamaktadır. |
tools/<name>/call_total, tools/<name>/failure_total | yerleşik, test çerçevesi | araç başına çağrı ve hata sayıları |
tools/unknown_name_total | yerleşik | model, çalıştırıldığında hata fırlatan bir araçtan farklı olarak, var olmayan bir araç istedi: bir politika hatasını izler |
tools/parallel_calls_mean | yerleşik | tek bir asistan mesajında istenen araç çağrıları |
tools/loop_exhausted_frac | yerleşik | Araçlar için hâlâ istekte bulunurken max_tool_calling_iterations'de kesilen konuşmalar |
Ortamlar
Yalnızca bir environment_factory ile kaydedilir. Her iki çağrı da işçinin araç iş parçacığı havuzunda (tool thread pool) çalıştığından, yavaş bir ortam yalnızca kendi rollout'unu geciktirir, uçuştaki diğerlerini değil.
| metrik | anlam |
|---|---|
env/reset_s | rollout başlamadan önce reset() içinde geçen süre |
env/reward_s | rollout bittikten sonra get_reward() içinde geçen süre |
Kuyruktan gelen örnekler
Her örnek bir RolloutSample'dır: bir gruptaki her nesil tamamlandıktan ve puanlandıktan sonra, _score_group içindeki işçi tarafından birleştirilen hizalanmış dizi, grup avantajı, ödül ve örnek başına metrikler. İşçi bunları rollout_buffer'a iter; aşağıdaki her şey, eğitim için bunları çekerken eğitimci tarafında ölçülür.
| metrik | anlam |
|---|---|
sample/forwarded_tokens_mean, sample/forwarded_tokens_max | bir örnekteki tokenler: prompt + araç bağlamı + üretilen. Paketleme satır düzeyinde bir konudur, bkz. batch/row_* |
sample/trained_tokens_mean | bunlardan kaçının üzerinde kayıp alınır |
sample/rollout_queue_size | kuyrukta bekleyen puanlanmış örnekler |
sample/time_in_queue_s | Bu örneğin eğitimden önce o kuyrukta ne kadar süre beklediğini gösterir. perf/rollout_wait_s ile aynı değildir — bkz. rollout kuyruğu |
sample/staleness_mean, sample/staleness_max | veri ne kadar policy sürümü gerisinde olduğunu gösterir. sampling/importance_sampling_ratio/* ve sampling/sampling_logp_difference/*, off-policy olmanın kayıp üzerindeki etkisini gösterir; bu ise nedeni gösterir |
sample/dropped_stale_total | max_staleness değerini aşan örnekler düşürüldü |
Ödüller ve politika dışılık
| metrik | anlam |
|---|---|
reward_group_std | Her örneğin grubu içinde ödülün standart sapması, eğitimde kullanılan örnekler üzerinden ortalama alınmıştır. Varsayılan compute_advantages bununla böler. GRPO’nun reward_std değeri ise tüm batch üzerinden hesaplanan standart sapmadır, farklı bir büyüklüktür: hepsi 1 olan kolay promptlardan ve hepsi 0 olan zor promptlardan oluşan bir batch’in batch standart sapması 0.5 iken grup standart sapması 0’dır. |
rewards/<func>/mean, rewards/<func>/group_std | her ödül fonksiyonunun ortalaması ve her örneğin grubu içindeki standart sapması, eğitimde kullanılan örnekler üzerinden ortalaması alınmıştır. GRPO’nun rewards/<func>/mean değeri, batch içindeki üretilen tüm tamamlamalar üzerinden hesaplanır ve rewards/<func>/std değeri batch üzerinden hesaplanan standart sapmadır |
sampling/importance_sampling_ratio/mean, /min, /max | π_θ / π_sampler tamamlama başına token, burada π_sampler onu üreten vLLM politikasıdır. Sadece eğitim/çalıştırma uyumsuzluğunu değil, eskimeyi de içerir |
sampling/sampling_logp_difference/mean, /max | tamamlama başına \|log π_θ − log π_sampler\| |
num_tokens | eğitimin başlangıcından bu yana iletilen token sayısı. Ağaç paketleme ile, birden fazla örnek tarafından paylaşılan bir önek bir kez sayılır |
Partiler
Bir mikro-batch world_size satırdır (paketleme, düzleştirme ile 1 diziye indirger), bu nedenle her DP rank'ı için bir tane olur ve i rank'ı i satırını iletir. Bunların gradient_accumulation_steps adedi bir optimizör adımı oluşturur. Bir adım, toplamda gradient_accumulation_steps × world_size satırı kapsar. Aşağıdaki her _per_step metriği, tüm adım ve tüm rank'lar üzerinden bir toplamdır; batch/row_* olanlar ise satırlar üzerinden ortalama değerlerdir.
| metrik | anlam |
|---|---|
batch/forwarded_tokens_per_step, batch/trained_tokens_per_step | bir optimizör adımındaki tokenler, sırasıyla ileriye aktarılan ve eğitilen |
batch/samples_per_step, batch/groups_per_step | eğitim örnekleri ve farklı istemler, optimizasyon adımı başına. Bunlar, dallanma oranına göre farklılık gösterir |
batch/microbatches_per_step | sayıldı, yapılandırmadan okunmadı |
batch/masked_token_frac | completion_mask == 0 olan ileri yönlendirilen tokenler — gradyan kazanmayan ileri yönlendirme payı |
batch/samples_per_row, batch/row_tokens_mean, batch/row_tokens_max | planlayıcının her sıranın satırını ne kadar yoğun paketlediği |
batch/row_fill_frac | row token'ları token_budget ile karşılaştırılır. Düşük, bütçenin kullanılmadığı anlamına gelir |
batch/row_imbalance | Satırlar boyunca max cost / mean cost, burada maliyet satırın dikkat işidir. Bu, gradyan all-reduce işleminde hangi sıranın (rank) duraksadığını tahmin eder. 1.0 mükemmeldir |
batch/packing_ratio | iletilen token başına ham token: decoder'ın iş yükünün küçüldüğü çarpan, hiçbir şey paylaşılmadığında 1.0 |
batch/pad_frac | rütbe arası dolgu. Sadece yayın baytlarına mal olur; ileri yönlü işlem öncesi kaldırılır |
batch/dropped_oversize_total | token_budget aşımı nedeniyle düşürülen örnekler |
Performans
Throughput, eğitimcinin saniyede kaç token işlediğini ölçer. Model FLOPs Utilization (MFU), modelin ileri ve geri geçişleri için kullanılan eğitim cihazlarının teorik hesaplama kapasitesinin yüzdesini tahmin eder. Bu tahmin için kullanılan kapasite, donanıma ve eğitim hassasiyetine bağlıdır.
Throughput ve MFU iki zaman temelinde raporlanır:
_fwd_bwd, ileri ve geri geçişler sırasında performansı ölçer._wall_clock, optimizasyon güncellemelerini, ağırlık senkronizasyonunu ve rollout'lar için harcanan bekleme süresini de içeren tam optimizasyon adımındaki performansı ölçer.
Bu fark, hesaplama performansını bekleme ve koordinasyon maliyetinden ayırt etmeye yardımcı olur. Her iki MFU metriği de yalnızca eğitim cihazlarını açıklar: harici rollout veya öğretmen sunucularının hesaplama veya donanım kapasitesini içermezler. Duvar saati MFU, bu hizmetlerin kendi kullanım oranlarını değil, eğitimcinin bu hizmetleri beklemek için harcadığı süreyi yansıtır.
MFU, seçilen hassasiyette yerel eğitim cihazının tepe hesaplama kapasitesi bilindiğinde raporlanır. Aksi takdirde MFU atlanır; eğitim devam eder ve veri aktarımı ile zamanlama metrikleri kullanılabilir kalır.
| metrik | anlam |
|---|---|
perf/step_s | optimizasyon adımları arasındaki duvar saati: hesaplama, optimizasyon, ağırlık senkronizasyonu ve kuyruk bekleme süreleri dahil |
perf/fwd_bwd_s | forward + backward, adımın mikro-partiler üzerinden toplanmış hali. Aşağıdaki her _fwd_bwd metriğinin paydasıdır |
perf/fwd_s | ön (forward) kısmı. fwd_s / fwd_bwd_s oranının 1/3 civarında olması yaygın bir dağılımdır; daha yüksek olması, geriye yayılımın (backward) ucuz olduğunu ya da yeniden hesaplamanın (recompute) forward sırasında yapıldığını gösterir. |
perf/optimizer_s | optimizer.step() |
perf/rollout_wait_s | kuyruk boş olduğu için trainer'ın ne kadar süre boyunca bloke kaldığı. rollout kuyruğu'na bakın |
perf/weight_sync_s | tam bir senkronizasyon, ayrıca _pause_s (vLLM için bekleme), _barrier_s (rank sapması) ve _transfer_s (baytlar) |
perf/forwarded_tok_s_fwd_bwd, perf/forwarded_tok_s_wall_clock | her bazda saniyede iletilen token sayısı |
perf/trained_tok_s_wall_clock | aynı, yalnızca kaybın gördüğü tokenları sayarak |
perf/mfu_fwd_bwd, perf/mfu_wall_clock | her bazda model FLOPs kullanımı |
AsyncGRPOConfig
sınıf trl.experimental.async_grpo.AsyncGRPOConfig
< source >( output_dir: str | None = Noneper_device_train_batch_size: int = 8num_train_epochs: float = 3.0max_steps: int = -1learning_rate: float = 1e-06lr_scheduler_type: str = 'constant'lr_scheduler_kwargs: dict | str | None = Nonewarmup_steps: float = 0optim: transformers.training_args.OptimizerNames | str = 'adamw_torch_fused'optim_args: str | None = Noneweight_decay: float = 0.0adam_beta1: float = 0.9adam_beta2: float = 0.999adam_epsilon: float = 1e-08optim_target_modules: None | str | list[str] = Nonegradient_accumulation_steps: int = 1average_tokens_across_devices: bool = Truemax_grad_norm: float = 1.0label_smoothing_factor: float = 0.0bf16: bool | None = Nonefp16: bool = Falsebf16_full_eval: bool = Falsefp16_full_eval: bool = Falsetf32: bool | None = Nonegradient_checkpointing: bool = Truegradient_checkpointing_kwargs: dict[str, typing.Any] | str | None = Nonetorch_compile: bool = Falsetorch_compile_backend: str | None = Nonetorch_compile_mode: str | None = Noneuse_liger_kernel: bool = Falseliger_kernel_config: dict[str, bool] | None = Noneuse_cache: bool = Falseneftune_noise_alpha: float | None = Nonetorch_empty_cache_steps: int | None = Noneauto_find_batch_size: bool = Falselogging_strategy: transformers.trainer_utils.IntervalStrategy | str = 'steps'logging_steps: float = 1logging_first_step: bool = Falselog_on_each_node: bool = Truelogging_nan_inf_filter: bool = Trueinclude_num_input_tokens_seen: str | bool = 'no'log_level: str = 'passive'log_level_replica: str = 'warning'disable_tqdm: bool | None = Nonereport_to: None | str | list[str] = 'none'run_name: str | None = Noneproject: str = 'huggingface'trackio_space_id: str | None = Nonetrackio_bucket_id: str | None = Nonetrackio_static_space_id: typing.Union[str, NoneType, typing.Literal[False]] = Noneeval_strategy: transformers.trainer_utils.IntervalStrategy | str = 'no'eval_steps: float | None = Noneeval_delay: float = 0per_device_eval_batch_size: int = 8prediction_loss_only: bool = Falseeval_on_start: bool = Falseeval_do_concat_batches: bool = Trueeval_use_gather_object: bool = Falseeval_accumulation_steps: int | None = Noneinclude_for_metrics: list[str] = <factory>batch_eval_metrics: bool = Falsesave_only_model: bool = Falsesave_strategy: transformers.trainer_utils.SaveStrategy | str = 'steps'save_steps: float = 500save_on_each_node: bool = Falsesave_total_limit: int | None = Noneenable_jit_checkpoint: bool = Falsepush_to_hub: bool = Falsehub_token: str | None = Nonehub_private_repo: bool | None = Nonehub_model_id: str | None = Nonehub_strategy: transformers.trainer_utils.HubStrategy | str = 'every_save'hub_always_push: bool = Falsehub_revision: str | None = Noneload_best_model_at_end: bool = Falsemetric_for_best_model: str | None = Nonegreater_is_better: bool | None = Noneignore_data_skip: bool = Truerestore_callback_states_from_checkpoint: bool = Falsefull_determinism: bool = Falseseed: int = 42data_seed: int | None = Noneuse_cpu: bool = Falseaccelerator_config: dict | str | None = Noneparallelism_config: accelerate.parallelism_config.ParallelismConfig | None = Nonedataloader_drop_last: bool = Falsedataloader_num_workers: int = 0dataloader_pin_memory: bool = Truedataloader_persistent_workers: bool = Falsedataloader_prefetch_factor: int | None = Nonedataloader_multiprocessing_context: str | None = Nonedataloader_in_order: bool = Trueremove_unused_columns: bool = Truelabel_names: list[str] | None = Nonetrain_sampling_strategy: str = 'random'length_column_name: str = 'length'ddp_find_unused_parameters: bool | None = Noneddp_bucket_cap_mb: int | None = Noneddp_broadcast_buffers: bool | None = Noneddp_static_graph: bool | None = Noneddp_backend: str | None = Noneddp_timeout: int = 1800fsdp: str | None = Nonefsdp_config: dict[str, typing.Any] | str | None = Nonedeepspeed: dict | str | None = Nonedebug: str | list[transformers.debug_utils.DebugOption] = ''skip_memory_metrics: bool = Truedo_train: bool = Falsedo_eval: bool = Falsedo_predict: bool = Falseresume_from_checkpoint: str | None = Nonelocal_rank: int = -1model_init_kwargs: dict[str, typing.Any] | str | None = Nonedtype: str = 'float32'trust_remote_code: bool = Falserouter_aux_loss_coef: float | None = Nonenum_generations: int = 8max_completion_length: int = 2048temperature: float = 1.0top_p: float = 1.0top_k: int = 0min_p: float | None = Nonerepetition_penalty: float = 1.0chat_template_kwargs: dict | str | None = Nonemax_tool_calling_iterations: int | None = Nonefork_threshold_tokens: int = 1024vllm_server_base_url: str = 'http://localhost:8000'vllm_server_timeout: float = 1800.0epsilon: float = 0.2epsilon_high: float | None = Nonescore_centering: bool = Truevllm_importance_sampling_clip_min: float = 0.5vllm_importance_sampling_clip_max: float = 5.0num_sampler_logprobs: int = 8token_budget: int | None = Nonemax_concurrent_rollouts: int | None = Nonemax_staleness: int = 4queue_maxsize: int = 1024weight_sync_steps: int = 1rollout_worker_timeout: float = 300.0log_completions: bool = Falsenum_completions_to_print: int | None = None )
Modeli kontrol eden parametreler
- model_init_kwargs (
dict[str, Any]veyastr, isteğe bağlı) — Modelin bir yoldan örneklenirken from_pretrained için kullanılan anahtar kelime argümanları.revisiondeğeri, işleme sınıfı yüklenirken de kullanılır. - dtype (
str, isteğe bağlı, varsayılan olarak"float32") — Modelin yükleneceği veri türü, şunlardan biri:"auto","bfloat16","float16"veya"float32". varsayılan olarak"float32"değildir, çünkü bu eğiticinin karşılaştırıldığı eğitim-çıkarsama uyumsuzluğu (FP16 ile Eğitim-Çıkarsama Uyumsuzluğunu Yenmek, bu eğiticinin üzerinden adım adım geçildiği TRL'de eğiticinin-üreticinin hassasiyet uyumsuzluğunu yenmek) ) eğiticinin kendi hassasiyetine duyarlıdır. Bu farkı uçtan uca kapatmak, vLLM sunucusunu da aynı veri türünde (dtype) çalıştırmayı gerektirir (vllm serve --dtype); eşleşmezse, eğitim başlangıcında bir uyarı olarak kaydedilir.dtypeiçindekimodel_init_kwargsönceliklidir.Bu, yalnızca ağırlıkların yüklendiği dtype'yi belirler. FSDP ile karma hassasiyet kullanıldığında (
bf16=Truevarsayılandır), accelerate, shard'lamadan önce her eğitilebilir parametreyi fp32'ye yükseltir; bu nedenledtypene derse desin, ana ağırlıklar ve optimizör durumu fp32'de kalırken, ileri ve geri yayılım bf16 veya fp16'da çalışır. Kontrol noktaları (checkpoint) daha sonra fp32'de değil, bu karma hassasiyet dtype'inde yazılır. FSDP olmadan hiçbir şey yükseltilmez:dtype="bfloat16"ilebf16=True, bf16 ağırlıkları ve optimizör durumlarını korur; bu da saf bf16 eğitimidir. - trust_remote_code (
bool, isteğe bağlı, varsayılanFalse) — Hub'dan özel Python kodu içeren modellerin ve tokenizer'ların yüklenmesine izin verilip verilmeyeceğini belirtir. from_pretrained ve from_pretrained işlevlerine aktarılır. - router_aux_loss_coef (
float, isteğe bağlı) — Mixture-of-Experts (MoE) modelleri için yük dengeleme yardımcı kaybının katsayısı, eğitim kaybına bu ağırlıkla eklenir. Ayarlanmadığında, model yapılandırmasında beyan edilen değer kullanılır. Devre dışı bırakmak için0.0olarak ayarlayın. MoE olmayan bir modelle kullanıldığında hata verir.
Üretimi kontrol eden parametreler
- num_generations (
int, isteğe bağlı, varsayılan8) — Her istem için örneklenmesi gereken nesil sayısı. - max_completion_length (
int, isteğe bağlı, varsayılan2048) — Oluşturulan tamamlamanın maksimum uzunluğu. - temperature (
float, isteğe bağlı, varsayılan1.0) — Örnekleme için sıcaklık. Sıcaklık ne kadar yüksekse, tamamlamalar o kadar rastgele olur. - top_p (
float, isteğe bağlı, varsayılan1.0) — Dikkate alınacak üst tokenlerin kümülatif olasılığını kontrol eden bir sayı. (0, 1] aralığında olmalıdır. Tüm tokenleri dikkate almak için 1.0 olarak ayarlayın.1.0'ın altında,top_k'nın da ayarlanması gerekir ve vLLM sunucusu (>= 0.28)--return-sampling-mask --enable-scale-outile başlatılmalıdır: eğitimci, sunucunun yaptığı gibi, her tokenin örneklemesinin yapıldığı aday kümesi üzerinde log-olasılıklarını yeniden normalize eder. Daha eski bir vLLM, tüm sözlüğü korur. - top_k (
int, isteğe bağlı, varsayılan0) — Top-k filtreleme için en yüksek olasılığa sahip tutulacak sözlük belirteçlerinin sayısı.0ise top-k filtreleme devre dışı bırakılır ve tüm belirteçler değerlendirilir. Diğer herhangi bir değer,top_paltında açıklanan sunucu bayraklarını gerektirir. - min_p (
float, isteğe bağlı) — En olası token'ın olasılığına göre ölçeklendirilen minimum token olasılığı. 0.0 ile 1.0 arasında bir değer olmalıdır. Tipik değerler 0.01-0.2 aralığındadır.0.0'ın üzerinde,top_paltında açıklanan sunucu bayraklarıyla birliktetop_kde ayarlanmalıdır. - repetition_penalty (
float, isteğe bağlı, varsayılan1.0) — İstemde ve şu ana kadar üretilen metinde görünüp görünmediklerine göre yeni jetonları cezalandıran bir ondalık sayı. 1.0'tan büyük değerler modele yeni jetonlar kullanmayı teşvik ederken, 1.0'dan küçük değerler modele jetonları tekrarlamayı teşvik eder. - chat_template_kwargs (
dict[str, Any], isteğe bağlı) — Tamamlamalar oluşturulurkenapply_chat_templatefonksiyonuna iletilecek ek anahtar kelime argümanları. - max_tool_calling_iterations (
int, isteğe bağlı) — Bir ajan eğitilirken araç çağırma turlarının maksimum sayısı.Noneise, bir sınır yoktur ve üretim, modelin araç çağrısı içermeyen bir yanıt turu oluşturduğunda veya toplam yanıt uzunluğumax_completion_lengthdeğerine ulaştığında durur. - fork_threshold_tokens (
int, isteğe bağlı, varsayılan1024) — Çok turlu bir sohbet, her turda tüm sohbeti yeniden belirteçlemeye (re-tokenize) tabi tutarak ve sonucu o ana kadar tutulan belirteçlerle karşılaştırarak eğitim satırlarına dönüştürülür: temiz bir ekleme tek satırda kalırken, bir yeniden yazma (düşürülen akıl yürütme, özetlenen geçmiş) yeni bir satır dallanmasına (fork) yol açar. Bir turun yeniden belirteçlenmiş istemi (prompt), son üretilen cevabın içinde sapma (drift) gösterdiğinde, karar sapma boyutuna göre verilir — yeniden hizalama (realign) bağlam olarak maskeleyecek olan, daha önce eğitilmiş kaç belirteçtir. Bu sayıdan küçük bir sapma, yeniden belirteçleme titremesi (re-tokenization wobble) olarak kabul edilir (bağlam olarak hizalanır); daha büyük bir sapma — örneğin şablon tarafından düşürülen uzun bir akıl yürütme bloğu — yeni bir satır dallanmasına yol açar, böylece bu eğitilmiş belirteçler sessizce maskelemek yerine eğitim sinyallerini korur.
vLLM sunucusunu kontrol eden parametreler
- vllm_server_base_url (
str, isteğe bağlı, varsayılan"http --//localhost:8000"): Üretim için kullanılan vLLM sunucusunun temel URL'si (ör."http://localhost:8000"). - vllm_server_timeout (
float, isteğe bağlı, varsayılan1800.0) — vLLM sunucusuna yapılan çağrılar için saniye cinsinden zaman aşımı: başlangıçta hazır olmasını bekleme, her üretim isteği ve her ağırlık eşitleme çağrısı. Sunucuyu ve ağırlık eşitleme çağrılarını bekleme sırasında süre dolarsa hata fırlatılır; zaman aşımına uğrayan bir üretim isteği yeniden denenir.
Eğitimi kontrol eden parametreler
- epsilon (
float, optional, defaults to0.2) — Epsilon value for clipping. - epsilon_high (
float, isteğe bağlı) — Kesme işlemi için üst sınır epsilon değeri. Belirtilmezse,epsilonargümanında belirtilen alt sınır değeriyle aynı varsayılır. DAPO makalesi0.28değerini önerir. - score_centering (
bool, isteğe bağlı, varsayılanTrue) — Kesilmiş hedef yerine puan merkezleme (makale) ile eğitim yapılıp yapılmayacağı: her örneklenen token'ın önem ağırlıklı puanı, vLLM örnekleyicisi altındaki beklentisinden çıkarılır; böylece sabit bir avantaj, politikayı örnekleyiciye doğru çekmez. Beklenti, her konumda en olasınum_sampler_logprobstoken üzerinden alınır ve örnekleyici bu token'ların log-olasılıklarını raporlar. - vllm_importance_sampling_clip_min (
float, isteğe bağlı, varsayılan0.5) — Politika ile vLLM örnekleyicisi arasındaki önem oranının alt sınırı C_min. Oranı [vllm_importance_sampling_clip_min,vllm_importance_sampling_clip_max] aralığının dışında kalan tokenlar kayıptan (loss) düşürülür (maskeli önem örneklemesi). - vllm_importance_sampling_clip_max (
float, isteğe bağlı, varsayılan5.0) — Önem oranının üst sınırı C_max. - num_sampler_logprobs (
int, isteğe bağlı, varsayılan8) — Her üretilen token için vLLM örnekleyicisinden istenen en yüksek log-olasılık sayısı, skor merkezileştirmede kullanılır. Daha yüksek değerler, örnekleyicinin olasılık kütlesinin daha büyük bir kısmını kapsar ancak seri hale getirme maliyeti daha yüksektir; sunucunun--max-logprobsparametresi bu değeri sınırlar. - token_budget (
int, isteğe bağlı) — Dinamik token bütçeli mikro-partileme için tek bir satırda (tek bir DP rank’ın ileri geçişinde) iletilecek maksimum token sayısı.> 0olduğunda,TokenBudgetBatcher, dikkat maliyetine dengeli mikro-partiler oluşturur; bu partilerin satırlarının her biri bu bütçe içinde kalır ve tepe bellek, örnek sayısından bağımsız olarak sınırlandırılır (satır başına örnek sayısı dinamik hale gelir). Bütçe, ham tokenler yerine benzersiz tokenları sınırlar; bu nedenle birden fazla örnek tarafından paylaşılan tokenlar bir kez sayılır ve satırın kayıp terimlerini de sınırlar.Noneise (varsayılan), eğitim başlangıcında sorgulanan vLLM sunucusununmax_model_lendeğerine ayarlanır — istem + tamamlama uzunluğu sınırı — böylece hiçbir rollout örneği bütçeyi aşamaz.token_budgetdeğerinden uzun bir örnek hiçbir satıra sığmaz ve bir uyarıyla düşürülür. Token bütçelemeyi devre dışı bırakmak için<= 0ayarlayın; bunun yerine her mikro-partide satırlar arasında dengeli olacak şekilde sabitper_device_train_batch_size × num_processesörnek paketlenir.
Eşzamanlı olmayan rollout hattını kontrol eden parametreler
- max_concurrent_rollouts (
int, isteğe bağlı) — vLLM sunucusuna aynı anda gönderilen en fazla rollout sayısı. EğerNone, ise, `max(max_staleness, 1)` * `per_device_train_batch_size` * `gradient_accumulation_steps` * `num_processes` olarak ayarlanır; bundan fazla örnek üretmek israftır, çünkü eğitimci bunları tüketmeden önce bayat olarak atılır. Araç kullanım ortamları kullanıyorsanız, paralel olarak çalıştırabileceğiniz ortam sayısına göre bunu manuel olarak ayarlamak isteyebilirsiniz.- per_device_train_batch_size gradient_accumulation_steps num_processes`: bundan fazla örnek üretmek israftır, çünkü eğitimci bunları tüketmeden önce bayat olarak atar. Araç kullanım ortamları kullanıyorsanız, paralel olarak çalıştırabileceğiniz ortam sayısına göre bunu manuel olarak ayarlamak isteyebilirsiniz.
- max_staleness (
int, isteğe bağlı, varsayılan4) — Bir rollout örneğinin, atılmadan önce mevcut model sürümünün ardında kalabileceği maksimum ağırlık güncelleme adımı sayısı. - queue_maxsize (
int, isteğe bağlı, varsayılan1024) — Rollout kuyruğunda tamponlanan rollout örneklerinin maksimum sayısı. - weight_sync_steps (
int, isteğe bağlı, varsayılan1) — vLLM sunucusuna ağırlık senkronizasyonları arasındaki eğitim adım sayısı. - rollout_worker_timeout (
float, isteğe bağlı, varsayılan300.0) — Rollout işçisinin son kalp atışından bu yana geçen, eğiticinin işçinin takıldığını varsayıp işlemi sonlandırdığı saniye sayısı.
Kayıt tutmayı kontrol eden parametreler
- log_completions (
bool, isteğe bağlı, varsayılanFalse) — Herlogging_stepsadımında (prompt, completion) çiftlerinin bir örneğinin günlüğe kaydedilip kaydedilmeyeceğini belirtir. - num_completions_to_print (
int, isteğe bağlı) —richile yazdırılacak tamamlama sayısı.Noneise tüm tamamlamalar günlüğe kaydedilir.
experimental.async_grpo.AsyncGRPOTrainer için yapılandırma sınıfı.
Bu sınıf, asenkron GRPO eğitimine özgü parametreleri içerir. Eğitim argümanlarının tam listesi için TrainingArguments belgelerine bakın. Bu sınıftaki varsayılan değerlerin TrainingArguments içindeki değerlerden farklı olabileceğini unutmayın.
Bu parametrenin TrainingArguments'ten farklı varsayılan değerleri vardır:
logging_steps: Varsayılan olarak500yerine1değerini alır.gradient_checkpointing: Varsayılan olarakFalseyerineTruedeğerini alır.bf16:fp16ayarlanmadıysa varsayılan olarakTrue,Falseyerine.learning_rate: Varsayılan olarak5e-5yerine1e-6olarak ayarlanır.lr_scheduler_type: Varsayılan olaraklinearyerineconstantolarak ayarlanır (aşağıya bakın).ignore_data_skip: Varsayılan değeriFalseyerineTrue'dir; temel Trainer'ın atla ve yeniden oynat döngüsü, asenkron rollout kuyruğuna uygulanmaz.
Mesaj modu uzlaştırmasında eğitim süresi ve öğrenme oranı: Çok turlu bir sohbet, değişken sayıda eğitim satırına ayrılabilir (sohbetin yeniden yazılması yeni bir satır başlatır), bu nedenle örnek sayısı ve dolayısıyla epoch başına optimizör adımı sayısı önceden bilinemez. Sonuç olarak:
num_train_epochs, prompt veri setinin üzerinde tam geçişler olarak sınırlar ve sayı, aslında üzerinde eğitim yapılan farklı promptların sayısı olarak hesaplanır. Bu, dalların (forks) ürettiği satır sayısından bağımsızdır; bu nedenle N epoch istendiğinde her zaman veri üzerinde N geçiş yapılır.max_stepsayarlanmadığında, durdurma koşulu budur vemax_stepsyalnızca bir güvenlik sınırıdır.max_steps, açıkça ayarlanırsa (> 0), durdurma koşulu olarak devreye girer (epoch yerine optimizör adımlarıyla sınırlandırır) ve epoch tabanlı durdurmayı devre dışı bırakır.lr_scheduler_type, adım sayısı fork oranına bağlı olduğunda önceden bilinemediği için, bozulma ufku optimizasyon adımlarında ölçüldüğünden varsayılan olarakconstantdeğerine ayarlanır. Bozulan bir öğrenme oranı için, açık birmax_stepsdeğeriyle birlikte bozulan bir zaman çizelgesi belirleyin.
AsyncGRPOTrainer
sınıf trl.experimental.async_grpo.AsyncGRPOTrainer
< source >( model: str | PreTrainedModelreward_funcs: collections.abc.Callable[..., list[float]] | list[collections.abc.Callable[..., list[float]]] | None = Noneargs: trl.experimental.async_grpo.async_grpo_config.AsyncGRPOConfig | None = Nonetrain_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | None = Noneprocessing_class: transformers.tokenization_utils_base.PreTrainedTokenizerBase | None = Nonecallbacks: list[transformers.trainer_callback.TrainerCallback] | None = Noneoptimizers: tuple[typing.Optional[torch.optim.Optimizer], typing.Optional[torch.optim.lr_scheduler.LambdaLR]] = (None, None)peft_config: PeftConfig | None = Nonetools: list[collections.abc.Callable] | None = Noneenvironment_factory: collections.abc.Callable[[], trl.experimental.async_grpo.async_grpo_trainer._SupportsReset] | dict[str, collections.abc.Callable[[], trl.experimental.async_grpo.async_grpo_trainer._SupportsReset]] | None = None )
Parametreler
- model (
strveya PreTrainedModel) — Eğitilecek model. Şunlardan biri olabilir:- Bir dize, huggingface.co üzerindeki bir model deposunda barındırılan ön eğitilmiş bir modelin model kimliği veya save_pretrained kullanılarak kaydedilmiş model ağırlıklarını içeren bir dizin yolu, örneğin
'./my_model_directory/'. Model, yapılandırmasında beyan edilen mimariyle yüklenir: bir görme-dil kontrol noktası için (görme kulesi yüklenir ancak dondurulur, bkz. Vision-language models) AutoModelForImageTextToText, aksi halde AutoModelForCausalLM. - Bir PreTrainedModel nesnesi. Paketli eğitim için dikkat uygulaması, eğitimcinin ağaç dikkat (tree attention) arka ucuna değiştirilir.
Üretim için kullanılan vLLM sunucusunda modeli tanımlamak için config'teki model adı kullanılır.
- Bir dize, huggingface.co üzerindeki bir model deposunda barındırılan ön eğitilmiş bir modelin model kimliği veya save_pretrained kullanılarak kaydedilmiş model ağırlıklarını içeren bir dizin yolu, örneğin
- reward_funcs (
RewardFunc | list[RewardFunc], isteğe bağlı) — Ödülleri hesaplamak için kullanılacak ödül işlevleri. Ödülleri hesaplamak için tüm ödül işlevlerini istemler (prompts) ve tamamlamalar (completions) ile çağırır ve ödülleri toplar. Ödül, ortam tarafından sağlandığında (environment_factory(aşağıya bakın) atlanabilir. Şu şekillerden biri olabilir:- Tek ödül fonksiyonu: Fonksiyona, istemler (prompts) ve üretilen tamamlamalar ile veri setindeki ek sütunlar sağlanır. Bir ödül listesi döndürmelidir. Ödül fonksiyonları senkron veya asenkron olabilir ve ödülün ilgili örnekler için geçerli olmadığı durumlarda
Nonedöndürebilir. Bu, farklı ödül fonksiyonlarının farklı örnek türlerine uygulandığı çok görevli eğitim için faydalıdır. Bir ödül fonksiyonu bir örnek içinNonedöndürdüğünde, o ödül fonksiyonu o örneğin ödül hesabından hariç tutulur. Daha fazla ayrıntı için Özel bir ödül fonksiyonu kullanma bölümüne bakın. - Her öğesi yukarıda tanımlandığı gibi bir ödül fonksiyonu olan ödül fonksiyonları listesi. Tüm fonksiyonlardan gelen ödüller toplanır.
GRPOTrainer'den farklı olarak, ödüller türetilmiş bir alt süreçte hesaplanır; bu nedenle her ödül fonksiyonu (birlikte
toolsveenvironment_factoryile) picklable olmalıdır: modül düzeyinde bir fonksiyon,functools.partialveya çağrılabilir bir sınıf örneği kullanın — lambda'lar ve kapanışlar (closures) başlangıçta başarısız olur. Araçlar__name__altında kaydedilir, bu nedenle modül düzeyinde fonksiyonlar olmalıdır. Alt süreç ayrıcaCUDA_VISIBLE_DEVICES=""ile çalışır, bu nedenle GPU destekli bir ödül modeli, eğitimcinin GPU'su yerine CPU'da (yavaş) çalışır. - Tek ödül fonksiyonu: Fonksiyona, istemler (prompts) ve üretilen tamamlamalar ile veri setindeki ek sütunlar sağlanır. Bir ödül listesi döndürmelidir. Ödül fonksiyonları senkron veya asenkron olabilir ve ödülün ilgili örnekler için geçerli olmadığı durumlarda
- args (experimental.async_grpo.AsyncGRPOConfig, isteğe bağlı) —
Bu eğitimci için yapılandırma.
Noneise varsayılan yapılandırma kullanılır. - train_dataset (Dataset veya IterableDataset, isteğe bağlı) —
Eğitim için kullanılacak veri seti. Şu sütunu içermelidir:
"prompt". Veri setindeki ek sütunlar yok sayılır. Örneklerin biçimi şu şekillerden biri olabilir:- Standart: Her örnek düz metin içerir.
- Sohbet: Her örnek yapılandırılmış mesajlar içerir (ör. rol ve içerik).
environment_factorysağlandığında ve ortamın verileri kendisinin sahip olduğu (veya prosedürel olarak ürettiği) ve istemireset()metodundan döndürdüğü durumlarda atlanabilir. Bu durumda, eğitim süresini tanımlamak içinmax_stepsayarlanmalıdır. - processing_class (PreTrainedTokenizerBase, isteğe bağlı) —
Verileri işlemek için kullanılan işleme sınıfı. Dolgu tarafı “left” olarak ayarlanmalıdır.
Noneise, işleme sınıfı modelin adıyla from_pretrained kullanılarak yüklenir. Bir dolgu belirteci,tokenizer.pad_token, ayarlanmalıdır. İşleme sınıfı bir dolgu belirteci ayarlamadıysa, varsayılan olaraktokenizer.eos_tokenkullanılır. - callbacks (liste TrainerCallback, isteğe bağlı) —
Eğitim döngüsünü özelleştirmek için kullanılacak geri çağrılar listesi. Bunlar, burada.
Varsayılan olarak kullanılan geri çağrılardan birini kaldırmak istiyorsanız, remove_callback metodunu kullanın.
- optimizers (
tuple[torch.optim.Optimizer | None, torch.optim.lr_scheduler.LambdaLR | None], isteğe bağlı, varsayılan(None, None)) — Kullanılacak optimizörü ve zamanlayıcıyı içeren bir demet. ModelinizdeAdamWörneği veargstarafından kontrol edilen get_linear_schedule_with_warmup tarafından verilen bir zamanlayıcı olarak varsayılan değerlere sahip olacaktır. - peft_config (PeftConfig, isteğe bağlı) —
Modeli sarmak için kullanılan PEFT yapılandırması.
Noneise model sarılmaz. vLLM sunucusu--enable-loraile başlatıldığında, bir LoRA adaptörü birleştirilmiş ağırlıklar olarak değil, bir adaptör olarak senkronize edilir; AsyncGRPO belgelerinin LoRA bölümüne bakın. - tools (
Callablelistesi, isteğe bağlı) — Modelin üretim sırasında çağırabileceği çağrılabilir araç fonksiyonlarının (senkron veya asenkron) listesi. Her aracın, uygun şekilde tip ipucu (type-hint) verilmiş argümanlara ve dönüş değerlerine sahip standart bir Python fonksiyonu ve amacını, argümanlarını ve dönüş değerini açıklayan bir Google tarzı docstring içermesi gerekir. Daha fazla ayrıntı için bkz: https://huggingface.co/docs/transformers/en/chat_extras#passing-tools. Model, fonksiyonun adını, tip ipuçlarını ve docstring'ini kullanarak nasıl çağrılacağını belirler. Modelin sohbet şablonunun (chat template) araç kullanımını desteklediğinden ve araç çağırma (tool calling) için ince ayar (fine-tune) yapıldığından emin olun. - environment_factory (
EnvironmentFactoryveyadict[str, EnvironmentFactory], isteğe bağlı) — Bir ortam örneği oluşturup döndüren çağrılabilir bir nesne veya ortam adlarını bu tür çağrılabilir nesnelere eşleyen bir sözlük. Ortam sınıfı, üretim sırasında araç olarak çağrılabilen yöntemler tanımlamalıdır. Her yöntem, yukarıda açıklanantoolsyukarıda açıklananresetyöntemini de uygulamalıdır; bu yöntem, üretimler arasında durumu sıfırlamak için kullanılabilir.resetyöntemiNoneveya bir dize döndürmelidir: bir dize döndürdüğünde, bu dize üretimden önce son kullanıcı mesajına eklenir. Ortam ayrıcaget_rewardargüman almayan vefloat: varsa, ödülün sahibi ortam olur veget_rewardtamamlanan her rollout için bir kez çağrılarak ortamın iç durumuna göre puanlanır. Bu, ortamın sınıf adı altında kaydedilen ve ağırlığı 1 olan ek bir ödül kaynağı olarak görev yapar vereward_funcs, bu durumda isteğe bağlı hale gelir.Tek bir callable ile her örnek aynı ortamı kullanır ve her rollout için bir örnek oluşturulduğundan etkileşimleri izole kalır. Bir sözlük kullanıldığında, her örneğin ortamını adıyla seçen bir
environmentalanı taşıması gerekir ve yalnızca o ortamın araçları prompt’unda açığa çıkarılır — bu da tek bir çalıştırmada görevlerin karıştırılmasına (ör. bir kodlama ortamı ve bir oyun) olanak tanır. Bu özellik deneyseldir ve önceden haber verilmeden herhangi bir zamanda değiştirilebilir veya kaldırılabilir.
Grup Göreceli Politika Optimizasyonu (GRPO) yöntemi için Trainer. Bu algoritma ilk olarak DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models makalesinde önerilmiştir. Bu trainer, GRPO'nun asenkron sürümüdür; üretim, eğitimle birlikte asenkron olarak çalışan harici bir vLLM sunucusuna devredilir ve bu sayede rollout, gradyan güncelleme döngüsünden ayrıştırılır.
Örnek:
>>> from trl.experimental.async_grpo import AsyncGRPOTrainer
>>> from trl.rewards import accuracy_reward
>>> from datasets import load_dataset
>>> dataset = load_dataset("trl-lib/DeepMath-103K", split="train")
>>> trainer = AsyncGRPOTrainer(
... model="Qwen/Qwen2.5-0.5B-Instruct",
... reward_funcs=accuracy_reward,
... train_dataset=dataset,
... )
>>> trainer.train()Hangi istemlerin örneklenmesi, bir rollout'un nasıl oluşturulacağı veya avantajların nasıl hesaplanacağı özelleştirilecekse, experimental.async_grpo.AsyncRolloutLoop sınıfından türetin ve bunu trainer'ın loop_cls olarak ayarlayın. TRL, döngüyü şu şekilde oluşturur
AsyncRolloutLoop
sınıf trl.experimental.async_grpo.AsyncRolloutLoop
< source >( config: AsyncGRPOConfigmodel_name: strdataset: Datasetreward_funcs: list[collections.abc.Callable[..., list[float]]]processing_class: PreTrainedTokenizerBaseeos_token_ids: list[int]rollout_buffer: Queuemodel_version_value: Synchronizedheartbeat_value: Synchronizedfailed_event: Eventexception_info_queue: Queuemetrics_queue: Queuetools: list[collections.abc.Callable] | None = Noneenvironment_factory: collections.abc.Callable[[], object] | dict[str, collections.abc.Callable[[], object]] | None = Nonescore_queue_maxsize: int = 16lora_name: str | None = Nonedataset_start_index: int = 0 )
Doğrulama sürecinde türetilen ve puanlanan rollout'lar için experimental.async_grpo.AsyncGRPOTrainer kullanılır.
Varsayılan, GRPO'yu uygular. Bir çalıştırmayı özelleştirmek için onu alt sınıflandırın, yalnızca değişen yöntemleri geçersiz kılın ve alt sınıfı eğitimcinin loop_cls'i olarak ayarlayın. Her istek sırasıyla şu adımlardan geçer:
- filter_prompt(): prompt için üretilip üretilmeyeceği.
- generate_one(): generate_one_turn() fonksiyonunu her örneklemleme isteği için çağıran tek bir tam rollout.
num_generationsdeğerindeki rollout grubu puanlanır: ödülleri, eğitimcininreward_funcsbileşenlerinin,get_rewardtanımlayan ortamların ve Rollout.rewarddeğerlerinin toplamıdır. Ardından compute_advantages() her grup için bir kez çalıştırılır.
setup() ve close(), bir HTTP istemcisi gibi, döngünün olay döngüsünde (event loop) kaynakları oluşturur ve serbest bırakır. Bir hook, self.config (kendi alanlarını taşıyabilen experimental.async_grpo.AsyncGRPOConfig alt sınıfı) ve self.tokenizer değerlerini okuyabilir. Döngü, türetilmiş bir süreçte (spawned process) oluşturulduğundan, alt sınıf içe aktarılabilir (importable) olmalıdır (modül seviyesinde tanımlanmış olmalıdır).
filter_prompt
< source >( row_index: introw: dict[str, typing.Any]epoch: int ) → bool
Bir prompt için üretim yapılıp yapılmayacağını belirtir. Reddedilen bir prompt, bu epoch için atlanır ve tıpkı atılan bir grup gibi tüketilmiş sayılır. Varsayılan olarak her prompt kabul edilir. Tam bir epoch'taki tüm promptların reddedilmesi, o andan sonra hiçbir batch'in trainer'a ulaşamayacağı için bir hata fırlatır.
generate_one
< source >( prompt: list[dict[str, str]]tools: list[collections.abc.Callable]group_id: int = 0 ) → Rollout
Parametreler
- prompt (
list[dict[str, Any]]) — İstek mesajları. - tools (
list[Callable]) — Bu rollout için kullanılabilir araçlar: eğitimcinintoolsdeğerleri veenvironment_factorykullanıldığında ortamın herkese açık yöntemleri. - group_id (
int, isteğe bağlı, varsayılan0) — Rollout'un ait olduğu grubun tanımlayıcısı.
Dönüş değeri
Tamamlanan rollout.
Bir istem için bir yuvarlak üretin.
Varsayılan olarak, çok turlu bir araç döngüsü çalışır: her turda sohbet şablonuyla tüm konuşma işlenir, generate_one_turn() ile bir yanıt örneklenir ve içindeki araç çağrıları çalıştırılır; model araç çağırmayı durdurana veya max_tool_calling_iterations değerine ulaşıncaya kadar bu işlem devam eder. Örneğin bir ajan çerçevesiyle farklı bir şekilde üretmek için bunu geçersiz kılın. Eğitim dizileri bunlardan oluşturulduğundan, tüm örneklem isteklerini Rollout.turns içinde döndürün ve rollout'u burada puanlamak için Rollout.reward değerini ayarlayın.
generate_one_turn
< source >( prompt_ids: list[int] ) → TurnRecord
Parametreler
Dönüş değeri
TurnRecord
İstem ve log-olasılıklarıyla örneklenen jetonlar. top_k veya top_p kullanıldığında, her örneklenen jetonun aday kümesini; num_sampler_logprobs kullanıldığında ise örnekleyicinin en yüksek log-olasılıklarını da içerir.
vLLM sunucusundan, yapılandırmanın örneklem ayarlarını (temperature, top_p, top_k, min_p, repetition_penalty ve max_completion_length) kullanarak bir yanıt örneği alın.
compute_advantages
< source >( group: RolloutGroup ) → np.ndarray
Parametreler
- group (RolloutGroup) —
Bir istemin
num_generationsrollout'ları, toplam ödüllerigroup.rewardsiçinde.
Dönüş değeri
np.ndarray
Her rollout için bir avantaj, group.rewards sırasındadır.
Bir grubun rollout'ları için rollout başına bir avantaj hesaplayın. Varsayılan olarak, her ödül grup içinde standartlaştırılır; NaN ödülüne sahip bir rollout 0 avantajı alır ve ortalama ile standart sapma hesaplamalarının dışında bırakılır.
Her grup için çalışır. Puanlanan ödülleri birbirine eşit olan bir grup, bu işlem ne tür avantajlar döndürürse döndürsün, elenir.
Diğer kancaların ihtiyaç duyduğu kaynakları, örneğin bir HTTP istemcisini oluşturur. İlk istemden önce döngünün olay döngüsünde çalışır. Varsayılan olarak hiçbir şey yapmaz.
setup() tarafından oluşturulanları serbest bırakır. Döngüler durduğunda, hata durumunda dahil olmak üzere çalışır. Varsayılan olarak hiçbir şey yapmaz.
Rollout
sınıf trl.experimental.async_grpo.Rollout
< source >( completion: list[dict[str, str]]completion_ids: list[int]turns: list[trl.experimental.async_grpo.async_rollout_worker.TurnRecord]tool_call_count: int = 0tool_failure_count: int = 0reward: float | None = None )
Parametreler
- completion (
list[dict[str, Any]]) — İstemden sonra üretilen mesajlar, konuşma biçiminde. Ödül fonksiyonlarınacompletionsolarak iletilir. - completion_ids (
list[int]) — Üretilen tamamlamanın token kimlikleri. Ödül fonksiyonlarınacompletion_idsolarak iletilir. - turns (
list[TurnRecord]) — Rollout'u üreten örneklem istekleri, sırasıyla. Eğitim dizileri bunlardan oluşturulur: örneklenen jetonlar üzerinde eğitim yapılır, her istemin geri kalanı bağlam olarak kullanılır. - tool_call_count (
int, isteğe bağlı, varsayılan0) — Rollout sırasında yapılan araç çağrılarının sayısı. - tool_failure_count (
int, isteğe bağlı, varsayılan0) — Başarısız olan bu araç çağrılarının sayısı. - reward (
float, isteğe bağlı) — Örneğin harici bir değerlendirici tarafından, üretim sırasında hesaplanan ödül. Ödül fonksiyonlarının ve ortamların ödüllerine eklenir.Noneise, bu rollout bu kaynaktan ödül almaz.
generate_one() tarafından döndürülen tamamlanmış bir rollout.
TurnRecord
sınıf trl.experimental.async_grpo.async_rollout_worker.TurnRecord
< source >( prompt_ids: list[int]output_ids: list[int]output_log_probs: list[float] = <factory>output_mask: list[int] | None = Noneoutput_sampling_mask: list[list[int]] | None = Noneoutput_sampler_logprobs: list[dict[int, float]] | None = None )
Parametreler
- prompt_ids (
list[int]) — Bu tur için gönderilen tam istemcinin token kimlikleri, konuşmanın önceki tüm turlarını da içerir. - output_ids (
list[int]) — Örnekleme biriminin ürettiği token kimlikleri. - output_log_probs (
list[float], isteğe bağlı, varsayılan[]) —output_idsiçindeki her token için Sampler log-olasılık değeri. Bunlardan herhangi biri üzerinde eğitim yapıldığında zorunludur. - output_mask (
list[int], isteğe bağlı) —output_idsiçindeki her token için bir değer: token üzerinde eğitim yapmak için1, yalnızca bağlam olarak tutmak için0.Noneise, her çıktı token üzerinde eğitim yapılır. - output_sampling_mask (
list[list[int]], isteğe bağlı) —output_idsiçindeki her token için bir liste: örnekleyicinintop_k/top_pkırpma işlemi altında çekebileceği token kimlikleri.Noneise, tam sözlük. - output_sampler_logprobs (
list[dict[int, float]], isteğe bağlı) —output_idsiçindeki her token için bir dict: en olası tokenların sampler log-olasılıkları, token kimliği ile anahtarlanır. Skor merkezleme (num_sampler_logprobs) tarafından kullanılır.
Örnekleme isteği: örnekleme birimine gönderilen istem ve ürettiği jetonlar.
RolloutGroup
sınıf trl.experimental.async_grpo.async_rollout_worker.RolloutGroup
< source >( prompts: list[list[dict[str, str]]]reward_kwargs: dict[str, list[typing.Any]]completions: list[list[dict[str, str]]]completions_ids: list[list[int]]completions_sequences: list[list[trl.experimental.async_grpo.async_rollout_worker.TrainingSequence]]tool_call_counts: list[int]tool_failure_counts: list[int]model_version: intgroup_id: introw_index: intenv_rewards: list[tuple[type, float] | None]rollout_rewards: list[float | None]queued_at: float = 0.0rewards: numpy.ndarray | None = None )
Parametreler
- prompts (
list[list[dict[str, Any]]]) — Her rollout'un prompt'u. - reward_kwargs (
dict[str, list[Any]]) — İstemin veri seti satırındaki diğer sütunlar, ödül fonksiyonlarına anahtar kelime argümanları olarak iletilir. - completions (
list[list[dict[str, Any]]]) — Her rollout'un tamamlama mesajları. - completions_ids (
list[list[int]]) — Her rollout'un tamamlama token kimlikleri. - completions_sequences (
list[list[TrainingSequence]]) — Her rollout'dan oluşturulan eğitim dizileri. Tur aralarında yeniden jetonlaştırılmış geçmişi değişen bir rollout birden fazla dizi verir. - tool_call_counts (
list[int]) — Her rollout'daki araç çağrılarının sayısı. - tool_failure_counts (
list[int]) — Her rollout'daki başarısız araç çağrılarının sayısı. - model_version (
int) — Grubun ilk rollout'unun başladığı andaki politika sürümü. - group_id (
int) — Rollout sürecinde0'dan sayılan grubun tanımlayıcısı. - row_index (
int) — Eğitim veri setinde istemin satır indeksi. - env_rewards (
list[tuple[type, float] or None]) — Ortamıget_rewardtanımlayan bir rollout için ortam sınıfı ve ödülü; aksi haldeNone. - rollout_rewards (
list[float or None]) — Her rollout'un Rollout.rewarddeğeri. - queued_at (
float, isteğe bağlı, varsayılan0.0) — Grup, puanlama için kuyruğa alındığındatime.monotonic()değeri. - rewards (
np.ndarray, isteğe bağlı) — Her rollout'un toplam ödülü, tüm ödül kaynakları üzerinden toplanır; hiçbir kaynak puanlamadıysa NaN. compute_advantages() çağrılmadan önce ayarlanır.
Bir istemin num_generations yürütmesi, birlikte puanlanır. Her listede yürütme başına bir giriş vardır.