Files
vllm-omni/vllm_omni/host_weight_runtime/identity.py
T
2026-08-21 08:50:59 +08:00

408 lines
16 KiB
Python

# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM-Omni project
"""Deterministic semantic identity for runtime-ready host weights."""
from __future__ import annotations
import hashlib
import json
import math
from dataclasses import dataclass, field
from typing import TypeAlias, cast
JsonScalar: TypeAlias = None | bool | int | float | str
JsonValue: TypeAlias = JsonScalar | list["JsonValue"] | dict[str, "JsonValue"]
class IdentityValidationError(ValueError):
"""Raised when an artifact identity is not deterministic JSON."""
def _validate_json(value: object, path: str = "$") -> JsonValue:
if value is None or isinstance(value, (bool, int, str)):
return value
if isinstance(value, float):
if not math.isfinite(value):
raise IdentityValidationError(f"{path} contains a non-finite float")
return value
if isinstance(value, list | tuple):
return [_validate_json(item, f"{path}[{index}]") for index, item in enumerate(value)]
if isinstance(value, dict):
normalized: dict[str, JsonValue] = {}
for key, item in value.items():
if not isinstance(key, str):
raise IdentityValidationError(f"{path} contains a non-string mapping key")
normalized[key] = _validate_json(item, f"{path}.{key}")
return {key: normalized[key] for key in sorted(normalized)}
raise IdentityValidationError(f"{path} contains unsupported value type {type(value).__qualname__}")
def canonical_json(value: object) -> bytes:
"""Return one stable JSON encoding, rejecting process-specific objects."""
return json.dumps(
_validate_json(value),
sort_keys=True,
separators=(",", ":"),
ensure_ascii=True,
allow_nan=False,
).encode("utf-8")
@dataclass(frozen=True)
class CanonicalJson:
"""Immutable snapshot of deterministic JSON metadata."""
encoded: bytes
def __post_init__(self) -> None:
if not isinstance(self.encoded, bytes):
raise IdentityValidationError("canonical metadata must be immutable bytes")
try:
value = json.loads(self.encoded)
except (UnicodeDecodeError, json.JSONDecodeError) as exc:
raise IdentityValidationError("canonical metadata is not valid JSON") from exc
if canonical_json(value) != self.encoded:
raise IdentityValidationError("canonical metadata does not use the required stable encoding")
@classmethod
def from_value(cls, value: object) -> CanonicalJson:
return cls(canonical_json(value))
@classmethod
def empty(cls) -> CanonicalJson:
return cls(b"{}")
def to_value(self) -> JsonValue:
return json.loads(self.encoded)
def _require_text(name: str, value: object) -> str:
if not isinstance(value, str) or not value:
raise IdentityValidationError(f"{name} must not be empty")
return value
def _require_int(name: str, value: object) -> int:
if isinstance(value, bool) or not isinstance(value, int):
raise IdentityValidationError(f"{name} must be an integer")
return value
def _require_metadata(name: str, value: object) -> None:
if not isinstance(value, CanonicalJson):
raise IdentityValidationError(f"{name} must use CanonicalJson")
def _require_exact_keys(value: dict[str, object], expected: set[str], kind: str) -> None:
keys = set(value)
if keys != expected:
raise IdentityValidationError(
f"{kind} fields differ: missing={sorted(expected - keys)}, unexpected={sorted(keys - expected)}"
)
@dataclass(frozen=True)
class WeightSourceIdentity:
model_id: str
revision: str
fingerprint: str
metadata: CanonicalJson = field(default_factory=CanonicalJson.empty)
def __post_init__(self) -> None:
_require_text("source.model_id", self.model_id)
_require_text("source.revision", self.revision)
_require_text("source.fingerprint", self.fingerprint)
_require_metadata("source.metadata", self.metadata)
def to_dict(self) -> dict[str, JsonValue]:
return {
"model_id": self.model_id,
"revision": self.revision,
"fingerprint": self.fingerprint,
"metadata": self.metadata.to_value(),
}
@classmethod
def from_dict(cls, value: dict[str, object]) -> WeightSourceIdentity:
_require_exact_keys(value, {"model_id", "revision", "fingerprint", "metadata"}, "source identity")
return cls(
model_id=_require_text("source.model_id", value["model_id"]),
revision=_require_text("source.revision", value["revision"]),
fingerprint=_require_text("source.fingerprint", value["fingerprint"]),
metadata=CanonicalJson.from_value(value["metadata"]),
)
@dataclass(frozen=True)
class ComponentIdentity:
name: str
ownership: str
metadata: CanonicalJson = field(default_factory=CanonicalJson.empty)
def __post_init__(self) -> None:
_require_text("component.name", self.name)
_require_text("component.ownership", self.ownership)
_require_metadata("component.metadata", self.metadata)
def to_dict(self) -> dict[str, JsonValue]:
return {"name": self.name, "ownership": self.ownership, "metadata": self.metadata.to_value()}
@classmethod
def from_dict(cls, value: dict[str, object]) -> ComponentIdentity:
_require_exact_keys(value, {"name", "ownership", "metadata"}, "component identity")
return cls(
name=_require_text("component.name", value["name"]),
ownership=_require_text("component.ownership", value["ownership"]),
metadata=CanonicalJson.from_value(value["metadata"]),
)
@dataclass(frozen=True)
class WeightRepresentation:
name: str
dtype: str
metadata: CanonicalJson = field(default_factory=CanonicalJson.empty)
def __post_init__(self) -> None:
_require_text("representation.name", self.name)
_require_text("representation.dtype", self.dtype)
_require_metadata("representation.metadata", self.metadata)
def to_dict(self) -> dict[str, JsonValue]:
return {"name": self.name, "dtype": self.dtype, "metadata": self.metadata.to_value()}
@classmethod
def from_dict(cls, value: dict[str, object]) -> WeightRepresentation:
_require_exact_keys(value, {"name", "dtype", "metadata"}, "weight representation")
return cls(
name=_require_text("representation.name", value["name"]),
dtype=_require_text("representation.dtype", value["dtype"]),
metadata=CanonicalJson.from_value(value["metadata"]),
)
@dataclass(frozen=True)
class RuntimeWeightLayout:
name: str
tensor_parallel_size: int = 1
tensor_parallel_rank: int = 0
sequence_parallel_size: int = 1
sequence_parallel_backend: str = "none"
metadata: CanonicalJson = field(default_factory=CanonicalJson.empty)
def __post_init__(self) -> None:
_require_text("layout.name", self.name)
tensor_parallel_size = _require_int("layout.tensor_parallel_size", self.tensor_parallel_size)
tensor_parallel_rank = _require_int("layout.tensor_parallel_rank", self.tensor_parallel_rank)
sequence_parallel_size = _require_int("layout.sequence_parallel_size", self.sequence_parallel_size)
if tensor_parallel_size < 1:
raise IdentityValidationError("tensor_parallel_size must be positive")
if not 0 <= tensor_parallel_rank < tensor_parallel_size:
raise IdentityValidationError("tensor_parallel_rank must be within tensor_parallel_size")
if sequence_parallel_size < 1:
raise IdentityValidationError("sequence_parallel_size must be positive")
_require_text("layout.sequence_parallel_backend", self.sequence_parallel_backend)
_require_metadata("layout.metadata", self.metadata)
def to_dict(self) -> dict[str, JsonValue]:
return {
"name": self.name,
"tensor_parallel_size": self.tensor_parallel_size,
"tensor_parallel_rank": self.tensor_parallel_rank,
"sequence_parallel_size": self.sequence_parallel_size,
"sequence_parallel_backend": self.sequence_parallel_backend,
"metadata": self.metadata.to_value(),
}
@classmethod
def from_dict(cls, value: dict[str, object]) -> RuntimeWeightLayout:
expected = {
"name",
"tensor_parallel_size",
"tensor_parallel_rank",
"sequence_parallel_size",
"sequence_parallel_backend",
"metadata",
}
_require_exact_keys(value, expected, "runtime weight layout")
return cls(
name=_require_text("layout.name", value["name"]),
tensor_parallel_size=_require_int("layout.tensor_parallel_size", value["tensor_parallel_size"]),
tensor_parallel_rank=_require_int("layout.tensor_parallel_rank", value["tensor_parallel_rank"]),
sequence_parallel_size=_require_int("layout.sequence_parallel_size", value["sequence_parallel_size"]),
sequence_parallel_backend=_require_text(
"layout.sequence_parallel_backend", value["sequence_parallel_backend"]
),
metadata=CanonicalJson.from_value(value["metadata"]),
)
@dataclass(frozen=True)
class AdaptationIdentity:
kind: str = "base"
fingerprint: str | None = None
metadata: CanonicalJson = field(default_factory=CanonicalJson.empty)
def __post_init__(self) -> None:
_require_text("adaptation.kind", self.kind)
if self.kind != "base" and not self.fingerprint:
raise IdentityValidationError("non-base adaptation requires a fingerprint")
if self.fingerprint is not None and (not isinstance(self.fingerprint, str) or not self.fingerprint):
raise IdentityValidationError("adaptation fingerprint must be a non-empty string or null")
_require_metadata("adaptation.metadata", self.metadata)
def to_dict(self) -> dict[str, JsonValue]:
return {"kind": self.kind, "fingerprint": self.fingerprint, "metadata": self.metadata.to_value()}
@classmethod
def from_dict(cls, value: dict[str, object]) -> AdaptationIdentity:
_require_exact_keys(value, {"kind", "fingerprint", "metadata"}, "adaptation identity")
fingerprint = value["fingerprint"]
if fingerprint is not None and not isinstance(fingerprint, str):
raise IdentityValidationError("adaptation fingerprint must be a string or null")
return cls(
kind=_require_text("adaptation.kind", value["kind"]),
fingerprint=fingerprint,
metadata=CanonicalJson.from_value(value["metadata"]),
)
@dataclass(frozen=True)
class ProducerIdentity:
producer_id: str
version: str
implementation_fingerprint: str
manifest_schema: str
restorer_schema: str
def __post_init__(self) -> None:
for name, value in (
("producer.producer_id", self.producer_id),
("producer.version", self.version),
("producer.implementation_fingerprint", self.implementation_fingerprint),
("producer.manifest_schema", self.manifest_schema),
("producer.restorer_schema", self.restorer_schema),
):
_require_text(name, value)
def to_dict(self) -> dict[str, JsonValue]:
return {
"producer_id": self.producer_id,
"version": self.version,
"implementation_fingerprint": self.implementation_fingerprint,
"manifest_schema": self.manifest_schema,
"restorer_schema": self.restorer_schema,
}
@classmethod
def from_dict(cls, value: dict[str, object]) -> ProducerIdentity:
expected = {
"producer_id",
"version",
"implementation_fingerprint",
"manifest_schema",
"restorer_schema",
}
_require_exact_keys(value, expected, "producer identity")
return cls(
producer_id=_require_text("producer.producer_id", value["producer_id"]),
version=_require_text("producer.version", value["version"]),
implementation_fingerprint=_require_text(
"producer.implementation_fingerprint", value["implementation_fingerprint"]
),
manifest_schema=_require_text("producer.manifest_schema", value["manifest_schema"]),
restorer_schema=_require_text("producer.restorer_schema", value["restorer_schema"]),
)
@dataclass(frozen=True)
class WeightArtifactIdentity:
schema_version: int
source: WeightSourceIdentity
component: ComponentIdentity
representation: WeightRepresentation
layout: RuntimeWeightLayout
adaptation: AdaptationIdentity
producer: ProducerIdentity
def __post_init__(self) -> None:
if _require_int("identity.schema_version", self.schema_version) < 1:
raise IdentityValidationError("identity schema_version must be positive")
for name, value, expected in (
("source", self.source, WeightSourceIdentity),
("component", self.component, ComponentIdentity),
("representation", self.representation, WeightRepresentation),
("layout", self.layout, RuntimeWeightLayout),
("adaptation", self.adaptation, AdaptationIdentity),
("producer", self.producer, ProducerIdentity),
):
if not isinstance(value, expected):
raise IdentityValidationError(f"identity {name} has the wrong contract type")
def to_dict(self) -> dict[str, JsonValue]:
return {
"schema_version": self.schema_version,
"source": self.source.to_dict(),
"component": self.component.to_dict(),
"representation": self.representation.to_dict(),
"layout": self.layout.to_dict(),
"adaptation": self.adaptation.to_dict(),
"producer": self.producer.to_dict(),
}
@property
def canonical_bytes(self) -> bytes:
return canonical_json(self.to_dict())
@property
def key(self) -> str:
return hashlib.sha256(self.canonical_bytes).hexdigest()
@classmethod
def from_dict(cls, value: dict[str, object]) -> WeightArtifactIdentity:
expected = {
"schema_version",
"source",
"component",
"representation",
"layout",
"adaptation",
"producer",
}
_require_exact_keys(value, expected, "weight artifact identity")
source = value["source"]
component = value["component"]
representation = value["representation"]
layout = value["layout"]
adaptation = value["adaptation"]
producer = value["producer"]
if any(
not isinstance(section, dict)
for section in (source, component, representation, layout, adaptation, producer)
):
raise IdentityValidationError("identity sections must be JSON objects")
return cls(
schema_version=_require_int("identity.schema_version", value["schema_version"]),
source=WeightSourceIdentity.from_dict(cast(dict[str, object], source)),
component=ComponentIdentity.from_dict(cast(dict[str, object], component)),
representation=WeightRepresentation.from_dict(cast(dict[str, object], representation)),
layout=RuntimeWeightLayout.from_dict(cast(dict[str, object], layout)),
adaptation=AdaptationIdentity.from_dict(cast(dict[str, object], adaptation)),
producer=ProducerIdentity.from_dict(cast(dict[str, object], producer)),
)
__all__ = [
"AdaptationIdentity",
"CanonicalJson",
"ComponentIdentity",
"IdentityValidationError",
"JsonValue",
"ProducerIdentity",
"RuntimeWeightLayout",
"WeightArtifactIdentity",
"WeightRepresentation",
"WeightSourceIdentity",
"canonical_json",
]