feat: add tensor-parallel entropy loss benchmark
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 25/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Bastante claro
- Estado de actividad
- Tranquilo
- Stack tecnológico
- python
- Área
- devtools, performance
Línea de trabajo
Start with tools/benchmark/bench_entropy_loss.py to see the existing single-GPU variants, then read tools/benchmark/runner.py and main.py to understand the current single-process flow. The issue leaves open whether to add a new tools/benchmark/run_tp.py (Option A) or extend main.py with a --tp flag (Option B), so settle that with a maintainer first. Done means the three TP variants run across the five (vocab, tp_size) shapes with synchronized timing and OOM reported for pytorch_gather.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Motivation
The Triton entropy loss kernel supports tensor-parallel training natively via its group parameter: each rank holds vocab / tp_size logits, all-reduces two scalars per row (max and sum-exp), then computes loss and grad locally. This avoids materializing the full logits on any rank.
The PyTorch alternative requires an all-gather of the full logit tensor first — O(tokens × vocab) communication. At realistic scale this is prohibitive:
- Llama 3.1 405B: vocab=128K, tokens=8K, TP=8 → 16 GB all-gather per step
The Triton path is not just faster; it is the only feasible approach at large vocab × TP. The current single-GPU benchmark does not demonstrate this. This issue tracks building a multi-GPU benchmark that makes it concrete.
Variants to benchmark
Three qualitatively different approaches:
-
triton_tp— existingtriton_entropy_loss_forward_backward(..., group=group). Shards vocab across ranks, all-reduces two scalars per row. O(tokens) communication. -
pytorch_tp_manual— same algorithm in PyTorch without Triton:local_max = logits.max(-1)→all_reduce(MAX)→local_sum = (logits − max).exp().sum(-1)→all_reduce(SUM)→ loss. Tests whether Triton fusion still wins when both paths use the same O(tokens) communication pattern. -
pytorch_gather— all-gather logits to full vocab on each rank, thenF.cross_entropy. O(tokens × vocab) communication. Included as a reference to show where the naive approach becomes infeasible; expected to OOM at large vocab × TP.
Shapes
Fix tokens=4096. Sweep (vocab, tp_size) pairs:
| vocab | tp_size | shard / rank |
|---|---|---|
| 32768 | 2 | 16384 |
| 32768 | 4 | 8192 |
| 65536 | 4 | 16384 |
| 131072 | 4 | 32768 |
| 131072 | 8 | 16384 |
Infrastructure changes
Multi-process runner
The current runner.py is single-process. Two options:
Option A — new tools/benchmark/run_tp.py entry point using torch.multiprocessing.spawn(worker, nprocs=tp_size). Each worker: initializes dist.init_process_group, creates a TP process group, runs benchmark variants with group=group, rank 0 collects and prints results.
Option B — extend __main__.py to detect a --tp N flag and re-launch itself via torchrun --nproc_per_node=N.
Option A is simpler to implement. Option B integrates more cleanly with the existing CLI.
Timing
dist.barrier()+torch.cuda.synchronize()before and after each timed region so all ranks agree on wall time.- Report max latency across ranks (rank 0 collects via
dist.all_reduce(MAX)). - Communication time is included automatically since the all-reduce is inside the kernel call.
OOM guard for pytorch_gather
Wrap in try/except and report OOM in the table instead of a time. This makes the table show exactly where the naive approach becomes infeasible.
Expected outcome
At vocab=131072, TP=8:
| variant | result |
|---|---|
triton_tp |
fast (~O(tokens) communication) |
pytorch_tp_manual |
slightly slower (no kernel fusion, same communication) |
pytorch_gather |
OOM or ~10–20× slower (16 GB all-gather dominates) |
Files
- New:
tools/benchmark/run_tp.py(or extend__main__.py) - Modified:
tools/benchmark/bench_entropy_loss.py— add TP variants alongside existing single-GPU variants
- Lenguaje dominante
- Python
- Estrellas
- 337
- Forks
- 52
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
- Incluye un Dockerfile o un archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de ServiceNow/Fast-LLM
-
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
ServiceNow/Fast-LLM#556 ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 30/100
ServiceNow/Fast-LLM#538 ·
-
enhancement
Dificultad 5/5 Más de una semana Aptitud para principiantes 12/100
ServiceNow/Fast-LLM#533 ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 15/100
ServiceNow/Fast-LLM#510 · 1 comentario ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 12/100
ServiceNow/Fast-LLM#507 ·
Todos los issues de ServiceNow/Fast-LLM
Issues similares
-
changelog investigate
Dificultad 2/5 1-3 horas Aptitud para principiantes 67/100
ramnes/notion-sdk-py#433 ·
-
docs pkg:core
Dificultad 1/5 Menos de una hora Aptitud para principiantes 84/100
pydantic/pydantic-ai#11929 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
intake/intake-esm#789 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
MemMachine/MemMachine#1877 ·
Los mantenedores suelen responder en 3 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
openedx/openedx-authz#579 ·
Los mantenedores suelen responder en 1 día