TRL documentation

Asenkron GRPO

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.17.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Asenkron GRPO

Bu eğitimci vllm, transformers>=5.2.0 ve kernels gerektirir (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 vllm ve transformers ç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 üzerinden kernels'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.partial veya ç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ında TypeError fı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. an AutoModelForSequenceClassification scorer) 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 like accuracy_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-len değ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 ile max_completion_length değerinin toplamıdır.

# Terminal 2: training on GPU 1
CUDA_VISIBLE_DEVICES=1 accelerate launch train_async_grpo.py

AMD 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-out
config = 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 ∇θlog⁡πθ \nabla_\theta \log \pi_\theta ö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=8 değeri, üretim (generation) verimliliğini yarıya indirir. vLLM 0.32 veya üzeri sürümlerde sunucuyu --api-server-count 8 bayrağı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 6

VLLM_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 önceher 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 kezyapı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 toplanmazgrupta 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_generations kez ü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_accum mikro-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:

namespacesaydığı 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 == 1 olan 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_size

bu 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_step

Dolayı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, causal

Bir 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 it

Birkaç 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.0 sü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_tokens değ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ılan 1024 değerine karşı onlarca token olduğundan hiçbir tur ayrılmaz ve bir sohbet, rank başına tek satıra çöker. rollout/fork_frac hangi 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:

metrikquestion
sample/rollout_queue_sizeşu anda bekleyen örnek sayısı
sample/time_in_queue_seğitilmeden önce tek bir örnek orada ne kadar süre bekledi — politika dışı olmasının saniye yarısı
perf/rollout_wait_skuyruk boş olduğu için eğitim ne kadar süre boyunca engellenmiş olarak kaldı
rollout/backpressure_skuyruk 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_s yüksek → üretim kısıtlı. Eğitmen aç kalıyor; rollout/generated_tok_s, rollout/concurrency ve rollout/score_queue_size değerlerine bakın.
  • kuyruk neredeyse dolu, rollout/backpressure_s yüksek → trainer-bound. Üretim kısıtlanıyor ve çıktısı kuyrukta bekliyor, bu yüzden sample/staleness_mean değ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.

metrikanlam
completions/mean_lengthrollout başına üretilen token sayısı, tüm turlar üzerinde ortalama
completions/min_length, completions/max_lengthpenceredeki en kısa ve en uzun rollout
completions/clipped_ratioson 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.

metrikanlam
rollout/duration_sbir 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_sson aralık boyunca (pencereleme yapılarak) üretim verimi, böylece bir duraksama görünür
rollout/concurrencyvLLM'ye uçuştaki rollouts.
rollout/turns_mean, rollout/turns_maxsohbet başına ortalama ve maksimum tur sayısı
rollout/samples_per_rolloutsohbet 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_fracher 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_maxBir turun yeniden tokenizasyonuyla geçersiz kılınan tutulan token sayısını karşılaştırın fork_threshold_tokens
rollout/score_queue_sizepuanlanmayı bekleyen tamamlanmış gruplar.
rollout/score_s, rollout/score_wait_s, rollout/score_block_sscoring: 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_totalyeniden 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_srollout 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_capUç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_usagevLLM 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_requestssunucunun 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_requestssunucunun 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_totalSunucunun, 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_keptgrupları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.

metrikpathanlam
tools/call_frequency, tools/failure_frequencyyerleşik, test çerçevesirollout 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_syerleşik, beyaz kutu test çerçevesiaracı ç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_totalyerleşik, test çerçevesiaraç başına çağrı ve hata sayıları
tools/unknown_name_totalyerleşikmodel, ç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_meanyerleşiktek bir asistan mesajında istenen araç çağrıları
tools/loop_exhausted_fracyerleşikAraç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.

metrikanlam
env/reset_srollout başlamadan önce reset() içinde geçen süre
env/reward_srollout 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.

metrikanlam
sample/forwarded_tokens_mean, sample/forwarded_tokens_maxbir örnekteki tokenler: prompt + araç bağlamı + üretilen. Paketleme satır düzeyinde bir konudur, bkz. batch/row_*
sample/trained_tokens_meanbunlardan kaçının üzerinde kayıp alınır
sample/rollout_queue_sizekuyrukta bekleyen puanlanmış örnekler
sample/time_in_queue_sBu ö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_maxveri 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_totalmax_staleness değerini aşan örnekler düşürüldü

Ödüller ve politika dışılık

metrikanlam
reward_group_stdHer ö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_stdher ö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, /maxtamamlama başına \|log π_θ − log π_sampler\|
num_tokenseğ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.

metrikanlam
batch/forwarded_tokens_per_step, batch/trained_tokens_per_stepbir optimizör adımındaki tokenler, sırasıyla ileriye aktarılan ve eğitilen
batch/samples_per_step, batch/groups_per_stepeğitim örnekleri ve farklı istemler, optimizasyon adımı başına. Bunlar, dallanma oranına göre farklılık gösterir
batch/microbatches_per_stepsayıldı, yapılandırmadan okunmadı
batch/masked_token_fraccompletion_mask == 0 olan ileri yönlendirilen tokenler — gradyan kazanmayan ileri yönlendirme payı
batch/samples_per_row, batch/row_tokens_mean, batch/row_tokens_maxplanlayıcının her sıranın satırını ne kadar yoğun paketlediği
batch/row_fill_fracrow token'ları token_budget ile karşılaştırılır. Düşük, bütçenin kullanılmadığı anlamına gelir
batch/row_imbalanceSatı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_ratioiletilen 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_fracrütbe arası dolgu. Sadece yayın baytlarına mal olur; ileri yönlü işlem öncesi kaldırılır
batch/dropped_oversize_totaltoken_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.

metrikanlam
perf/step_soptimizasyon adımları arasındaki duvar saati: hesaplama, optimizasyon, ağırlık senkronizasyonu ve kuyruk bekleme süreleri dahil
perf/fwd_bwd_sforward + 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_soptimizer.step()
perf/rollout_wait_skuyruk boş olduğu için trainer'ın ne kadar süre boyunca bloke kaldığı. rollout kuyruğu'na bakın
perf/weight_sync_stam 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_clockher bazda saniyede iletilen token sayısı
perf/trained_tok_s_wall_clockaynı, yalnızca kaybın gördüğü tokenları sayarak
perf/mfu_fwd_bwd, perf/mfu_wall_clockher bazda model FLOPs kullanımı

AsyncGRPOConfig

sınıf trl.experimental.async_grpo.AsyncGRPOConfig

< >

( 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] veya str, isteğe bağlı) — Modelin bir yoldan örneklenirken from_pretrained için kullanılan anahtar kelime argümanları. revision değ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. dtype içindeki model_init_kwargs önceliklidir.

    Bu, yalnızca ağırlıkların yüklendiği dtype'yi belirler. FSDP ile karma hassasiyet kullanıldığında (bf16=True varsayılandır), accelerate, shard'lamadan önce her eğitilebilir parametreyi fp32'ye yükseltir; bu nedenle dtype ne 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" ile bf16=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ılan False) — 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çin 0.0 olarak ayarlayın. MoE olmayan bir modelle kullanıldığında hata verir.

