Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Low-precision rollout normalization can overflow its divisor and erase advantages

Aperta Adatta ai principianti
#661 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 2 giorni

@lll-hhh ci sta già lavorando.

Dal 29/10/2026.

  • #662 di @lll-hhh — aperta

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
76/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
python, pytorch

Direzione di ricerca

Inizia da normalize_advantages_by_rollout in agentlightning/verl/per_rollout_loss.py e segui come costruisce il divisore e accumula i conteggi dei token. Riproduci l’esempio float16 dell’issue, quindi controlla su CPU i casi indicati per float16, bfloat16, float32, float64 e i gradienti. Il lavoro è terminato quando i conteggi restano esatti, il divisore e la divisione usano almeno float32, il tipo di dato dell’output del chiamante viene preservato e il raggruppamento dei rollout e il divisore delle righe addestrate restano invariati.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

normalize_advantages_by_rollout constructs the rollout divisor in advantages.dtype. With float16 advantages, a representable normalized result can become zero because the intermediate divisor overflows. Token counts are also converted to the advantage dtype before accumulation, which rounds counts such as 257 in bfloat16.

Reproduced on main 05c7fe133175653e48c990546a3509e52dc56512, Python 3.12.2, torch 2.13.0+cpu, VERL 0.8.0, with the locked verl-cpu development environment:

import torch
from agentlightning.verl.per_rollout_loss import normalize_advantages_by_rollout

mask = torch.ones(2, 1024, dtype=torch.long)
advantages = torch.ones(2, 1024, dtype=torch.float16)
scaled = normalize_advantages_by_rollout(
    advantages, mask, ["A", "A"], num_trained_rows=64
)
print(scaled.float().sum().item())  # 0.0; expected 1 / 64 == 0.015625

The divisor is 2048 * 64 = 131072, which becomes infinity in float16, while each correctly normalized advantage (1 / 131072) is representable. This can erase the policy-gradient contribution before the loss function sees it. This is separate from reward conversion before GRPO (#639/#640): the input here is an already nonzero advantage tensor.

Expected: retain exact token counts and evaluate the existing divisor and division in at least float32, then preserve the caller's output dtype. The rollout grouping and the existing trained-row divisor stay the same. A focused patch can cover float16 overflow, bfloat16 token-count rounding, float32/float64 controls, and gradient propagation on CPU.

This is a numerical reproduction, not a model-training or GPU-quality result. Codex assisted the investigation.

Lingua principale
Python
Stelle
18.8k
Fork
1.7k
Merge medio
3g 13h
PR unite (30g)
10

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di microsoft/agent-lightning

Tutte le issue di microsoft/agent-lightning

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.