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

  1. Start a fresh run for this family — its trainer has no resume capability.
  2. If you need resumable long runs, pick a family whose trainer writes checkpoint bundles (not in CHECKPOINTLESS_FAMILIES).
  3. 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

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


AI-assisted analysis of unslothai/unsloth@203007d190 (2026-08-15). Data as JSON: /api/errors/789d21b9f800015b. Report an issue: GitHub.