Üretimi kontrol eden parametreler

  • num_generations (int, isteğe bağlı, varsayılan 8) — Her istem için örneklenmesi gereken nesil sayısı.
  • max_completion_length (int, isteğe bağlı, varsayılan 2048) — Oluşturulan tamamlamanın maksimum uzunluğu.
  • temperature (float, isteğe bağlı, varsayılan 1.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ılan 1.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-out ile 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ılan 0) — Top-k filtreleme için en yüksek olasılığa sahip tutulacak sözlük belirteçlerinin sayısı. 0 ise top-k filtreleme devre dışı bırakılır ve tüm belirteçler değerlendirilir. Diğer herhangi bir değer, top_p altı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_p altında açıklanan sunucu bayraklarıyla birlikte top_k de ayarlanmalıdır.
  • repetition_penalty (float, isteğe bağlı, varsayılan 1.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şturulurken apply_chat_template fonksiyonuna 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ı. None ise, 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ğu max_completion_length değerine ulaştığında durur.
  • fork_threshold_tokens (int, isteğe bağlı, varsayılan 1024) — Ç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ılan 1800.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 to 0.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, epsilon argümanında belirtilen alt sınır değeriyle aynı varsayılır. DAPO makalesi 0.28 değerini önerir.
  • score_centering (bool, isteğe bağlı, varsayılan True) — 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_logprobs token ü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ılan 0.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ılan 5.0) — Önem oranının üst sınırı C_max.
  • num_sampler_logprobs (int, isteğe bağlı, varsayılan 8) — 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-logprobs parametresi 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ı. > 0 olduğ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. None ise (varsayılan), eğitim başlangıcında sorgulanan vLLM sunucusunun max_model_len değerine ayarlanır — istem + tamamlama uzunluğu sınırı — böylece hiçbir rollout örneği bütçeyi aşamaz. token_budget değ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 <= 0 ayarlayın; bunun yerine her mikro-partide satırlar arasında dengeli olacak şekilde sabit per_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ğer None, 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ılan 4) — 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ılan 1024) — Rollout kuyruğunda tamponlanan rollout örneklerinin maksimum sayısı.
  • weight_sync_steps (int, isteğe bağlı, varsayılan 1) — vLLM sunucusuna ağırlık senkronizasyonları arasındaki eğitim adım sayısı.
  • rollout_worker_timeout (float, isteğe bağlı, varsayılan 300.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ılan False) — Her logging_steps adımında (prompt, completion) çiftlerinin bir örneğinin günlüğe kaydedilip kaydedilmeyeceğini belirtir.
  • num_completions_to_print (int, isteğe bağlı) — rich ile yazdırılacak tamamlama sayısı. None ise 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 olarak 500 yerine 1 değerini alır.
  • gradient_checkpointing: Varsayılan olarak False yerine True değerini alır.
  • bf16: fp16 ayarlanmadıysa varsayılan olarak True, False yerine.
  • learning_rate: Varsayılan olarak 5e-5 yerine 1e-6 olarak ayarlanır.
  • lr_scheduler_type: Varsayılan olarak linear yerine constant olarak ayarlanır (aşağıya bakın).
  • ignore_data_skip: Varsayılan değeri False yerine True'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_steps ayarlanmadığında, durdurma koşulu budur ve max_steps yalnı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 olarak constant değerine ayarlanır. Bozulan bir öğrenme oranı için, açık bir max_steps değeriyle birlikte bozulan bir zaman çizelgesi belirleyin.

