StreamingSafetensorSaver keeps the files of a previous export, so reloading returns the old weights
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 76/100
Direzione di ricerca
Inizia con StreamingSafetensorSaver e il suo metodo finalize() nelle utility di safetensors; l’issue descrive il comportamento di salvataggio che non funziona e fornisce una riproduzione con SafetensorLazyLoader. Verifica come vengono finalizzate le esportazioni in un singolo file e in più shard in una directory di output esistente. Il lavoro è completato quando una seconda esportazione lascia solo i propri file e il ricaricamento restituisce esattamente i tensori appena scritti.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Bug Description / Bug 描述
StreamingSafetensorSaver writes each shard as model-NNNNN-of-?????.safetensors and renames them in finalize(). Nothing removes the files that an earlier export left in the same directory, so a second export inherits them:
- A sharded export followed by a single-file export keeps the stale index.
finalize()writesmodel.safetensorsbut themodel.safetensors.index.jsonfrom the previous run stays.SafetensorLazyLoaderreads the index when it exists, so reloading the directory returns the previous tensors under the same keys, silently. - A 4-shard export followed by a 2-shard export keeps the extra shard files. The index is rewritten, but
model-0000{3,4}-of-00004.safetensorsstay on disk. - The rename can abort the save.
finalize()usesos.rename, which raisesFileExistsErrorwhen the target name of the previous export is still present, so re-saving into the same directory fails instead of replacing the checkpoint.
GPTBridge.save_weights(..., output_dir=...) takes an arbitrary directory, and re-running training into the same output directory is the normal way to refresh a merged checkpoint, so this is reachable from the documented API.
How to Reproduce / 如何复现
import tempfile
from pathlib import Path
import torch
from mcore_bridge.utils.safetensors import SafetensorLazyLoader, StreamingSafetensorSaver
d = Path(tempfile.mkdtemp())
# An earlier 3-shard export, as left behind by a previous run.
from safetensors.torch import save_file
import json
save_file({'w0': torch.zeros(3), 'w1': torch.zeros(3)}, str(d / 'model-00001-of-00003.safetensors'))
save_file({'w2': torch.zeros(3)}, str(d / 'model-00002-of-00003.safetensors'))
save_file({'w3': torch.zeros(3)}, str(d / 'model-00003-of-00003.safetensors'))
(d / 'model.safetensors.index.json').write_text(json.dumps({'metadata': {'total_size': 48}, 'weight_map': {
'w0': 'model-00001-of-00003.safetensors', 'w1': 'model-00001-of-00003.safetensors',
'w2': 'model-00002-of-00003.safetensors', 'w3': 'model-00003-of-00003.safetensors'}}))
# Re-export the model now that it fits in one file.
saver = StreamingSafetensorSaver(save_dir=str(d), max_shard_size='5GB')
saver.add_tensor('w0', torch.arange(4, dtype=torch.float32))
saver.finalize()
print(sorted(p.name for p in d.iterdir()))
# ['model-00001-of-00003.safetensors', 'model-00002-of-00003.safetensors',
# 'model-00003-of-00003.safetensors', 'model.safetensors', 'model.safetensors.index.json']
loaded = SafetensorLazyLoader(str(d)).get_state_dict()
print(sorted(loaded)) # ['w0', 'w1', 'w2', 'w3'] - three tensors that are no longer saved
print(loaded['w0'].load().tolist()) # [0.0, 0.0, 0.0] - the old values, not [0, 1, 2, 3]
Expected behavior / 预期行为
The directory holds exactly the files of the export that just ran: model.safetensors here, no stale shards, no stale index. Reloading it returns the tensors that were written.
Environment info / 环境信息
-
mcore_bridgemain at6160abe -
torch2.8.0,safetensors0.8.0 -
Reproduced on both Linux and Windows
-
I have searched existing issues, and this is a new bug report. / 我已经搜索过现有的 issues,确认这是一个新的 bug report。
- Lingua principale
- Python
- Stelle
- 106
- Fork
- 53
- Merge medio
- 2g 6h
- PR unite (30g)
- 18
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
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di modelscope/mcore-bridge
-
[Bug] GLM-5.3 hybrid absorbed MLA silently bypasses KV-up LoRA gradients via direct .weight accessAperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 38/100
modelscope/mcore-bridge#262 ·
I maintainer di solito rispondono entro 1 giorno
-
GDN input RMSNorm gradients are multiplied by TP size during Qwen3.8-27B trainingForse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Apertabug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
modelscope/mcore-bridge#241 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 42/100
modelscope/mcore-bridge#229 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
modelscope/mcore-bridge#188 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
question
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
modelscope/mcore-bridge#182 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di modelscope/mcore-bridge
Issue simili
-
enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
Sienna-Platform/SiennaSchemas#130 ·
I maintainer di solito rispondono entro 3 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
firedrakeproject/Irksome#293 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
ida-arbeitszeit/workers-control#1578 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
aws-samples/sample-per-model-bedrock#898 ·
I maintainer di solito rispondono entro 1 giorno