unslothai/unsloth · error · ValueError
resume_from_checkpoint is not supported for {resolved_family
Error message
resume_from_checkpoint is not supported for {resolved_family}: its trainer writes no checkpoint bundle, so there is nothing to continue from and the run would silently start over and overwrite its output. Start a fresh run. What it means
Raised when resume_from_checkpoint is set for a family in CHECKPOINTLESS_FAMILIES (the H3 loop). That trainer writes no checkpoint bundle at all, so there is literally nothing to resume from — previously this was accepted silently and the 'resume' started a FRESH optimization that overwrote the very outputs it was meant to continue. Validation now refuses it where it costs nothing.
Source
Thrown at studio/backend/core/training/diffusion_train_common.py:1078
) from exc
if save_steps < 0:
raise ValueError("save_steps must be >= 0 (0 disables periodic checkpoints)")
if save_total_limit < 0:
raise ValueError("save_total_limit must be >= 0 (0 keeps every checkpoint)")
# A blank resume path (the Studio default when the field is present but unset) means "fresh run", not the outputs root.
resume_from_checkpoint = (
str(self.resume_from_checkpoint).strip()
if self.resume_from_checkpoint is not None
else ""
) or None
# The H3 loop does not checkpoint: it neither writes a resume bundle nor restores one.
# Accepting these two silently was the dangerous part -- a caller handing over a resume
# bundle got a FRESH optimization that then overwrote the outputs it was meant to
# continue, and one asking for periodic saves got none, both discovered only after an
# expensive run. Refuse in validation, where it costs nothing, until the loop supports it.
if resolved_family in CHECKPOINTLESS_FAMILIES:
if resume_from_checkpoint:
raise ValueError(
f"resume_from_checkpoint is not supported for {resolved_family}: its trainer "
f"writes no checkpoint bundle, so there is nothing to continue from and the "
f"run would silently start over and overwrite its output. Start a fresh run."
)
if save_steps:
raise ValueError(
f"save_steps is not supported for {resolved_family}: its trainer writes no "
f"checkpoint bundle. Leave it at 0; the adapter is still saved at the end."
)
try:
ema_decay = float(self.ema_decay or 0.0)
except (TypeError, ValueError) as exc:
raise ValueError(f"ema_decay must be a number, got {self.ema_decay!r}") from exc
# decay = 1.0 would freeze the shadow at its init forever; the update is shadow * decay + param * (1 - decay), so valid decays live in [0, 1).
if not 0.0 <= ema_decay < 1.0:
raise ValueError("ema_decay must be in [0, 1); 0 disables the EMA adapter")
# A blank cond_cache_dir (the Studio default when unset) means "off", not cwd.
cond_cache_dir = (View on GitHub (pinned to 203007d190)
Solutions
- Start a fresh run for this family — its trainer has no resume capability.
- If you need resumable long runs, pick a family whose trainer writes checkpoint bundles (not in CHECKPOINTLESS_FAMILIES).
- Gate any generic resume automation on family capability: skip/flag checkpointless families instead of submitting.
Example fix
# before config = TrainConfig(base_model='h3-family-model', resume_from_checkpoint='outputs/run-42') # after config = TrainConfig(base_model='h3-family-model') # fresh run; H3 cannot resume
Defensive patterns
Strategy: validation
Validate before calling
CHECKPOINTLESS_FAMILIES = {...} # mirror the trainer's set
def check_resume(family, resume_from_checkpoint) -> None:
path = str(resume_from_checkpoint).strip() if resume_from_checkpoint is not None else ""
if family in CHECKPOINTLESS_FAMILIES and path:
raise ValueError(
f"family {family} writes no checkpoint bundle; resume would silently "
f"overwrite outputs — start a fresh run"
) Type guard
def family_supports_resume(family) -> bool:
return family not in CHECKPOINTLESS_FAMILIES Try / catch
try:
session.submit_training(config)
except ValueError as e:
if "resume_from_checkpoint is not supported" in str(e):
config.resume_from_checkpoint = None # degrade to a fresh run, do NOT blind-retry
session.submit_training(config)
else:
raise Prevention
- Never auto-resume by family-agnostic logic — gate on a family->capability map first.
- Treat 'resume accepted silently' as a red flag: this error exists precisely because silent acceptance destroyed outputs.
- Hide/disable resume UI affordances for checkpointless families.
When it happens
Trigger: Submitting a resume request for a checkpointless family: resume_from_checkpoint pointing at any path (a blank/whitespace-only path is treated as fresh-run and allowed; only a non-empty path triggers this). Typically a generic resume workflow applied uniformly across families.
Common situations: An orchestration layer that auto-resumes interrupted jobs by family-agnostic logic; users clicking 'resume' in a UI that shows the option for every family; crash-recovery scripts that always pass the last output dir.
Related errors
- save_steps / save_total_limit must be whole numbers, got {se
- save_steps must be >= 0 (0 disables periodic checkpoints)
- save_total_limit must be >= 0 (0 keeps every checkpoint)
- save_steps is not supported for {resolved_family}: its train
- This run has {len(trainable)} trainable tensors and the chec
AI-assisted analysis of unslothai/unsloth@203007d190 (2026-08-15).
Data as JSON: /api/errors/789d21b9f800015b.
Report an issue: GitHub.