File size: 1,541 Bytes
49c3379
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Image chat on an onw model: turn 1 with an image, turn 2 reusing the kept state vs recomputed.
usage: python test_image.py MODEL_DIR IMAGE [DEVICE]"""
import sys, time
from PIL import Image
from onw.chat import ChatEngine


def run(e, msgs, n=60):
    parts, st = [], None
    for d in e.stream_chat([dict(m) for m in msgs], n):
        if isinstance(d, dict):
            st = d
        else:
            parts.append(d)
    return "".join(parts), st


def main():
    e = ChatEngine(sys.argv[1], sys.argv[3] if len(sys.argv) > 3 else None)
    img = Image.open(sys.argv[2])
    t1 = [{"role": "user", "content": [{"type": "image", "image": img}, {"type": "text", "text": "この画像に何が写っていますか?一文で。"}]}]
    a1, s1 = run(e, t1)
    print(f"turn 1: {a1!r}\n   prompt {s1['prompt_tokens']} tok, vision {s1['vision_ms']:.0f} ms, prefill {s1['prefill_ms']:.0f} ms, "
          f"decode {s1['decode_tok_s']:.1f} tok/s")
    t2 = t1 + [{"role": "assistant", "content": a1}, {"role": "user", "content": "その動物の毛の色は?一言で。"}]
    t0 = time.time()
    a2, s2 = run(e, t2)
    print(f"turn 2 (reuse): {a2!r}\n   prompt {s2['prompt_tokens']} tok, reused {s2['cached_tokens']}, vision {s2['vision_ms']:.0f} ms, "
          f"prefill {s2['prefill_ms']:.0f} ms, total {time.time()-t0:.1f}s")
    e.checkpoint = None
    t0 = time.time()
    a3, s3 = run(e, t2)
    print(f"turn 2 (scratch): {a3!r}\n   total {time.time()-t0:.1f}s; identical={a2 == a3}")


if __name__ == "__main__":
    main()