Add --verify-data CLI flag, Tensor.data property, parallel DataExecutor

- CLI: --verify-data flag enables Phase 2 data verification (ADR-0020)
- Tensor.data: returns actual numpy values (verify-data) or zeros placeholder
- Tensor.__repr__: shows value summary or data=N/A (placeholder)
- DataExecutor: ThreadPoolExecutor for same-timestamp parallel op execution
- BenchResult.engine: exposes op_log/memory_store for Phase 2 access

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-09 09:34:01 -07:00
parent 59e36f0c34
commit dc3fb02aed
8 changed files with 174 additions and 12 deletions
+39
View File
@@ -5,6 +5,8 @@ import weakref
from dataclasses import dataclass
from typing import Literal
import numpy as np
from kernbench.policy.address.allocator import PEMemAllocator
from kernbench.policy.placement.dp import DPPolicy, ShardSpec
from kernbench.runtime_api.kernel import TensorArg, TensorArgShard
@@ -50,6 +52,20 @@ def dtype_itemsize(dtype: str) -> int:
return _DTYPE_ITEMSIZE[dtype]
_NUMPY_DTYPE = {
"f16": np.float16, "fp16": np.float16, "float16": np.float16,
"f32": np.float32, "fp32": np.float32, "float32": np.float32,
"bf16": np.float16,
"i8": np.int8, "int8": np.int8,
"i16": np.int16, "int16": np.int16,
"i32": np.int32, "int32": np.int32,
}
def _numpy_dtype(dtype: str) -> np.dtype:
return np.dtype(_NUMPY_DTYPE.get(dtype, np.float16))
def deploy_tensor(
*,
name: str,
@@ -129,6 +145,7 @@ class Tensor:
self._dp_metadata: DPMetadata | None = None
self._handle: TensorHandle | None = None
self._ctx_ref: weakref.ref | None = None # set by RuntimeContext
self._memory_store = None # set by RuntimeContext when enable_data=True
def __del__(self) -> None:
if self._ctx_ref is None or self._handle is None:
@@ -137,6 +154,28 @@ class Tensor:
if ctx is not None:
ctx._free_tensor(self)
def __repr__(self) -> str:
parts = [f"tensor(name={self.name}, shape={self.shape}, dtype={self.dtype}"]
if self._memory_store is not None and self._handle is not None:
arr = self.data
parts.append(f", mean={float(arr.mean()):.4g}, norm={float(np.linalg.norm(arr)):.4g}")
else:
parts.append(", data=N/A (placeholder)")
parts.append(")")
return "".join(parts)
@property
def data(self) -> np.ndarray:
"""Tensor data as numpy array. Returns actual values when enable_data=True,
zeros placeholder otherwise (like an uninitialized tensor)."""
if self._memory_store is not None and self._handle is not None:
shard = self._handle.shards[0]
try:
return self._memory_store.read("hbm", shard.pa, shape=self.shape, dtype=self.dtype)
except KeyError:
pass
return np.zeros(self.shape, dtype=_numpy_dtype(self.dtype))
@property
def itemsize(self) -> int:
return dtype_itemsize(self.dtype)