{"record":{"id":"bb440465cf5a8029","repo":"unslothai/unsloth","slug":"base-model-ships-ltx-2-3-as-single-file-checkp","errorCode":null,"errorMessage":"'{base_model}' ships LTX-2.3 as single-file checkpoints with no diffusers layout, so it cannot be a training base yet: the trainer loads a base with from_pretrained, while 2.3 has to be assembled with from_single_file plus components from the 2.0 base. Train from 'Lightricks/LTX-2' instead.","messagePattern":"'(.+?)' ships LTX-2\\.3 as single-file checkpoints with no diffusers layout, so it cannot be a training base yet: the trainer loads a base with from_pretrained, while 2\\.3 has to be assembled with from_single_file plus components from the 2\\.0 base\\. Train from 'Lightricks/LTX-2' instead\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"studio/backend/core/training/diffusion_train_common.py","lineNumber":1780,"sourceCode":"        # MiniMax-H3's official base, for the same reason: safetensors-only, no remote code.\n        \"minimaxai/minimax-h3\",\n    }\n)\n\n# LTX-2.3 repos hold SINGLE-FILE checkpoints (ltx-2.3-22b-*.safetensors) and no diffusers layout:\n# no model_index.json, no transformer/ or scheduler/ subfolder. Inference assembles them with\n# from_single_file plus 2.3 config overrides and components borrowed from the 2.0 base (see\n# core/inference/video_ltx2.py); the trainer only knows LTX2Pipeline.from_pretrained, which cannot\n# read that layout. The name still resolves to the ``ltx-2`` family, so without an explicit refusal\n# the run passes preflight, evicts the user's resident models, and only then fails in the child.\n_LTX23_TRAIN_UNSUPPORTED = (\"lightricks/ltx-2.3\", \"lightricks/ltx-2.3-fp8\")\n\n\ndef _refuse_ltx23_training_base(base_model: str) -> None:\n    \"\"\"Raise for an LTX-2.3 base: the family routing accepts it, the training loader cannot.\"\"\"\n    if str(base_model or \"\").strip().lower() not in _LTX23_TRAIN_UNSUPPORTED:\n        return\n    raise ValueError(\n        f\"'{base_model}' ships LTX-2.3 as single-file checkpoints with no diffusers layout, so it \"\n        f\"cannot be a training base yet: the trainer loads a base with from_pretrained, while 2.3 \"\n        f\"has to be assembled with from_single_file plus components from the 2.0 base. Train from \"\n        f\"'Lightricks/LTX-2' instead.\"\n    )\n\n\ndef _assert_trusted_base_model(base_model: str, *, allow_modular: bool = False) -> None:\n    \"\"\"Gate the training base model the same way the inference backend gates non-GGUF loads:\n    a local path or a trusted repo (``unsloth/*`` or an allowlisted official base). This runs\n    BEFORE ``from_pretrained`` so an untrusted remote repo (which could ship pickle weights)\n    is never fetched or deserialised.\n\n    ``allow_modular`` is for a trainer whose loader is ``ModularPipeline.from_pretrained``: a\n    local MiniMax-H3 pipeline carries ``modular_model_index.json`` and no ``model_index.json``,\n    so the conventional shape check rejected the one local layout that family HAS.\"\"\"\n    from core.inference.diffusion import _assert_local_base_is_pipeline, _is_trusted_diffusion_repo\n","sourceCodeStart":1762,"sourceCodeEnd":1798,"githubUrl":"https://github.com/unslothai/unsloth/blob/203007d19051dcd2ae33876786d117c99f6b0368/studio/backend/core/training/diffusion_train_common.py#L1762-L1798","documentation":"LTX-2.3 checkpoints ship as single files with no diffusers layout (no model_index.json, no transformer/ or scheduler/ subfolders). Inference assembles them with from_single_file plus 2.0-base components, but the trainer only knows pipeline.from_pretrained. The family router still resolves 'lightricks/ltx-2.3' to family ltx-2, so without this explicit refusal the run would pass preflight, evict the user's resident models, and only fail in the spawned child.","triggerScenarios":"Starting training with base_model='Lightricks/LTX-2.3' or 'Lightricks/LTX-2.3-fp8' (case-insensitive, whitespace-tolerant).","commonSituations":"User picks the newest LTX checkpoint seen working in inference and assumes it is trainable; UI family dropdown lists 2.3 repos without distinguishing trainability.","solutions":["Train from 'Lightricks/LTX-2' (the 2.0 diffusers-layout base) instead.","If you specifically need 2.3 weights, wait for trainer support or export/assemble a diffusers-layout repo from the 2.0 base — do not point the trainer at the single-file checkpoint."],"exampleFix":"# before\ncfg = DiffusionLoraConfig(base_model='Lightricks/LTX-2.3')\n# after\ncfg = DiffusionLoraConfig(base_model='Lightricks/LTX-2')","handlingStrategy":"validation","validationCode":"_LTX23 = ('lightricks/ltx-2.3', 'lightricks/ltx-2.3-fp8')\nif str(base_model or '').strip().lower() in _LTX23:\n    raise ValueError('LTX-2.3 cannot be a training base; use Lightricks/LTX-2')","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Filter base-model pickers by 'trainable: true' so inference-only repos never reach the trainer.","When a family adds a new checkpoint format, check whether the training loader supports it before advertising it."],"tags":["training","ltx-2","model-loading","diffusers","unsupported"],"backgroundTag":null,"analyzedSha":"203007d19051dcd2ae33876786d117c99f6b0368","analyzedAt":"2026-08-15T02:48:39.846Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}