ActionCodec2 / runtime /catalog.py
ZibinDong's picture
Publish audited ActionCodec2 release files
ce32ca3 verified
Raw History Blame Contribute Delete
12.1 kB
"""Load a named ActionCodec2 variant or a standalone saved processor."""
from __future__ import annotations
import hashlib
import importlib
import importlib.util
import json
from pathlib import Path
import re
import sys
PROFILE_FILES = ("config.yaml", "primitives.npz", "bpe.json", "config.json", "processor_config.json")
SHARED_PATTERNS = (
"config.json", "processor_config.json", "processing_actioncodec2.py", "variants.json",
"runtime/**", "actioncodec2_kernels/**", "setup.py", "pyproject.toml", "LICENSE",
"README.md", "requirements.txt",
)
VARIANT_ALIASES = {
**{f"paper-{order}": f"paper-o{index}-5mm-4k-2bin-1p2ms"
for index, order in enumerate(("1st", "2nd"), 1)},
**{f"extended-{order}-{precision}-{size}k":
f"extended-o{index}-{precision}-{size}k-2bin-1p2ms"
for index, order in enumerate(("1st", "2nd"), 1)
for precision in ("1mm", "5mm", "10mm") for size in (1, 2, 4, 8, 16)
if precision != "1mm" or size != 1},
**{f"sparse-{dynamics}-{mode}": f"sparse-o1-5mm-4k-{mode}-{speed}"
for dynamics, speed in (("standard", "1p2ms"), ("high-dynamic", "2ms"))
for mode in ("2bin", "21bin")},
}
def resolve_variant_name(variant, variants):
"""Resolve either published spelling against an old or new catalog."""
if variant in variants:
return variant
canonical = VARIANT_ALIASES.get(variant, variant)
if canonical in variants:
return canonical
for legacy, name in VARIANT_ALIASES.items():
if name == canonical and legacy in variants:
return legacy
raise ValueError(f"select variant= from: {', '.join(sorted(variants))}")
def asset_inventory(directory: Path) -> dict[str, str]:
"""Hash the complete configuration and fitted assets for one variant."""
sparse = (directory / "sparse_router_config.yaml").is_file()
names = ["sparse_router_config.yaml" if sparse else "router_config.yaml", "config.json", "processor_config.json"]
profiles = [name for name in ("eef", "joint") if (directory / "profiles" / name).is_dir()]
if not profiles:
raise ValueError("variant has no fitted profiles")
names.extend(f"profiles/{profile}/{name}" for profile in profiles
for name in (tuple("sparse_bpe.json" if n == "bpe.json" else n for n in PROFILE_FILES) if sparse else PROFILE_FILES))
names.extend(f"profiles/{profile}/preprocessing.json" for profile in profiles
if (directory / "profiles" / profile / "preprocessing.json").is_file())
return {name: hashlib.sha256((directory / name).read_bytes()).hexdigest()
for name in sorted(names)}
def inventory_fingerprint(files: dict[str, str]) -> str:
"""Return the stable identity of a fitted asset inventory."""
return hashlib.sha256(json.dumps(files, sort_keys=True, separators=(",", ":")).encode()).hexdigest()
def _check_inventory(directory: Path, record: dict) -> None:
files = asset_inventory(directory)
if files != record.get("files") or inventory_fingerprint(files) != record.get("fingerprint"):
raise ValueError("ActionCodec2 asset fingerprint mismatch; restore the complete selected variant")
class _VariantBinding:
@property
def variant(self):
return self._variant_origin.get("name")
@property
def variant_fingerprint(self):
return self._variant_origin.get("fingerprint")
def for_action_space(self, name):
codec = super().for_action_space(name)
codec._variant_origin = dict(self._variant_origin)
return codec
def fit(self, *args, **kwargs):
result = super().fit(*args, **kwargs)
self._variant_origin = {}
return result
def save_pretrained(self, save_directory, push_to_hub=False, **kwargs):
directory = Path(save_directory)
include_training_report = kwargs.pop("include_training_report", False)
if (directory / "variants.json").is_file():
raise ValueError("save a selected variant to a separate directory, outside the catalog root")
if not push_to_hub and kwargs:
raise TypeError(f"unused save_pretrained keyword(s): {', '.join(sorted(kwargs))}")
files = super().save_pretrained(directory, include_training_report=include_training_report)
inventory = asset_inventory(directory)
manifest = directory / "artifact_manifest.json"
manifest.write_text(json.dumps({
"format_version": 1,
"origin": self._variant_origin,
"files": inventory,
"fingerprint": inventory_fingerprint(inventory),
}, indent=2) + "\n", encoding="utf-8")
files.append(str(manifest))
if push_to_hub:
package = type(self).__module__.split(".frontend.", 1)[0]
importlib.import_module(f"{package}.backends.actioncodec2.hf").upload_pretrained_directory(directory, **kwargs)
return files
class ActionCodec2:
"""Hugging Face entry point for catalog and standalone artifacts."""
@classmethod
def register_for_auto_class(cls, auto_class="AutoProcessor"):
return cls
@classmethod
def from_pretrained(cls, pretrained_model_name_or_path, *, variant=None,
variant_fingerprint=None, action_space=None, **kwargs):
source = Path(pretrained_model_name_or_path).expanduser()
kwargs.pop("_from_auto", None)
kwargs.pop("trust_remote_code", None)
subfolder = kwargs.pop("subfolder", "")
if subfolder:
raise ValueError("select an ActionCodec2 catalog variant with variant=, not subfolder=")
allowed = {"cache_dir", "force_download", "local_files_only", "token", "revision", "repo_type"}
unknown = sorted(set(kwargs) - allowed)
if unknown:
raise TypeError(f"unsupported from_pretrained keyword(s): {', '.join(unknown)}")
if variant is not None and (not isinstance(variant, str) or
re.fullmatch(r"[a-z0-9]+(?:-[a-z0-9]+)*", variant) is None):
raise ValueError("variant must be a published variant name")
if variant_fingerprint is not None and (
not isinstance(variant_fingerprint, str) or
re.fullmatch(r"[0-9a-f]{64}", variant_fingerprint) is None
):
raise ValueError("variant_fingerprint must be a SHA-256 fingerprint")
remote = not source.is_dir()
if remote and str(pretrained_model_name_or_path).startswith(("/", "./", "../", "~")):
raise FileNotFoundError(f"ActionCodec2 artifact does not exist: {source}")
revision = None
if remote:
from huggingface_hub import hf_hub_download, snapshot_download
code_revision = Path(__file__).parent.name
if re.fullmatch(r"[0-9a-f]{40}", code_revision):
requested = kwargs.get("revision")
if requested and re.fullmatch(r"[0-9a-f]{40}", requested) and requested != code_revision:
raise ValueError("ActionCodec2 code and assets must use the same revision")
kwargs["revision"] = code_revision
metadata_file = Path(hf_hub_download(
str(pretrained_model_name_or_path), "processor_config.json", **kwargs
))
root = metadata_file.parent
revision = root.name
kwargs["revision"] = revision
else:
root = source
metadata_file = root / "processor_config.json"
metadata = json.loads(metadata_file.read_text(encoding="utf-8"))
if not isinstance(metadata, dict):
raise ValueError("invalid ActionCodec2 processor configuration")
record = None
origin = {}
if metadata.get("variant_catalog") == "variants.json":
catalog_path = (Path(hf_hub_download(
str(pretrained_model_name_or_path), "variants.json", **kwargs
)) if remote else root / "variants.json")
catalog = json.loads(catalog_path.read_text(encoding="utf-8"))
if (not isinstance(catalog, dict) or catalog.get("format_version") != 1 or
not isinstance(catalog.get("variants"), dict)):
raise ValueError("unsupported ActionCodec2 variant catalog")
variants = catalog["variants"]
variant = resolve_variant_name(variant, variants)
record = variants[variant]
if not isinstance(record, dict):
raise ValueError("invalid ActionCodec2 variant record")
directory = root / "variants" / variant
if remote:
root = Path(snapshot_download(
str(pretrained_model_name_or_path),
allow_patterns=[*SHARED_PATTERNS, f"variants/{variant}/**"], **kwargs,
))
directory = root / "variants" / variant
_check_inventory(directory, record)
origin = {"name": variant, "fingerprint": record["fingerprint"]}
if remote:
origin.update(repo_id=str(pretrained_model_name_or_path), revision=revision)
else:
if remote:
root = Path(snapshot_download(
str(pretrained_model_name_or_path),
allow_patterns=[*SHARED_PATTERNS, "router_config.yaml", "profiles/**",
"sparse_router_config.yaml", "artifact_manifest.json"], **kwargs,
))
directory = root
manifest = root / "artifact_manifest.json"
if manifest.is_file():
record = json.loads(manifest.read_text(encoding="utf-8"))
if (not isinstance(record, dict) or record.get("format_version") != 1 or
not isinstance(record.get("origin"), dict)):
raise ValueError("unsupported ActionCodec2 saved artifact manifest")
_check_inventory(directory, record)
origin = record["origin"]
if variant is not None and VARIANT_ALIASES.get(variant, variant) != VARIANT_ALIASES.get(origin.get("name"), origin.get("name")):
raise ValueError("saved processor contains a different variant; load the catalog to switch")
if variant_fingerprint is not None and variant_fingerprint != origin.get("fingerprint"):
raise ValueError("variant fingerprint differs from the tokenizer bound to this policy")
family = "actioncodec2_sparse" if (directory / "sparse_router_config.yaml").is_file() else "actioncodec2"
if __package__ == "actioncodec2.core":
package_name = __package__
else:
runtime = root / "runtime"
package_file = runtime / "__init__.py"
if not package_file.is_file():
raise FileNotFoundError(f"ActionCodec2 runtime is missing from {root}")
identity = hashlib.sha256(str(runtime.resolve()).encode()).hexdigest()[:16]
package_name = f"_actioncodec2_artifact_{identity}"
if package_name not in sys.modules:
spec = importlib.util.spec_from_file_location(
package_name, package_file, submodule_search_locations=[str(runtime)]
)
package = importlib.util.module_from_spec(spec)
sys.modules[package_name] = package
spec.loader.exec_module(package)
processor = importlib.import_module(f"{package_name}.frontend.{family}.processor")
base = processor.ActionCodec2Sparse if family == "actioncodec2_sparse" else processor.ActionCodec2
if not hasattr(processor, "_catalog_processor_class"):
processor._catalog_processor_class = type(
base.__name__, (_VariantBinding, base), {"__module__": processor.__name__}
)
codec = processor._catalog_processor_class.from_pretrained(directory, action_space=action_space)
codec._variant_origin = origin
codec._source_directory = root
return codec