Proposal: load an FTW with fp16 NVFP4 global scales (upcast with a warning) instead of refusing it after #739
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 48/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Área
- backend, machine-learning
Línea de trabajo
Start with python/freetoken/checkpoint/ftw.py and trace iter_ftw_weights, load_ftw_banks, and load_ftw_banks_to_device, including the bank allocation and read paths. Read the existing NVFP4 dtype checks and the scripts/ftw_hotfix.py and docs/models.md guidance. Add coverage for loading fp16 global scales as fp32, including the warning and inference-mode behavior; done means the load succeeds with the stated values and the docs describe when to reconvert.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Proposal
Since #739, FTWReader refuses every NVFP4 FTW that stores its global scales as fp16, which is every NVFP4 FTW converted before #739. The only fix it offers is a full reconversion from the source checkpoint. Not every user still has that checkpoint. For Qwen3.8-Flash-Next-NVFP4 a reconversion means downloading about 120 GB again and converting it, and until then the server will not start at all.
The fp16 rounding cannot be undone (as #739 says), but it does not have to block loading. Upcasting the stored fp16 values to fp32 at load gives exactly the numerics every pre-#739 build served from the same file. Proposal:
FTWReaderlogs a one-time warning ("this FTW stores NVFP4 global scales as fp16 (converted before #739); serving them upcast to fp32, which keeps the old precision; reconvert withft checkpointto get the fp32 globals"), not aValueError.- The dense, host-bank and device-bank read paths read an fp16 global entry into a staging buffer and copy it into the fp32 destination.
scripts/ftw_hotfix.pyanddocs/models.mddescribe the warning and the reason to reconvert, not a hard failure.
Users get the precision fix by reconverting when they can, and their existing checkpoints keep working until they do.
Minimal reproduction of the refusal (CPU only, PYTHONPATH=python):
import json, os, tempfile
from freetoken.checkpoint.ftw import FTWReader, INDEX_NAME, FORMAT_TAG
d = tempfile.mkdtemp()
with open(os.path.join(d, INDEX_NAME), "w") as f: # index of an NVFP4 FTW written before #739
json.dump({"format": FORMAT_TAG, "shards": [], "tensors": [
{"name": "gate_up_global#L00000", "dtype": "float16", "shape": [256, 1024]}]}, f)
try:
FTWReader(d)
except ValueError as e:
print("ValueError:", e)
ValueError: '/tmp/user/1000/tmps9e9_aju' stores NVFP4 global scales as fp16 (e.g. 'gate_up_global#L00000') but FreeToken reads them as fp32; reconvert it from the source checkpoint with `ft checkpoint`
Cause (current main, cc56b6bd)
python/freetoken/checkpoint/ftw.py:229-234:FTWReader.__init__raises on any fp16 entry that_is_nvfp4_global(:105-107) matches.- The readers copy raw bytes into banks sized from the index dtype:
iter_ftw_weights(:376), andload_ftw_banks_read_row/_read_layer(:614-625), which usereader.read_into(bank.memoryview(), ...).load_ftw_banks_to_device(:707) does the same. So an upcast needs an fp32 destination plus an fp16 staging read for these entries. It cannot just change the dtype the reader reports.
Proposed fix
- Replace the
ValueErrorwith a one-timelogger.warning. Record which global entries are fp16. - In the three read paths, allocate fp32 for those entries, read the fp16 bytes into a transient buffer, and
copy_(upcast) into the bank. The scheduler builds the engine, and with it the host banks, undertorch.inference_mode()(server/launch.py:79-81), and theThreadPoolExecutorreader threads inload_ftw_banksdo not inherit that mode. The in-place copy in those threads must therefore run insidewith torch.inference_mode():, or it raises on inference tensors. - A test: write a small FTW with fp16 globals, load it under
torch.inference_mode()the way the engine does, and check that the warning appears once and that the globals come back as fp32, equal to the fp16 values.
Environment
Seen serving nvidia/Qwen3.8-Flash-Next-NVFP4 from an FTW converted before #739, on an RTX 5080 16 GB (sm_120, driver 615.78.08), torch 2.14.1+cu130; reproduction CPU-only on main cc56b6bd.
- Lenguaje dominante
- Python
- Estrellas
- 14.2k
- Forks
- 1.4k
- Merge medio
- 21 h 39 min
- PR fusionados (30 d)
- 100
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
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 FlashML-org/FreeToken
-
Desktop feature
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
FlashML-org/FreeToken#800 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
FlashML-org/FreeToken#767 ·
Los mantenedores suelen responder en 1 día
-
test_gemv_path_matches_the_transcription fails on sm_120 (bf16 rounding tie exceeds the tolerance)Posiblemente ocupada @void-mckenzie la tomó hace 17 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 77/100
FlashML-org/FreeToken#649 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
FlashML-org/FreeToken#648 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
FlashML-org/FreeToken#646 · 1 comentario ·
Los mantenedores suelen responder en 1 día
Todos los issues de FlashML-org/FreeToken
Issues similares
-
infrastructure
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
NatLabRockies/H2Integrate#977 ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
topoteretes/cognee#6470 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
-
area:docs priority:p2 type:docs wave:9
Dificultad 1/5 Menos de una hora Aptitud para principiantes 84/100
jejjohnson/radtrax#293 ·
Los mantenedores suelen responder en 1 día
-
bug core plugins
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
bunkerity/bunkerweb#4121 · 1 comentario ·
Los mantenedores suelen responder en 1 día