Spaces:
Sleeping
Sleeping
Preserve legacy checkpoint output weights
Browse files
src/tiny_transformer/train.py
CHANGED
|
@@ -151,6 +151,7 @@ def save_checkpoint(
|
|
| 151 |
"tokenizer": tokenizer.to_dict(),
|
| 152 |
"step": step,
|
| 153 |
"parameter_count": model.parameter_count(),
|
|
|
|
| 154 |
}
|
| 155 |
if optimizer is not None:
|
| 156 |
payload["optimizer_state"] = optimizer.state_dict()
|
|
@@ -164,6 +165,10 @@ def load_checkpoint(path: str, device: str = "cpu") -> tuple[TinyTransformer, To
|
|
| 164 |
tokenizer = tokenizer_from_dict(payload["tokenizer"])
|
| 165 |
config = ModelConfig(**payload["model_config"])
|
| 166 |
model = TinyTransformer(config).to(device)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 167 |
model.load_state_dict(payload["model_state"])
|
| 168 |
model.eval()
|
| 169 |
return model, tokenizer
|
|
|
|
| 151 |
"tokenizer": tokenizer.to_dict(),
|
| 152 |
"step": step,
|
| 153 |
"parameter_count": model.parameter_count(),
|
| 154 |
+
"weight_tied": model.lm_head.weight is model.token_embedding.weight,
|
| 155 |
}
|
| 156 |
if optimizer is not None:
|
| 157 |
payload["optimizer_state"] = optimizer.state_dict()
|
|
|
|
| 165 |
tokenizer = tokenizer_from_dict(payload["tokenizer"])
|
| 166 |
config = ModelConfig(**payload["model_config"])
|
| 167 |
model = TinyTransformer(config).to(device)
|
| 168 |
+
if not payload.get("weight_tied", False):
|
| 169 |
+
# Checkpoints created before weight tying stored independent embedding and
|
| 170 |
+
# output matrices. Preserve that behavior so older demos remain compatible.
|
| 171 |
+
model.lm_head = torch.nn.Linear(config.n_embd, config.vocab_size).to(device)
|
| 172 |
model.load_state_dict(payload["model_state"])
|
| 173 |
model.eval()
|
| 174 |
return model, tokenizer
|