v0.6.1: layer-major prompt processing when experts stream from the SSD (each layer's experts read once per prompt)
e7d8666 verified Download test_layer_major.py from ryugyosoft/onw: direct link, hf CLI and curl.
- Browser
- Download file 1.83 kB
-
https://huggingface.co/ryugyosoft/onw/resolve/main/test_layer_major.py
- Command line
-
hf download hf://ryugyosoft/onw/test_layer_major.py
-
curl -L -o test_layer_major.py https://huggingface.co/ryugyosoft/onw/resolve/main/test_layer_major.py
1.83 kB
| """Layer-major prefill (SegmentedModel.prefill) == block-by-block prefill (step): same logits and same state. | |
| usage: python test_layer_major.py MODEL_DIR (set ONW_EXPERT_GB to test it with experts streamed from the SSD)""" | |
| import sys, time | |
| import numpy as np | |
| import openvino as ov | |
| from onw.runtime import SegmentedModel | |
| def main(): | |
| m = SegmentedModel(ov.Core(), sys.argv[1], "NPU", {"CACHE_DIR": sys.argv[1] + "/npu_cache"}) | |
| ids = list(np.random.default_rng(0).integers(1000, 30000, 83)) # 5 full blocks + a 3-token tail | |
| m.reset() | |
| t = time.time() | |
| a = m.prefill(ids) | |
| ta, sa = time.time() - t, {k: v.copy() for k, v in m.state.items()} | |
| ca = m.cur | |
| m.reset() | |
| t, b, s = time.time(), None, 0 | |
| while s < len(ids): | |
| k = min(m.S, len(ids) - s) | |
| b = m.step(ids[s:s + k], want_logits=s + k >= len(ids)) | |
| s += k | |
| tb = time.time() - t | |
| err = float(np.abs(a.astype(np.float32) - b.astype(np.float32)).max()) | |
| serr = max(float(np.abs(sa[k].astype(np.float32)[..., :ca, :] if k.startswith("past_") else sa[k].astype(np.float32) | |
| - (m.state[k].astype(np.float32)[..., :ca, :] if k.startswith("past_") else m.state[k].astype(np.float32))).max()) | |
| for k in sa if not k.startswith("past_")) | |
| kv = max(float(np.abs(sa[k][:, :, :ca].astype(np.float32) - m.state[k][:, :, :ca].astype(np.float32)).max()) | |
| for k in sa if k.startswith("past_")) | |
| print(f"{len(ids)} tokens: layer-major {ta:.2f}s, block-major {tb:.2f}s | cur {ca} vs {m.cur} | " | |
| f"max |logit diff| {err:.4f}, argmax equal {np.array_equal(a.argmax(-1), b.argmax(-1))}, " | |
| f"max state diff {serr:.4f}, max KV diff {kv:.4f}") | |
| if hasattr(m.bank, "stats"): | |
| print("cache:", m.bank.stats()) | |
| if __name__ == "__main__": | |
| main() | |