AsyncGRPOTrainer

sınıf trl.experimental.async_grpo.AsyncGRPOTrainer

< >

( 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 (str veya 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.

  • 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 None dö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çin None dö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 tools ve environment_factory ile) picklable olmalıdır: modül düzeyinde bir fonksiyon, functools.partial veya ç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ıca CUDA_VISIBLE_DEVICES="" ile çalışır, bu nedenle GPU destekli bir ödül modeli, eğitimcinin GPU'su yerine CPU'da (yavaş) çalışır.

  • args (experimental.async_grpo.AsyncGRPOConfig, isteğe bağlı) — Bu eğitimci için yapılandırma. None ise 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_factory sağlandığında ve ortamın verileri kendisinin sahip olduğu (veya prosedürel olarak ürettiği) ve istemi reset() metodundan döndürdüğü durumlarda atlanabilir. Bu durumda, eğitim süresini tanımlamak için max_steps ayarlanmalı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. None ise, 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 olarak tokenizer.eos_token kullanı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. Modelinizde AdamW örneği ve args tarafı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ı. None ise model sarılmaz. vLLM sunucusu --enable-lora ile 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 (Callable listesi, 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 (EnvironmentFactory veya dict[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çıklanan tools yukarıda açıklanan reset yöntemini de uygulamalıdır; bu yöntem, üretimler arasında durumu sıfırlamak için kullanılabilir. reset yöntemi None veya bir dize döndürmelidir: bir dize döndürdüğünde, bu dize üretimden önce son kullanıcı mesajına eklenir. Ortam ayrıca get_reward argüman almayan ve float: varsa, ödülün sahibi ortam olur ve get_reward tamamlanan 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 ve reward_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 environment alanı 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

rollout süreci:

>>> class CurriculumTrainer(AsyncGRPOTrainer):
...     loop_cls = CurriculumRolloutLoop

AsyncRolloutLoop

sınıf trl.experimental.async_grpo.AsyncRolloutLoop

< >

( 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_generations değerindeki rollout grubu puanlanır: ödülleri, eğitimcinin reward_funcs bileşenlerinin, get_reward tanımlayan ortamların ve Rollout.reward değ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

< >

( row_index: introw: dict[str, typing.Any]epoch: int ) → bool

Parametreler

  • row_index (int) — Eğitim veri setindeki satırın indeksi.
  • row (dict[str, Any]) — Veri seti satırı.
  • epoch (int) — Bundan önce veri setinin üzerinde tamamlanan tam geçiş sayısı.

Dönüş değeri

bool

True, istem için num_generations rollout üretmek için; False, bunu atlamak için.

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

< >

( 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ğitimcinin tools değerleri ve environment_factory kullanıldığında ortamın herkese açık yöntemleri.
  • group_id (int, isteğe bağlı, varsayılan 0) — Rollout'un ait olduğu grubun tanımlayıcısı.

Dönüş değeri

Rollout

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

< >

( prompt_ids: list[int] ) → TurnRecord

Parametreler

  • prompt_ids (list[int]) — Tam istemcinin token kimlikleri.

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

< >

( group: RolloutGroup ) → np.ndarray

Parametreler

  • group (RolloutGroup) — Bir istemin num_generations rollout'ları, toplam ödülleri group.rewards iç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.

kurulum

< >

( )

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.

kapat

< >

( )

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

< >

( 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ına completions olarak iletilir.
  • completion_ids (list[int]) — Üretilen tamamlamanın token kimlikleri. Ödül fonksiyonlarına completion_ids olarak 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ılan 0) — Rollout sırasında yapılan araç çağrılarının sayısı.
  • tool_failure_count (int, isteğe bağlı, varsayılan 0) — 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. None ise, 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

< >

( 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_ids iç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_ids içindeki her token için bir değer: token üzerinde eğitim yapmak için 1, yalnızca bağlam olarak tutmak için 0. None ise, her çıktı token üzerinde eğitim yapılır.
  • output_sampling_mask (list[list[int]], isteğe bağlı) — output_ids içindeki her token için bir liste: örnekleyicinin top_k / top_p kırpma işlemi altında çekebileceği token kimlikleri. None ise, tam sözlük.
  • output_sampler_logprobs (list[dict[int, float]], isteğe bağlı) — output_ids iç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

< >

( 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ürecinde 0'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_reward tanımlayan bir rollout için ortam sınıfı ve ödülü; aksi halde None.
  • rollout_rewards (list[float or None]) — Her rollout'un Rollout.reward değeri.
  • queued_at (float, isteğe bağlı, varsayılan 0.0) — Grup, puanlama için kuyruğa alındığında time.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.

Update on GitHub