mirror of
https://github.com/elder-plinius/OBLITERATUS.git
synced 2026-09-22 01:10:49 +02:00
1028 lines
37 KiB
Python
1028 lines
37 KiB
Python
"""Transactional canonical safetensors writer for validated neutral fragments."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import os
|
|
import shutil
|
|
import stat
|
|
from dataclasses import dataclass
|
|
from hashlib import sha256
|
|
from pathlib import Path, PurePosixPath
|
|
from typing import Any, Callable, Mapping, Sequence
|
|
|
|
import torch
|
|
from safetensors.torch import load_file, save_file
|
|
|
|
from obliteratus.checkpoint_errors import CheckpointContractError
|
|
from obliteratus.checkpoint_fragments import (
|
|
TensorFragment,
|
|
ValidationResult,
|
|
reconstruct_logical_tensor,
|
|
validate_fragments,
|
|
)
|
|
from obliteratus.checkpoint_provenance import (
|
|
ProvenanceRecord,
|
|
verify_provenance_record,
|
|
)
|
|
from obliteratus.persistence_contracts import atomic_checkpoint_directory
|
|
|
|
|
|
_DIGEST_PREFIX = "sha256:"
|
|
_INT64_MAX = (1 << 63) - 1
|
|
_WRITER_BUFFER_BYTES = 1 << 20
|
|
_COPY_KINDS = frozenset({"configuration", "tokenizer"})
|
|
_CANONICAL_DTYPES = frozenset(
|
|
{
|
|
"bool",
|
|
"uint8",
|
|
"uint16",
|
|
"uint32",
|
|
"uint64",
|
|
"int8",
|
|
"int16",
|
|
"int32",
|
|
"int64",
|
|
"float8_e4m3fn",
|
|
"float8_e5m2",
|
|
"float16",
|
|
"bfloat16",
|
|
"float32",
|
|
"float64",
|
|
"complex64",
|
|
}
|
|
)
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class WriterLimits:
|
|
"""Admission limits applied before a staging directory is created."""
|
|
|
|
max_shard_bytes: int = 5 << 30
|
|
max_output_bytes: int = 1 << 40
|
|
max_temp_bytes: int = 1 << 40
|
|
max_peak_ram_bytes: int = 16 << 30
|
|
min_free_headroom_percent: int = 10
|
|
|
|
def __post_init__(self) -> None:
|
|
for name, value in vars(self).items():
|
|
if type(value) is not int or value <= 0:
|
|
raise ValueError(f"{name} must be a positive integer")
|
|
if self.min_free_headroom_percent > 100:
|
|
raise ValueError("min_free_headroom_percent cannot exceed 100")
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class VerifiedSourceFile:
|
|
"""One source artifact whose path and digest are independently rechecked."""
|
|
|
|
path: Path
|
|
relative_path: str
|
|
expected_sha256: str
|
|
|
|
def __post_init__(self) -> None:
|
|
object.__setattr__(self, "path", Path(self.path))
|
|
_safe_relative(self.relative_path)
|
|
_require_digest(self.expected_sha256, "source digest")
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class ImmutableCopy:
|
|
"""A base configuration/tokenizer file copied only after exact hash match."""
|
|
|
|
relative_path: str
|
|
source_path: Path
|
|
expected_sha256: str
|
|
kind: str
|
|
|
|
def __post_init__(self) -> None:
|
|
object.__setattr__(self, "source_path", Path(self.source_path))
|
|
_safe_basename(self.relative_path)
|
|
_require_digest(self.expected_sha256, "copy digest")
|
|
if self.kind not in _COPY_KINDS:
|
|
raise ValueError("copy kind must be configuration or tokenizer")
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class CanonicalWriteResult:
|
|
"""Identity and immutable location of a successfully promoted checkpoint."""
|
|
|
|
artifact_id: str
|
|
output_path: Path
|
|
weight_files: tuple[str, ...]
|
|
manifest_digest: str
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class _Fingerprint:
|
|
device: int
|
|
inode: int
|
|
mode: int
|
|
size: int
|
|
modified_ns: int
|
|
|
|
@classmethod
|
|
def from_stat(cls, value: os.stat_result) -> _Fingerprint:
|
|
return cls(value.st_dev, value.st_ino, value.st_mode, value.st_size, value.st_mtime_ns)
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class _Snapshot:
|
|
path: Path
|
|
relative_path: str
|
|
fingerprint: _Fingerprint
|
|
sha256: str
|
|
|
|
def file_record(self) -> dict[str, Any]:
|
|
return {
|
|
"relative_path": self.relative_path,
|
|
"size_bytes": self.fingerprint.size,
|
|
"sha256": self.sha256,
|
|
}
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class _TensorSpec:
|
|
name: str
|
|
logical_tensor_id: str
|
|
size_bytes: int
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class _TensorOracle:
|
|
shape: tuple[int, ...]
|
|
dtype: str
|
|
sha256: str
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class _Admission:
|
|
logical_bytes: int
|
|
estimated_output_bytes: int
|
|
estimated_temp_bytes: int
|
|
estimated_peak_ram_bytes: int
|
|
|
|
|
|
def _safe_relative(value: str) -> None:
|
|
pure = PurePosixPath(value)
|
|
if (
|
|
not isinstance(value, str)
|
|
or not value
|
|
or pure.is_absolute()
|
|
or any(part in {"", ".", ".."} for part in pure.parts)
|
|
or len(value) > 4096
|
|
):
|
|
raise ValueError("relative path is unsafe")
|
|
|
|
|
|
def _safe_basename(value: str) -> None:
|
|
_safe_relative(value)
|
|
if PurePosixPath(value).name != value:
|
|
raise ValueError("canonical copied artifacts must be root-level files")
|
|
|
|
|
|
def _require_digest(value: str, field: str) -> None:
|
|
if (
|
|
not isinstance(value, str)
|
|
or not value.startswith(_DIGEST_PREFIX)
|
|
or len(value) != len(_DIGEST_PREFIX) + 64
|
|
or any(character not in "0123456789abcdef" for character in value[len(_DIGEST_PREFIX) :])
|
|
):
|
|
raise ValueError(f"{field} must be a sha256 digest")
|
|
|
|
|
|
def _source_changed(reference: str) -> CheckpointContractError:
|
|
return CheckpointContractError(
|
|
"DCI_SOURCE_CHANGED",
|
|
detail="source_digest_or_identity_changed",
|
|
affected_refs=(reference,),
|
|
)
|
|
|
|
|
|
def _open_flags() -> int:
|
|
return os.O_RDONLY | getattr(os, "O_BINARY", 0) | getattr(os, "O_NOFOLLOW", 0)
|
|
|
|
|
|
def _open_snapshot(path: Path, reference: str) -> int:
|
|
try:
|
|
return os.open(path, _open_flags())
|
|
except OSError as error:
|
|
raise _source_changed(reference) from error
|
|
|
|
|
|
def _hash_descriptor(descriptor: int, reference: str) -> str:
|
|
digest = sha256()
|
|
try:
|
|
while True:
|
|
chunk = os.read(descriptor, 1 << 20)
|
|
if not chunk:
|
|
return f"sha256:{digest.hexdigest()}"
|
|
digest.update(chunk)
|
|
except OSError as error:
|
|
raise _source_changed(reference) from error
|
|
|
|
|
|
def _read_snapshot(descriptor: int, size: int, reference: str) -> bytes:
|
|
try:
|
|
return os.read(descriptor, size)
|
|
except OSError as error:
|
|
raise _source_changed(reference) from error
|
|
|
|
|
|
def _descriptor_fingerprint(descriptor: int, reference: str) -> _Fingerprint:
|
|
try:
|
|
return _Fingerprint.from_stat(os.fstat(descriptor))
|
|
except OSError as error:
|
|
raise _source_changed(reference) from error
|
|
|
|
|
|
def _snapshot(path: Path, relative_path: str, expected_digest: str) -> _Snapshot:
|
|
try:
|
|
observed = path.lstat()
|
|
except OSError as error:
|
|
raise _source_changed(relative_path) from error
|
|
if not stat.S_ISREG(observed.st_mode):
|
|
raise CheckpointContractError(
|
|
"DCI_SOURCE_BOUNDARY_VIOLATION",
|
|
detail="source_not_regular_file",
|
|
affected_refs=(relative_path,),
|
|
)
|
|
try:
|
|
if path.absolute() != path.resolve(strict=True):
|
|
raise CheckpointContractError(
|
|
"DCI_SOURCE_BOUNDARY_VIOLATION",
|
|
detail="source_symlink",
|
|
affected_refs=(relative_path,),
|
|
)
|
|
except OSError as error:
|
|
raise _source_changed(relative_path) from error
|
|
fingerprint = _Fingerprint.from_stat(observed)
|
|
descriptor = _open_snapshot(path, relative_path)
|
|
try:
|
|
if _descriptor_fingerprint(descriptor, relative_path) != fingerprint:
|
|
raise _source_changed(relative_path)
|
|
digest = _hash_descriptor(descriptor, relative_path)
|
|
if _descriptor_fingerprint(descriptor, relative_path) != fingerprint:
|
|
raise _source_changed(relative_path)
|
|
finally:
|
|
os.close(descriptor)
|
|
if digest != expected_digest:
|
|
raise _source_changed(relative_path)
|
|
try:
|
|
if _Fingerprint.from_stat(path.lstat()) != fingerprint:
|
|
raise _source_changed(relative_path)
|
|
except OSError as error:
|
|
raise _source_changed(relative_path) from error
|
|
return _Snapshot(path, relative_path, fingerprint, digest)
|
|
|
|
|
|
def _revalidate_snapshot(snapshot: _Snapshot) -> None:
|
|
try:
|
|
observed = _Fingerprint.from_stat(snapshot.path.lstat())
|
|
except OSError as error:
|
|
raise _source_changed(snapshot.relative_path) from error
|
|
if observed != snapshot.fingerprint:
|
|
raise _source_changed(snapshot.relative_path)
|
|
descriptor = _open_snapshot(snapshot.path, snapshot.relative_path)
|
|
try:
|
|
if _descriptor_fingerprint(descriptor, snapshot.relative_path) != snapshot.fingerprint:
|
|
raise _source_changed(snapshot.relative_path)
|
|
digest = _hash_descriptor(descriptor, snapshot.relative_path)
|
|
finally:
|
|
os.close(descriptor)
|
|
if digest != snapshot.sha256:
|
|
raise _source_changed(snapshot.relative_path)
|
|
|
|
|
|
def _tensor_bytes(shape: tuple[int, ...], element_size: int, reference: str) -> int:
|
|
elements = 1
|
|
for dimension in shape:
|
|
if dimension and elements > _INT64_MAX // dimension:
|
|
raise CheckpointContractError(
|
|
"DCI_VALIDATION_FAILED",
|
|
detail="integer_overflow",
|
|
affected_refs=(reference,),
|
|
)
|
|
elements *= dimension
|
|
if elements and elements > _INT64_MAX // element_size:
|
|
raise CheckpointContractError(
|
|
"DCI_VALIDATION_FAILED",
|
|
detail="integer_overflow",
|
|
affected_refs=(reference,),
|
|
)
|
|
return elements * element_size
|
|
|
|
|
|
def _tensor_specs(validation: ValidationResult) -> tuple[_TensorSpec, ...]:
|
|
names = [logical.fqn for logical in validation.logical_tensors]
|
|
if len(set(names)) != len(names):
|
|
raise CheckpointContractError(
|
|
"DCI_VALIDATION_FAILED",
|
|
detail="canonical_tensor_name_duplicate",
|
|
affected_refs=names,
|
|
)
|
|
specs = []
|
|
for logical in validation.logical_tensors:
|
|
if logical.dtype not in _CANONICAL_DTYPES:
|
|
raise CheckpointContractError(
|
|
"DCI_VALIDATION_FAILED",
|
|
detail="canonical_dtype_unsupported",
|
|
affected_refs=(logical.logical_tensor_id,),
|
|
)
|
|
payload = logical.fragments[0].payload
|
|
if payload is None:
|
|
raise CheckpointContractError(
|
|
"DCI_VALIDATION_FAILED",
|
|
detail="payload_unavailable",
|
|
affected_refs=(logical.logical_tensor_id,),
|
|
)
|
|
specs.append(
|
|
_TensorSpec(
|
|
name=logical.fqn,
|
|
logical_tensor_id=logical.logical_tensor_id,
|
|
size_bytes=_tensor_bytes(
|
|
logical.global_shape,
|
|
payload.element_size(),
|
|
logical.logical_tensor_id,
|
|
),
|
|
)
|
|
)
|
|
return tuple(sorted(specs, key=lambda item: item.name))
|
|
|
|
|
|
def _shard_plan(specs: tuple[_TensorSpec, ...], max_shard_bytes: int) -> tuple[tuple[_TensorSpec, ...], ...]:
|
|
oversized = next((spec for spec in specs if spec.size_bytes > max_shard_bytes), None)
|
|
if oversized is not None:
|
|
raise CheckpointContractError(
|
|
"DCI_ADMISSION_DENIED",
|
|
detail="tensor_exceeds_max_shard_bytes",
|
|
affected_refs=(oversized.logical_tensor_id,),
|
|
)
|
|
shards: list[list[_TensorSpec]] = []
|
|
current: list[_TensorSpec] = []
|
|
current_bytes = 0
|
|
for spec in specs:
|
|
if current and current_bytes + spec.size_bytes > max_shard_bytes:
|
|
shards.append(current)
|
|
current = []
|
|
current_bytes = 0
|
|
current.append(spec)
|
|
current_bytes += spec.size_bytes
|
|
if current:
|
|
shards.append(current)
|
|
return tuple(tuple(shard) for shard in shards)
|
|
|
|
|
|
def _admit(
|
|
destination: Path,
|
|
plan: tuple[tuple[_TensorSpec, ...], ...],
|
|
copy_snapshots: tuple[_Snapshot, ...],
|
|
limits: WriterLimits,
|
|
) -> _Admission:
|
|
logical_bytes = sum(spec.size_bytes for shard in plan for spec in shard)
|
|
copied_bytes = sum(snapshot.fingerprint.size for snapshot in copy_snapshots)
|
|
header_allowance = (
|
|
sum(len(spec.name.encode("utf-8")) + 256 for shard in plan for spec in shard)
|
|
+ 4096 * max(1, len(plan))
|
|
+ 8192
|
|
)
|
|
estimated_output = logical_bytes + copied_bytes + header_allowance
|
|
estimated_temp = estimated_output
|
|
largest_shard = max((sum(spec.size_bytes for spec in shard) for shard in plan), default=0)
|
|
largest_tensor = max((spec.size_bytes for shard in plan for spec in shard), default=0)
|
|
peak_ram = largest_shard + largest_tensor + _WRITER_BUFFER_BYTES
|
|
checks = (
|
|
(estimated_output, limits.max_output_bytes, "max_output_bytes"),
|
|
(estimated_temp, limits.max_temp_bytes, "max_temp_bytes"),
|
|
(peak_ram, limits.max_peak_ram_bytes, "max_peak_ram_bytes"),
|
|
)
|
|
for required, maximum, detail in checks:
|
|
if required > maximum:
|
|
raise CheckpointContractError(
|
|
"DCI_ADMISSION_DENIED",
|
|
detail=detail,
|
|
affected_refs=(f"required:{required}", f"available:{maximum}"),
|
|
)
|
|
try:
|
|
destination.parent.mkdir(parents=True, exist_ok=True)
|
|
except OSError as error:
|
|
raise CheckpointContractError(
|
|
"DCI_ADMISSION_DENIED",
|
|
detail="destination_parent_unavailable",
|
|
affected_refs=("destination",),
|
|
) from error
|
|
if destination.parent.is_symlink():
|
|
raise CheckpointContractError(
|
|
"DCI_SOURCE_BOUNDARY_VIOLATION",
|
|
detail="destination_parent_symlink",
|
|
affected_refs=("destination",),
|
|
)
|
|
try:
|
|
available = shutil.disk_usage(destination.parent).free
|
|
except OSError as error:
|
|
raise CheckpointContractError(
|
|
"DCI_ADMISSION_DENIED",
|
|
detail="filesystem_capacity_unavailable",
|
|
affected_refs=("destination",),
|
|
) from error
|
|
required_with_headroom = estimated_temp * (100 + limits.min_free_headroom_percent)
|
|
required_with_headroom = (required_with_headroom + 99) // 100
|
|
if available < required_with_headroom:
|
|
raise CheckpointContractError(
|
|
"DCI_ADMISSION_DENIED",
|
|
detail="filesystem_free_bytes",
|
|
affected_refs=(f"required:{required_with_headroom}", f"available:{available}"),
|
|
)
|
|
return _Admission(logical_bytes, estimated_output, estimated_temp, peak_ram)
|
|
|
|
|
|
def _copy_snapshot(snapshot: _Snapshot, destination: Path) -> None:
|
|
source = _open_snapshot(snapshot.path, snapshot.relative_path)
|
|
try:
|
|
if _descriptor_fingerprint(source, snapshot.relative_path) != snapshot.fingerprint:
|
|
raise _source_changed(snapshot.relative_path)
|
|
with destination.open("xb") as output:
|
|
while True:
|
|
chunk = _read_snapshot(source, 1 << 20, snapshot.relative_path)
|
|
if not chunk:
|
|
break
|
|
output.write(chunk)
|
|
output.flush()
|
|
os.fsync(output.fileno())
|
|
if _descriptor_fingerprint(source, snapshot.relative_path) != snapshot.fingerprint:
|
|
raise _source_changed(snapshot.relative_path)
|
|
finally:
|
|
os.close(source)
|
|
if _file_digest(destination) != snapshot.sha256:
|
|
raise _source_changed(snapshot.relative_path)
|
|
|
|
|
|
def _save_safetensors_file(tensors: Mapping[str, torch.Tensor], path: Path) -> None:
|
|
save_file(dict(sorted(tensors.items())), path)
|
|
|
|
|
|
def _file_digest(path: Path) -> str:
|
|
digest = sha256()
|
|
with path.open("rb") as stream:
|
|
for chunk in iter(lambda: stream.read(1 << 20), b""):
|
|
digest.update(chunk)
|
|
return f"sha256:{digest.hexdigest()}"
|
|
|
|
|
|
def _tensor_digest(tensor: torch.Tensor) -> str:
|
|
raw = tensor.detach().contiguous().reshape(-1).view(torch.uint8).numpy().tobytes()
|
|
return f"sha256:{sha256(raw).hexdigest()}"
|
|
|
|
|
|
def _write_json(path: Path, value: object) -> None:
|
|
payload = json.dumps(
|
|
value,
|
|
indent=2,
|
|
sort_keys=True,
|
|
ensure_ascii=True,
|
|
allow_nan=False,
|
|
) + "\n"
|
|
with path.open("x", encoding="utf-8") as stream:
|
|
stream.write(payload)
|
|
stream.flush()
|
|
os.fsync(stream.fileno())
|
|
|
|
|
|
def _output_record(path: Path) -> dict[str, Any]:
|
|
observed = path.lstat()
|
|
if not stat.S_ISREG(observed.st_mode):
|
|
raise CheckpointContractError(
|
|
"DCI_VALIDATION_FAILED",
|
|
detail="output_not_regular_file",
|
|
affected_refs=(path.name,),
|
|
)
|
|
return {
|
|
"relative_path": path.name,
|
|
"size_bytes": observed.st_size,
|
|
"sha256": _file_digest(path),
|
|
}
|
|
|
|
|
|
def _canonical_digest(value: object) -> str:
|
|
payload = json.dumps(value, sort_keys=True, separators=(",", ":"), allow_nan=False).encode()
|
|
return f"sha256:{sha256(payload).hexdigest()}"
|
|
|
|
|
|
def _manifest(
|
|
*,
|
|
artifact_id: str,
|
|
descriptor_digest: str,
|
|
source_records: list[dict[str, Any]],
|
|
source_topology: Mapping[str, Any],
|
|
validation: ValidationResult,
|
|
output_records: list[dict[str, Any]],
|
|
index_name: str | None,
|
|
admission: _Admission,
|
|
provenance: dict[str, Any],
|
|
) -> dict[str, Any]:
|
|
lost_state = provenance["state"]["lost_state"]
|
|
return {
|
|
"schema_id": "obliteratus.conversion-manifest",
|
|
"schema_version": "1.0.0",
|
|
"manifest_id": artifact_id,
|
|
"descriptor": {"schema_version": "1.0.0", "digest": descriptor_digest},
|
|
"source_inventory_digest": _canonical_digest(source_records),
|
|
"source_files": source_records,
|
|
"adapter": {
|
|
"id": "producer-neutral-fragments",
|
|
"version": "1.0.0",
|
|
"capability_digest": validation.manifest_digest,
|
|
"producer": "already-normalized-input",
|
|
"producer_version": "1.0.0",
|
|
},
|
|
"source_topology": dict(source_topology),
|
|
"state": {
|
|
"source_classification": provenance["state"]["classification"],
|
|
"output_classification": "weights_only",
|
|
"observed_scopes": provenance["state"]["observed_scopes"],
|
|
},
|
|
"dropped_scopes": [
|
|
{"scope": scope, "reason": "Canonical Wave 2 output contains weights only."}
|
|
for scope in lost_state
|
|
],
|
|
"canonical_output": {
|
|
"format": "hf_safetensors",
|
|
"dtype_policy": "preserve_exact",
|
|
"files": output_records,
|
|
"hf_index": index_name,
|
|
"logical_tensor_count": len(validation.logical_tensors),
|
|
"logical_bytes": admission.logical_bytes,
|
|
},
|
|
"resource_usage": {
|
|
"estimated_peak_ram_bytes": admission.estimated_peak_ram_bytes,
|
|
"actual_peak_ram_bytes": None,
|
|
"estimated_temp_bytes": admission.estimated_temp_bytes,
|
|
"actual_temp_bytes": None,
|
|
},
|
|
"validation": {
|
|
"coverage": True,
|
|
"replicas": True,
|
|
"ties": True,
|
|
"hashes": True,
|
|
"index": True,
|
|
"safe_reload": True,
|
|
"source_unchanged": True,
|
|
"result": "passed",
|
|
},
|
|
"provenance": {
|
|
"obliteratus_commit": provenance["obliteratus_commit"],
|
|
"configuration_digest": provenance["configuration_digest"],
|
|
"tokenizer_digest": (
|
|
provenance["tokenizer"]["digest"] if provenance["tokenizer"] else None
|
|
),
|
|
"base_model": {
|
|
"identity": provenance["base_model"]["identity"] if provenance["base_model"] else None,
|
|
"revision": provenance["base_model"]["revision"] if provenance["base_model"] else None,
|
|
"digest": provenance["base_model"]["digest"] if provenance["base_model"] else None,
|
|
},
|
|
"transformation_log": provenance["transformations"],
|
|
"unknowns": provenance["unknowns"],
|
|
},
|
|
"publication": {
|
|
"staging_validated": True,
|
|
"promoted": True,
|
|
"atomic_strategy": "sibling-stage-fsync-replace",
|
|
"rollback_result": "not_required",
|
|
},
|
|
}
|
|
|
|
|
|
def _verify_provenance(
|
|
record: dict[str, Any],
|
|
*,
|
|
output_digests: tuple[str, ...],
|
|
source_digests: tuple[str, ...],
|
|
configuration_digest: str,
|
|
source_topology: Mapping[str, Any],
|
|
) -> dict[str, Any]:
|
|
try:
|
|
verified = verify_provenance_record(record)
|
|
except (TypeError, ValueError) as error:
|
|
raise CheckpointContractError(
|
|
"DCI_EVIDENCE_UNAVAILABLE",
|
|
detail="provenance_contract_invalid",
|
|
) from error
|
|
if sorted(verified["output_digests"]) != sorted(set(output_digests)):
|
|
raise CheckpointContractError(
|
|
"DCI_EVIDENCE_UNAVAILABLE",
|
|
detail="provenance_output_digest_mismatch",
|
|
)
|
|
if sorted(verified["input_digests"]) != sorted(set(source_digests)):
|
|
raise CheckpointContractError(
|
|
"DCI_EVIDENCE_UNAVAILABLE",
|
|
detail="provenance_input_digest_mismatch",
|
|
)
|
|
if verified["configuration_digest"] != configuration_digest:
|
|
raise CheckpointContractError(
|
|
"DCI_EVIDENCE_UNAVAILABLE",
|
|
detail="provenance_configuration_digest_mismatch",
|
|
)
|
|
try:
|
|
topology_matches = dict(source_topology) == verified["source_topology"]
|
|
except (TypeError, ValueError) as error:
|
|
raise CheckpointContractError(
|
|
"DCI_EVIDENCE_UNAVAILABLE",
|
|
detail="provenance_source_topology_invalid",
|
|
) from error
|
|
if not topology_matches:
|
|
raise CheckpointContractError(
|
|
"DCI_EVIDENCE_UNAVAILABLE",
|
|
detail="provenance_source_topology_mismatch",
|
|
)
|
|
return verified
|
|
|
|
|
|
def _verify_json_object(path: Path) -> dict[str, Any]:
|
|
if path.is_symlink() or not path.is_file() or path.stat().st_size > 8 << 20:
|
|
raise CheckpointContractError(
|
|
"DCI_VALIDATION_FAILED",
|
|
detail="output_json_invalid",
|
|
affected_refs=(path.name,),
|
|
)
|
|
try:
|
|
value = json.loads(path.read_text(encoding="utf-8"))
|
|
except (UnicodeError, json.JSONDecodeError) as error:
|
|
raise CheckpointContractError(
|
|
"DCI_VALIDATION_FAILED",
|
|
detail="output_json_invalid",
|
|
affected_refs=(path.name,),
|
|
) from error
|
|
if not isinstance(value, dict):
|
|
raise CheckpointContractError(
|
|
"DCI_VALIDATION_FAILED",
|
|
detail="output_json_invalid",
|
|
affected_refs=(path.name,),
|
|
)
|
|
return value
|
|
|
|
|
|
def _verify_staging(
|
|
staging: Path,
|
|
*,
|
|
weight_map: dict[str, str],
|
|
oracles: dict[str, _TensorOracle],
|
|
expected_files: set[str],
|
|
snapshots: tuple[_Snapshot, ...],
|
|
source_snapshots: tuple[_Snapshot, ...],
|
|
configuration_digest: str,
|
|
descriptor_digest: str,
|
|
validation_digest: str,
|
|
artifact_id: str,
|
|
limits: WriterLimits,
|
|
) -> None:
|
|
actual_files = {path.name for path in staging.iterdir() if path.is_file() and not path.is_symlink()}
|
|
if actual_files != expected_files or any(path.is_symlink() or not path.is_file() for path in staging.iterdir()):
|
|
raise CheckpointContractError(
|
|
"DCI_VALIDATION_FAILED",
|
|
detail="output_file_set_mismatch",
|
|
)
|
|
actual_bytes = sum((staging / name).lstat().st_size for name in expected_files)
|
|
if actual_bytes > limits.max_output_bytes or actual_bytes > limits.max_temp_bytes:
|
|
raise CheckpointContractError(
|
|
"DCI_ADMISSION_DENIED",
|
|
detail="post_write_size_limit",
|
|
affected_refs=(f"required:{actual_bytes}",),
|
|
)
|
|
loaded_names: set[str] = set()
|
|
loaded_bytes = 0
|
|
for shard_name in sorted(set(weight_map.values())):
|
|
shard = load_file(staging / shard_name, device="cpu")
|
|
for name, tensor in shard.items():
|
|
if weight_map.get(name) != shard_name or name not in oracles:
|
|
raise CheckpointContractError(
|
|
"DCI_VALIDATION_FAILED",
|
|
detail="output_index_mismatch",
|
|
affected_refs=(name,),
|
|
)
|
|
oracle = oracles[name]
|
|
if (
|
|
tuple(tensor.shape) != oracle.shape
|
|
or str(tensor.dtype).removeprefix("torch.") != oracle.dtype
|
|
or _tensor_digest(tensor) != oracle.sha256
|
|
):
|
|
raise CheckpointContractError(
|
|
"DCI_VALIDATION_FAILED",
|
|
detail="output_tensor_mismatch",
|
|
affected_refs=(name,),
|
|
)
|
|
loaded_names.add(name)
|
|
loaded_bytes += tensor.numel() * tensor.element_size()
|
|
if loaded_names != set(weight_map) or loaded_names != set(oracles):
|
|
raise CheckpointContractError(
|
|
"DCI_VALIDATION_FAILED",
|
|
detail="output_tensor_set_mismatch",
|
|
)
|
|
index_name = (
|
|
"model.safetensors.index.json"
|
|
if "model.safetensors.index.json" in expected_files
|
|
else None
|
|
)
|
|
if index_name is not None:
|
|
index = _verify_json_object(staging / index_name)
|
|
if index != {
|
|
"metadata": {"total_size": loaded_bytes},
|
|
"weight_map": dict(sorted(weight_map.items())),
|
|
}:
|
|
raise CheckpointContractError(
|
|
"DCI_VALIDATION_FAILED",
|
|
detail="output_index_mismatch",
|
|
)
|
|
for name in ("config.json", "tokenizer_config.json"):
|
|
_verify_json_object(staging / name)
|
|
provenance = _verify_json_object(staging / "checkpoint-provenance.json")
|
|
manifest = _verify_json_object(staging / "conversion-manifest.json")
|
|
metadata = _verify_json_object(staging / "abliteration_metadata.json")
|
|
evidence_files = {
|
|
"checkpoint-provenance.json",
|
|
"conversion-manifest.json",
|
|
"abliteration_metadata.json",
|
|
}
|
|
output_records = [
|
|
_output_record(staging / name)
|
|
for name in sorted(expected_files - evidence_files)
|
|
]
|
|
output_digests = tuple(record["sha256"] for record in output_records)
|
|
verified_provenance = _verify_provenance(
|
|
provenance,
|
|
output_digests=output_digests,
|
|
source_digests=tuple(snapshot.sha256 for snapshot in source_snapshots),
|
|
configuration_digest=configuration_digest,
|
|
source_topology=provenance.get("source_topology", {}),
|
|
)
|
|
canonical_output = manifest.get("canonical_output")
|
|
adapter = manifest.get("adapter")
|
|
descriptor = manifest.get("descriptor")
|
|
if (
|
|
not isinstance(canonical_output, dict)
|
|
or not isinstance(adapter, dict)
|
|
or not isinstance(descriptor, dict)
|
|
or canonical_output.get("files") != output_records
|
|
or canonical_output.get("hf_index") != index_name
|
|
or adapter.get("capability_digest") != validation_digest
|
|
or descriptor.get("digest") != descriptor_digest
|
|
or manifest.get("source_files")
|
|
!= [snapshot.file_record() for snapshot in source_snapshots]
|
|
or manifest.get("source_topology") != verified_provenance["source_topology"]
|
|
):
|
|
raise CheckpointContractError(
|
|
"DCI_VALIDATION_FAILED",
|
|
detail="output_manifest_mismatch",
|
|
)
|
|
if not (
|
|
provenance.get("artifact_id")
|
|
== manifest.get("manifest_id")
|
|
== metadata.get("artifact_id")
|
|
== artifact_id
|
|
):
|
|
raise CheckpointContractError(
|
|
"DCI_EVIDENCE_UNAVAILABLE",
|
|
detail="artifact_identity_mismatch",
|
|
)
|
|
for snapshot in snapshots:
|
|
_revalidate_snapshot(snapshot)
|
|
|
|
|
|
def write_canonical_checkpoint(
|
|
destination: Path | str,
|
|
fragments: Sequence[TensorFragment],
|
|
*,
|
|
source_files: Sequence[VerifiedSourceFile],
|
|
copies: Sequence[ImmutableCopy],
|
|
descriptor_digest: str,
|
|
source_topology: Mapping[str, Any],
|
|
provenance_factory: Callable[[tuple[str, ...]], ProvenanceRecord],
|
|
tie_policy: str | None = None,
|
|
limits: WriterLimits | None = None,
|
|
) -> CanonicalWriteResult:
|
|
"""Write validated CPU fragments without invoking a producer reader or adapter."""
|
|
_require_digest(descriptor_digest, "descriptor digest")
|
|
active_limits = limits or WriterLimits()
|
|
validation = validate_fragments(tuple(fragments))
|
|
if any(logical.tie_group_id is not None for logical in validation.logical_tensors):
|
|
if tie_policy != "duplicate_validated":
|
|
raise CheckpointContractError(
|
|
"DCI_VALIDATION_FAILED",
|
|
detail="tie_policy_required",
|
|
affected_refs=(
|
|
logical.logical_tensor_id
|
|
for logical in validation.logical_tensors
|
|
if logical.tie_group_id is not None
|
|
),
|
|
)
|
|
if not source_files:
|
|
raise CheckpointContractError(
|
|
"DCI_EVIDENCE_UNAVAILABLE",
|
|
detail="source_inventory_empty",
|
|
)
|
|
source_paths = [item.relative_path for item in source_files]
|
|
if len(set(source_paths)) != len(source_paths):
|
|
raise ValueError("source relative paths must be unique")
|
|
copy_paths = [item.relative_path for item in copies]
|
|
if len(set(copy_paths)) != len(copy_paths):
|
|
raise ValueError("copy output paths must be unique")
|
|
if not {"config.json", "tokenizer_config.json"} <= set(copy_paths):
|
|
raise CheckpointContractError(
|
|
"DCI_EVIDENCE_UNAVAILABLE",
|
|
detail="canonical_config_or_tokenizer_missing",
|
|
)
|
|
copy_kinds = {item.relative_path: item.kind for item in copies}
|
|
if (
|
|
copy_kinds["config.json"] != "configuration"
|
|
or copy_kinds["tokenizer_config.json"] != "tokenizer"
|
|
):
|
|
raise CheckpointContractError(
|
|
"DCI_EVIDENCE_UNAVAILABLE",
|
|
detail="canonical_config_or_tokenizer_kind_mismatch",
|
|
)
|
|
source_snapshots = tuple(
|
|
sorted(
|
|
(
|
|
_snapshot(item.path, item.relative_path, item.expected_sha256)
|
|
for item in source_files
|
|
),
|
|
key=lambda snapshot: snapshot.relative_path,
|
|
)
|
|
)
|
|
copy_snapshots = tuple(
|
|
_snapshot(item.source_path, item.relative_path, item.expected_sha256) for item in copies
|
|
)
|
|
specs = _tensor_specs(validation)
|
|
plan = _shard_plan(specs, active_limits.max_shard_bytes)
|
|
output_path = Path(destination)
|
|
try:
|
|
destination_unsafe = (
|
|
output_path.is_symlink()
|
|
or output_path.absolute() != output_path.resolve(strict=False)
|
|
)
|
|
except OSError as error:
|
|
raise CheckpointContractError(
|
|
"DCI_SOURCE_BOUNDARY_VIOLATION",
|
|
detail="destination_unresolvable",
|
|
affected_refs=("destination",),
|
|
) from error
|
|
if destination_unsafe:
|
|
raise CheckpointContractError(
|
|
"DCI_SOURCE_BOUNDARY_VIOLATION",
|
|
detail="destination_symlink",
|
|
affected_refs=("destination",),
|
|
)
|
|
admission = _admit(output_path, plan, copy_snapshots, active_limits)
|
|
shard_names = (
|
|
("model.safetensors",)
|
|
if len(plan) == 1
|
|
else tuple(
|
|
f"model-{index:05d}-of-{len(plan):05d}.safetensors"
|
|
for index in range(1, len(plan) + 1)
|
|
)
|
|
)
|
|
weight_map = {
|
|
spec.name: shard_name
|
|
for shard_name, shard in zip(shard_names, plan, strict=True)
|
|
for spec in shard
|
|
}
|
|
oracles: dict[str, _TensorOracle] = {}
|
|
index_name = "model.safetensors.index.json" if len(plan) > 1 else None
|
|
artifact_id = ""
|
|
manifest_digest = ""
|
|
all_snapshots = (*source_snapshots, *copy_snapshots)
|
|
|
|
def verify(staging: Path) -> None:
|
|
expected = {
|
|
*copy_paths,
|
|
*shard_names,
|
|
"checkpoint-provenance.json",
|
|
"conversion-manifest.json",
|
|
"abliteration_metadata.json",
|
|
}
|
|
if index_name is not None:
|
|
expected.add(index_name)
|
|
_verify_staging(
|
|
staging,
|
|
weight_map=weight_map,
|
|
oracles=oracles,
|
|
expected_files=expected,
|
|
snapshots=all_snapshots,
|
|
source_snapshots=source_snapshots,
|
|
configuration_digest=next(
|
|
snapshot.sha256
|
|
for snapshot in copy_snapshots
|
|
if snapshot.relative_path == "config.json"
|
|
),
|
|
descriptor_digest=descriptor_digest,
|
|
validation_digest=validation.manifest_digest,
|
|
artifact_id=artifact_id,
|
|
limits=active_limits,
|
|
)
|
|
|
|
try:
|
|
with atomic_checkpoint_directory(output_path, validate=verify) as staging:
|
|
try:
|
|
for copy, snapshot in zip(copies, copy_snapshots, strict=True):
|
|
_copy_snapshot(snapshot, staging / copy.relative_path)
|
|
for shard_name, shard in zip(shard_names, plan, strict=True):
|
|
tensors: dict[str, torch.Tensor] = {}
|
|
for spec in shard:
|
|
tensor = reconstruct_logical_tensor(validation, spec.logical_tensor_id)
|
|
tensors[spec.name] = tensor
|
|
oracles[spec.name] = _TensorOracle(
|
|
shape=tuple(tensor.shape),
|
|
dtype=str(tensor.dtype).removeprefix("torch."),
|
|
sha256=_tensor_digest(tensor),
|
|
)
|
|
_save_safetensors_file(tensors, staging / shard_name)
|
|
del tensors
|
|
if index_name is not None:
|
|
_write_json(
|
|
staging / index_name,
|
|
{
|
|
"metadata": {"total_size": admission.logical_bytes},
|
|
"weight_map": dict(sorted(weight_map.items())),
|
|
},
|
|
)
|
|
output_names = [*copy_paths, *shard_names]
|
|
if index_name is not None:
|
|
output_names.append(index_name)
|
|
output_records = [
|
|
_output_record(staging / name) for name in sorted(output_names)
|
|
]
|
|
output_digests = tuple(sorted(item["sha256"] for item in output_records))
|
|
try:
|
|
provenance_record = provenance_factory(output_digests)
|
|
provenance = _verify_provenance(
|
|
provenance_record.to_dict(),
|
|
output_digests=output_digests,
|
|
source_digests=tuple(
|
|
snapshot.sha256 for snapshot in source_snapshots
|
|
),
|
|
configuration_digest=next(
|
|
snapshot.sha256
|
|
for snapshot in copy_snapshots
|
|
if snapshot.relative_path == "config.json"
|
|
),
|
|
source_topology=source_topology,
|
|
)
|
|
except CheckpointContractError:
|
|
raise
|
|
except Exception as error:
|
|
raise CheckpointContractError(
|
|
"DCI_EVIDENCE_UNAVAILABLE",
|
|
detail="provenance_factory_failed",
|
|
) from error
|
|
artifact_id = provenance["artifact_id"]
|
|
if getattr(provenance_record, "artifact_id", None) != artifact_id:
|
|
raise CheckpointContractError(
|
|
"DCI_EVIDENCE_UNAVAILABLE",
|
|
detail="provenance_artifact_identity_mismatch",
|
|
)
|
|
_write_json(staging / "checkpoint-provenance.json", provenance)
|
|
source_records = [snapshot.file_record() for snapshot in source_snapshots]
|
|
manifest = _manifest(
|
|
artifact_id=artifact_id,
|
|
descriptor_digest=descriptor_digest,
|
|
source_records=source_records,
|
|
source_topology=provenance["source_topology"],
|
|
validation=validation,
|
|
output_records=output_records,
|
|
index_name=index_name,
|
|
admission=admission,
|
|
provenance=provenance,
|
|
)
|
|
_write_json(staging / "conversion-manifest.json", manifest)
|
|
manifest_digest = _file_digest(staging / "conversion-manifest.json")
|
|
_write_json(
|
|
staging / "abliteration_metadata.json",
|
|
{
|
|
"schema_version": 2,
|
|
"artifact_id": artifact_id,
|
|
"checkpoint_provenance": "checkpoint-provenance.json",
|
|
"conversion_manifest": "conversion-manifest.json",
|
|
"state_classification": "weights_only",
|
|
"lost_state": provenance["state"]["lost_state"],
|
|
},
|
|
)
|
|
except CheckpointContractError:
|
|
raise
|
|
except Exception as error:
|
|
raise CheckpointContractError(
|
|
"DCI_MATERIALIZE_FAILED",
|
|
detail="canonical_write_failed",
|
|
) from error
|
|
except CheckpointContractError:
|
|
raise
|
|
except Exception as error:
|
|
raise CheckpointContractError(
|
|
"DCI_PROMOTION_FAILED",
|
|
detail="canonical_promotion_failed",
|
|
) from error
|
|
return CanonicalWriteResult(
|
|
artifact_id=artifact_id,
|
|
output_path=output_path.resolve(),
|
|
weight_files=shard_names,
|
|
manifest_digest=manifest_digest,
|
|
)
|