onw / test_layer_major.py
ryugyosoft's picture
v0.6.1: layer-major prompt processing when experts stream from the SSD (each layer's experts read once per prompt)
e7d8666 verified
Raw History Blame Contribute Delete
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()