{"record":{"id":"8e34761f95e01f58","repo":"unslothai/unsloth","slug":"fam-name-cannot-run-on-apple-silicon-its-modu","errorCode":null,"errorMessage":"'{fam.name}' cannot run on Apple Silicon: its Modular Diffusers workflow places components through the Diffusers auto CPU offload, which needs a torch device exposing mem_get_info, and Metal (MPS) does not have it.{gguf_hint}","messagePattern":"'(.+?)' cannot run on Apple Silicon: its Modular Diffusers workflow places components through the Diffusers auto CPU offload, which needs a torch device exposing mem_get_info, and Metal \\(MPS\\) does not have it\\.(.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"studio/backend/core/inference/video.py","lineNumber":1115,"sourceCode":"                f\"'{fam.name}' cannot load from a single .safetensors checkpoint: it is assembled \"\n                f\"by its Modular Diffusers workflow, which builds every component from a repo. \"\n                f\"Load the diffusers pipeline repo '{fam.base_repo}' for the full bfloat16 \"\n                f\"model{gguf_hint}.\"\n            )\n        if fam.modular_workflow and kind == \"pipeline\":\n            # Metal cannot place a modular workflow at all. _load_h3_modular_pipeline hands every\n            # non-CPU device to ComponentsManager.enable_auto_cpu_offload, which reads\n            # torch.<device>.mem_get_info and raises NotImplementedError for a device module\n            # without one; torch.mps has never exposed it. Refuse here, before ~145 GB downloads\n            # and the resident pipeline is torn down to make room for it.\n            if resolve_diffusion_device_target().device == \"mps\":\n                gguf_hint = (\n                    f\" Load a .gguf checkpoint from '{fam.gguf_repo}' instead, which runs on the \"\n                    f\"native engine.\"\n                    if fam.gguf_repo\n                    else \"\"\n                )\n                raise ValueError(\n                    f\"'{fam.name}' cannot run on Apple Silicon: its Modular Diffusers workflow \"\n                    f\"places components through the Diffusers auto CPU offload, which needs a \"\n                    f\"torch device exposing mem_get_info, and Metal (MPS) does not have it.\"\n                    f\"{gguf_hint}\"\n                )\n            # Same normaliser the load uses, so a malformed value raises the identical message it\n            # would below and only a real scheme reaches the availability check.\n            requested_scheme = normalize_transformer_quant(transformer_quant)\n            # The base the modular load resolves for a pipeline kind IS repo_id, so a\n            # variant-keyed checkpoint is judged against the one the load will ask for and\n            # validation can never refuse a load that would have worked.\n            quant_base = repo_id\n            # \"auto\" is a request for the backend's own choice, not for a specific scheme, so it is\n            # never refused: it simply stays on the released bfloat16 components.\n            if requested_scheme is not None and requested_scheme != TQ_AUTO:\n                # Asked per (scheme, TASK), not per scheme. A family can host one denoiser per\n                # workflow partition in the same repo -- MiniMax-H3 hosts a keyframe (fl2va, which\n                # also covers text-only) and a reference (ref2va) checkpoint -- and the two share","sourceCodeStart":1097,"sourceCodeEnd":1133,"githubUrl":"https://github.com/unslothai/unsloth/blob/203007d19051dcd2ae33876786d117c99f6b0368/studio/backend/core/inference/video.py#L1097-L1133","documentation":"A modular-workflow family cannot run on Apple Silicon: the load path hands every non-CPU device to Diffusers' ComponentsManager.enable_auto_cpu_offload, which requires torch.<device>.mem_get_info, and torch.mps has never exposed it (NotImplementedError). The gate refuses before ~145 GB of downloads and before the resident pipeline is evicted.","triggerScenarios":"Requesting a pipeline-kind load of a modular-workflow family on a host whose resolve_diffusion_device_target().device == 'mps' (any Apple Silicon Mac with the default Metal device).","commonSituations":"Mac users selecting the largest modular models because they appear in the model list; configs synced from a CUDA machine to an M-series Mac; assuming MPS offload works like CUDA offload.","solutions":["If the family has a gguf_repo (the message appends the hint), load a .gguf checkpoint on the native engine instead.","Otherwise pick a non-modular supported family that runs on MPS.","Run the modular family on a CUDA host; no memory_mode or device override makes mem_get_info exist on MPS."],"exampleFix":"# before (on Apple Silicon)\nload_video_model(repo_id='<modular-family-pipeline-repo>')  # refused\n\n# after (on Apple Silicon)\nload_video_model(repo_id='<family-gguf-repo>', gguf_filename='model-Q4_K_M.gguf')  # native engine","handlingStrategy":"validation","validationCode":"from core.inference.diffusion_device import resolve_diffusion_device_target\nfam = _detect_load_family(repo_id, gguf_filename, family_override)\nblocked_on_mps = (\n    fam is not None and getattr(fam, 'modular_workflow', False)\n    and resolve_diffusion_device_target().device == 'mps'\n)\n# if blocked_on_mps: use fam.gguf_repo + a .gguf file, or another family","typeGuard":null,"tryCatchPattern":"try:\n    load_video_model(repo_id=r)\nexcept ValueError as e:\n    if 'cannot run on Apple Silicon' in str(e) and fam.gguf_repo:\n        load_video_model(repo_id=fam.gguf_repo, gguf_filename=pick_quant(fam.gguf_repo))\n    else:\n        raise","preventionTips":["Gate modular-workflow families out of the picker on MPS devices.","On Apple Silicon, prefer GGUF checkpoints which run on the native engine.","No memory_mode or device setting substitutes for the missing torch.mps.mem_get_info; do not try to override."],"tags":["video","mps","apple-silicon","hardware-support","modular-workflow"],"backgroundTag":null,"analyzedSha":"203007d19051dcd2ae33876786d117c99f6b0368","analyzedAt":"2026-08-15T02:48:39.846Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}