sgl-project/sglang · error · TypeError

serialized_named_tensors entries must be base64 strings or b

Error message

serialized_named_tensors entries must be base64 strings or bytes-like payloads, got {type(data).__name__}

What it means

Deserialization of serialized_named_tensors requires each entry to be a base64 string or bytes-like payload; anything else (int, None, dict, non-str/bytes object) raises TypeError. The decoder first tries strict pybase64 decode and falls back to raw bytes only for str/bytes-like inputs.

Source

Thrown at python/sglang/srt/utils/common.py:2949

def _looks_like_pickle_payload(data: bytes) -> bool:
    return len(data) >= 2 and data[0] == 0x80 and data[1] <= pickle.HIGHEST_PROTOCOL


def normalize_serialized_named_tensor_payload(data: SerializedTensorPayload) -> bytes:
    """Normalize a serialized tensor payload to raw MultiprocessingSerializer bytes."""
    if isinstance(data, str):
        return pybase64.b64decode(data, validate=True)

    if isinstance(data, (bytes, bytearray, memoryview)):
        data = bytes(data)
        if _looks_like_pickle_payload(data):
            return data
        try:
            return pybase64.b64decode(data, validate=True)
        except (binascii.Error, ValueError):
            return data

    raise TypeError(
        "serialized_named_tensors entries must be base64 strings or bytes-like "
        f"payloads, got {type(data).__name__}"
    )


def normalize_serialized_named_tensor_payloads(
    payloads: List[SerializedTensorPayload],
) -> List[bytes]:
    return [normalize_serialized_named_tensor_payload(data) for data in payloads]


class SafeUnpickler(pickle.Unpickler):
    ALLOWED_MODULE_PREFIXES = {
        # --- Python types ---
        "builtins.",
        "collections.",
        "copyreg.",
        "functools.",

View on GitHub (pinned to 0132848349)

Solutions

  1. Ensure producer serializes every tensor entry as base64 str or bytes
  2. Validate/normalize with normalize_serialized_named_tensor_payloads before decoding
  3. Reject the payload early at the RPC boundary if types are wrong

Example fix

// before
tensors = deserialize_named_tensors(raw)  # raw has int entries
// after
raw = normalize_serialized_named_tensor_payloads(raw)
tensors = deserialize_named_tensors(raw)
Defensive patterns

Strategy: type-guard

Validate before calling

assert all(isinstance(v, (str, bytes, bytearray, memoryview)) for v in payload.values())

Type guard

def is_valid_payloads(d) -> bool:
    return isinstance(d, dict) and all(isinstance(v, (str, bytes, bytearray, memoryview)) for v in d.values())

Prevention

When it happens

Trigger: Passing a dict of named tensors where values are not str/bytes — e.g. already-decoded objects, numbers, or JSON nulls.

Common situations: Inter-process tensor transfer where one side double-encodes or passes JSON-decoded structures with null values; schema drift between producer and consumer versions.

Related errors


AI-assisted analysis of sgl-project/sglang@0132848349 (2026-08-28). Data as JSON: /api/errors/1f0e04fb18775d09. Report an issue: GitHub.