{"record":{"id":"66c4364ae2dca3a9","repo":"OpenBMB/VoxCPM","slug":"voxcpmmodel-can-only-be-optimized-on-cuda-device","errorCode":null,"errorMessage":"VoxCPMModel can only be optimized on CUDA device","messagePattern":"VoxCPMModel can only be optimized on CUDA device","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/voxcpm/model/voxcpm.py","lineNumber":234,"sourceCode":"            apply_lora_to_named_linear_modules(\n                self.feat_decoder.estimator, target_submodule_names=cfg.target_modules_dit, **lora_kwargs\n            )\n\n        # 投影层\n        if cfg.enable_proj:\n            from ..modules.layers.lora import LoRALinear\n\n            for attr_name in cfg.target_proj_modules:\n                module = getattr(self, attr_name, None)\n                if isinstance(module, nn.Linear):\n                    setattr(self, attr_name, LoRALinear(base=module, **lora_kwargs))\n\n    def optimize(self, disable: bool = False):\n        if disable:\n            return self\n        try:\n            if self.device != \"cuda\":\n                raise ValueError(\"VoxCPMModel can only be optimized on CUDA device\")\n            try:\n                import triton  # noqa: F401\n            except ImportError:\n                raise ValueError(\"triton is not installed\")\n            self.base_lm.forward_step = torch.compile(self.base_lm.forward_step, mode=\"reduce-overhead\", fullgraph=True)\n            self.residual_lm.forward_step = torch.compile(\n                self.residual_lm.forward_step, mode=\"reduce-overhead\", fullgraph=True\n            )\n            self._feat_encoder_raw = self.feat_encoder\n            self.feat_encoder = torch.compile(self.feat_encoder, mode=\"reduce-overhead\", fullgraph=True)\n            self.feat_decoder.estimator = torch.compile(\n                self.feat_decoder.estimator, mode=\"reduce-overhead\", fullgraph=True\n            )\n        except Exception as e:\n            print(f\"Warning: torch.compile disabled - {e}\", file=sys.stderr)\n        return self\n\n    def forward(","sourceCodeStart":216,"sourceCodeEnd":252,"githubUrl":"https://github.com/OpenBMB/VoxCPM/blob/f5a1c6a6b901bc732e20f0d59a369f6829ad717a/src/voxcpm/model/voxcpm.py#L216-L252","documentation":"VoxCPMModel.optimize uses torch.compile on forward steps, which requires the model to live on a CUDA device; calling optimize() on CPU/MPS raises ValueError (unless disable=True).","triggerScenarios":"model = VoxCPM(device='cpu' or 'mps', optimize=True) — from_local passes optimize through, or calling model.optimize() manually on non-CUDA.","commonSituations":"Prototyping on a laptop/Mac with optimize=True copied from a GPU recipe, or device='auto' resolving to CPU in a GPU-less container.","solutions":["Set optimize=False (or disable=True) when not on CUDA","Run on a CUDA device if you need the compiled fast path","Confirm the effective device (model.device) before enabling optimize"],"exampleFix":"# before\nmodel = VoxCPM(arch=\"v1\", device=\"cpu\", optimize=True)\n# after\nmodel = VoxCPM(arch=\"v1\", device=\"cpu\", optimize=False)","handlingStrategy":"fallback","validationCode":"effective_device = model.tts_model.device if hasattr(model, 'tts_model') else None\noptimize = optimize and effective_device == \"cuda\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Gate optimize on actual runtime device, not intent","Set optimize=False in CPU dev configs"],"tags":["optimization","torch-compile","cuda-only"],"backgroundTag":"cuda-only-feature","analyzedSha":"f5a1c6a6b901bc732e20f0d59a369f6829ad717a","analyzedAt":"2026-08-27T05:54:30.617Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}