{"record":{"id":"89fbe78abd207d00","repo":"sgl-project/sglang","slug":"unknown-old-param-type-old-param","errorCode":null,"errorMessage":"Unknown {old_param_type=} {old_param=}","messagePattern":"Unknown (.+?) (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/utils/offloader.py","lineNumber":472,"sourceCode":"        # manually checked how `w13_weight` and `w2_weight` are constructed\n        new_param = ModelWeightParameter(\n            data=new_data,\n            **{\n                k: getattr(old_param, k)\n                for k in [\"input_dim\", \"output_dim\", \"weight_loader\"]\n            },\n        )\n    elif old_param_type == torch.nn.Parameter:\n        new_param = torch.nn.Parameter(\n            data=new_data,\n            requires_grad=False,\n        )\n        if hasattr(old_param, \"weight_loader\"):\n            new_param.weight_loader = old_param.weight_loader\n        else:\n            new_param.weight_loader = lambda *args, **kwargs: None\n    else:\n        raise ValueError(f\"Unknown {old_param_type=} {old_param=}\")\n\n    setattr(module, param_name, new_param)\n\n\ndef _empty_strided_like(x: torch.Tensor, device, pin_memory=False):\n    return torch.empty_strided(\n        size=x.size(),\n        stride=x.stride(),\n        dtype=x.dtype,\n        layout=x.layout,\n        device=device,\n        pin_memory=pin_memory,\n    )\n\n\n# ----------------------------------------- ShardedGpu ------------------------------------------------------\n\n","sourceCodeStart":454,"sourceCodeEnd":490,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/utils/offloader.py#L454-L490","documentation":"_move_param_to_meta only knows how to move torch.nn.Parameter and torch.Tensor instances onto the meta device; any other object found in a module attribute fails with this ValueError. It is an internal path used by the offloader during init/post_init.","triggerScenarios":"A module attribute that looks like a parameter slot holds a non-tensor object (e.g. a custom DTensor/QuantizedParameter subclass or a plain object) when the offloader walks module parameters.","commonSituations":"Custom quantization or DTensor-wrapped parameters whose type is neither Parameter nor Tensor; version drift introducing new param container types in external libs.","solutions":["Upgrade sglang — quantized/DTensor param types are handled in newer offloader code","Ensure offloaded modules hold only standard Parameter/Tensor attributes","If writing custom layers, register exotic buffers via register_buffer with plain tensors"],"exampleFix":"# before\nclass MyLayer(nn.Module):\n    self.weight = QuantParam(...)  # not Parameter/Tensor\n# after\nclass MyLayer(nn.Module):\n    self.weight = nn.Parameter(...)\n    self.qstate = ...  # keep non-tensors out of param slots","handlingStrategy":"type-guard","validationCode":"import torch\nassert all(isinstance(p, (torch.nn.Parameter, torch.Tensor)) for p in module.parameters(recurse=False))","typeGuard":"import torch\ndef is_offloadable_param(obj) -> bool:\n    return isinstance(obj, (torch.nn.Parameter, torch.Tensor))","tryCatchPattern":"try:\n    offloader._move_param_to_meta(module, name)\nexcept ValueError as e:\n    if 'Unknown old_param_type' in str(e):\n        skip.add(name)  # skip unsupported param types","preventionTips":["Keep only Parameter/Tensor in param slots","Upgrade sglang when using quantized/DTensor params with offloading","Run a dry-offload pass in CI for custom layers"],"tags":["offloading","meta-device","pytorch","parameters","sglang"],"backgroundTag":"unsupported-parameter-type","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}