mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-06-22 22:01:14 +00:00
[AZ-297] C7 InferenceRuntime: Protocol + DTOs + factory
Freezes the c7_inference Public API per _docs/02_document/contracts/c7_inference/inference_runtime_protocol.md v1.0.0: - InferenceRuntime Protocol (6 methods: compile_engine, deserialize_engine, infer, release_engine, thermal_state, current_runtime_label) in components/c7_inference/interface.py. - DTOs (PrecisionMode enum, OptimizationProfile, BuildConfig, EngineCacheEntry, EngineHandle opaque marker) in _types/inference.py — placed at the L1 types layer so C10 can re-export EngineCacheEntry without crossing the components.* boundary (AZ-270 AC-6). - ThermalState DTO expanded in _types/thermal.py from the AZ-355 forward-declared stub to the AZ-297 contract shape (cpu/gpu temp, thermal_throttle_active, measured_clock_mhz, measured_at_ns, is_telemetry_available). Invariant I-6: when telemetry is unavailable, throttle is False. - Error family rooted at c7_inference.errors.RuntimeError (9 subtypes: EngineBuildError, EngineDeserializeError, EngineHashMismatchError, EngineSchemaMismatchError, EngineSidecarMissingError, CalibrationCacheError, InferenceError, OutOfMemoryError, TelemetryUnavailableError). RuntimeNotAvailableError stays in runtime_root/errors.py — composition-time, outside the family. - C7InferenceConfig per-component config block (runtime label, thermal_poll_hz, engine_cache_dir) with constructor-time validation rejecting unknown runtime labels. - Composition-root factory build_inference_runtime in runtime_root/inference_factory.py with three BUILD_* gates (BUILD_TENSORRT_RUNTIME, BUILD_ONNX_TRT_EP_RUNTIME, BUILD_PYTORCH_FP16_RUNTIME). Concrete strategy modules are imported lazily via __import__ AFTER the flag check, so a Tier-0 build with the flag OFF MUST NOT load the strategy module (AC-5 / I-5; verifiable via sys.modules). - 37 conformance tests cover all 8 ACs + NFR-perf-factory (p99 build under 200 ms × 1000 calls) + NFR-reliability-error-family. AC-8 introspects the contract file's Shape table and asserts method parity against the runtime Protocol; also asserts all 9 error subtypes are documented. Retired the AZ-263 scaffolding EngineCacheEntry from _types/manifests.py (replaced by the AZ-297 canonical shape in _types/inference.py); updated the LightGlue-flavoured EngineHandle Protocol docstring in _types/manifests.py to rationalize its intentional dual existence with the C7 opaque EngineHandle (same name, different consumer-side cut, mirroring the C4/C5 ISam2GraphHandle pattern). Stale ThermalState.throttle docstring references in c4_pose/config.py, c4_pose/interface.py, and _types/pose.py updated to thermal_throttle_active. Full unit-test sweep: 843 passed, 2 pre-existing environment skips (cmake, actionlint). Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
"""C7 inference runtime config block (AZ-297).
|
||||
|
||||
Registered into ``config.components['c7_inference']`` by the package
|
||||
``__init__.py``. The composition-root factory
|
||||
:func:`gps_denied_onboard.runtime_root.inference_factory.build_inference_runtime`
|
||||
reads this block to select the strategy and locate the engine cache.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from typing import Final
|
||||
|
||||
from gps_denied_onboard.config.schema import ConfigError
|
||||
|
||||
__all__ = [
|
||||
"C7InferenceConfig",
|
||||
"KNOWN_RUNTIMES",
|
||||
]
|
||||
|
||||
KNOWN_RUNTIMES: Final[frozenset[str]] = frozenset(
|
||||
{"tensorrt", "onnx_trt_ep", "pytorch_fp16"}
|
||||
)
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class C7InferenceConfig:
|
||||
"""Per-component config for C7 inference.
|
||||
|
||||
``runtime`` selects exactly one of the three strategies
|
||||
(``tensorrt`` / ``onnx_trt_ep`` / ``pytorch_fp16``); the
|
||||
composition-root factory respects compile-time ``BUILD_*`` gating
|
||||
on top of this label (a runtime whose flag is OFF raises
|
||||
:class:`RuntimeNotAvailableError` at composition time).
|
||||
|
||||
``thermal_poll_hz`` is the cadence at which AZ-302's
|
||||
``ThermalStatePublisher`` polls ``tegrastats`` / ``jtop``;
|
||||
default 1 Hz keeps the SDK telemetry source cool.
|
||||
|
||||
``engine_cache_dir`` is the filesystem root where compiled
|
||||
``.engine`` binaries + ``.sha256`` sidecars live; the C10
|
||||
pre-flight ``CacheProvisioner`` writes here.
|
||||
"""
|
||||
|
||||
runtime: str = "pytorch_fp16"
|
||||
thermal_poll_hz: float = 1.0
|
||||
engine_cache_dir: str = "/var/lib/gps-denied/engines"
|
||||
|
||||
def __post_init__(self) -> None:
|
||||
if self.runtime not in KNOWN_RUNTIMES:
|
||||
raise ConfigError(
|
||||
f"C7InferenceConfig.runtime={self.runtime!r} not in "
|
||||
f"{sorted(KNOWN_RUNTIMES)}"
|
||||
)
|
||||
if self.thermal_poll_hz <= 0:
|
||||
raise ConfigError(
|
||||
f"C7InferenceConfig.thermal_poll_hz must be > 0; "
|
||||
f"got {self.thermal_poll_hz}"
|
||||
)
|
||||
if not self.engine_cache_dir:
|
||||
raise ConfigError(
|
||||
"C7InferenceConfig.engine_cache_dir must be non-empty"
|
||||
)
|
||||
Reference in New Issue
Block a user