File size: 1,833 Bytes
e7d8666
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
"""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()