{"record":{"id":"176adf35662eec86","repo":"sgl-project/sglang","slug":"sleep-wake-does-not-support-fsdp-inference","errorCode":null,"errorMessage":"sleep/wake does not support FSDP inference","messagePattern":"sleep/wake does not support FSDP inference","errorType":"validation","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/managers/memory_managers/memory_occupation_controller.py","lineNumber":185,"sourceCode":"    def _restore_modules_to_original_devices(\n        self, module_device_map: dict[str, str]\n    ) -> None:\n        grouped: dict[str, list[str]] = {}\n        for name, device in module_device_map.items():\n            grouped.setdefault(device, []).append(name)\n\n        for device, names in grouped.items():\n            self._move_modules(names, device)\n\n    def release_memory_occupation(self) -> dict[str, bool | str]:\n        logger.info(f\"[SLEEP] release_memory_occupation rank={self.rank}\")\n        if self._sleeping:\n            return self._memory_occupation_result(\n                success=True,\n                message=\"already sleeping\",\n            )\n        if self.use_fsdp_inference:\n            raise RuntimeError(\"sleep/wake does not support FSDP inference\")\n        if self.pipeline is None:\n            return self._memory_occupation_result(\n                success=False,\n                message=\"pipeline not initialized\",\n            )\n\n        self._sleep_restore_map = self._offload_active_modules_to_cpu()\n        self._sleeping = True\n        return self._memory_occupation_result(\n            success=True,\n            message=\"released GPU memory (moved active modules to CPU)\",\n        )\n\n    def resume_memory_occupation(self) -> dict[str, bool | str]:\n        logger.info(f\"[WAKE] resume_memory_occupation rank={self.rank}\")\n        if not self._sleeping:\n            return self._memory_occupation_result(\n                success=True,","sourceCodeStart":167,"sourceCodeEnd":203,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/managers/memory_managers/memory_occupation_controller.py#L167-L203","documentation":"Raised by release_memory_occupation when sleep/wake (memory offload) is attempted while the controller was configured with use_fsdp_inference=True. FSDP shards/owns parameter placement, so the module-moving offload strategy cannot be applied.","triggerScenarios":"Enabling FSDP inference (e.g. fsdp inference config) and then calling release_memory_occupation / sleep on the controller.","commonSituations":"Enabling FSDP for large-model memory savings and then trying to reuse a sleep/wake RL workflow that expects plain module offload; config drift where both flags end up enabled.","solutions":["Disable FSDP inference if you need sleep/wake offload","Keep FSDP and drop sleep/wake from the workflow","Gate the code: skip release_memory_occupation when use_fsdp_inference is set"],"exampleFix":"// before\ncontroller.release_memory_occupation()  # with use_fsdp_inference=True\n// after\nif not controller.use_fsdp_inference:\n    controller.release_memory_occupation()","handlingStrategy":"validation","validationCode":"if controller.use_fsdp_inference:\n    raise RuntimeError(\"sleep/wake unavailable under FSDP; disable FSDP first\")","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never enable FSDP inference and sleep/wake together","Add a config-time assertion rejecting the combination"],"tags":["fsdp","sleep-wake","feature-unsupported"],"backgroundTag":"unsupported-feature-combination","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}