UlukaDev commited on
Commit
e70cf65
·
verified ·
1 Parent(s): bd3d1bc

Upload moe.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. moe.py +44 -0
moe.py ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch, joblib
2
+ from transformers import AutoModelForCausalLM, AutoTokenizer
3
+ from peft import PeftModel
4
+ from sentence_transformers import SentenceTransformer
5
+
6
+ BASE = "microsoft/bitnet-b1.58-2B-4T-bf16"
7
+ ADAPTERS = {
8
+ "mult": "UlukaDev/bitnet-2digit-mult-expert",
9
+ "roman": "UlukaDev/bitnet-roman-numeral-expert",
10
+ }
11
+ SYS = "You are a careful calculator. Work step by step, then end with exactly 'The answer is X'."
12
+
13
+ tok = AutoTokenizer.from_pretrained(BASE)
14
+ if tok.pad_token is None: tok.pad_token = tok.eos_token
15
+ tok.padding_side = "left"
16
+
17
+ base = AutoModelForCausalLM.from_pretrained(BASE, torch_dtype=torch.bfloat16, device_map="auto")
18
+ names = list(ADAPTERS)
19
+ model = PeftModel.from_pretrained(base, ADAPTERS[names[0]], adapter_name=names[0])
20
+ for n in names[1:]:
21
+ model.load_adapter(ADAPTERS[n], adapter_name=n)
22
+ model.eval()
23
+
24
+ enc = SentenceTransformer("all-MiniLM-L6-v2")
25
+ clf = joblib.load("router.joblib")
26
+
27
+ def route(q):
28
+ return clf.predict(enc.encode([q], normalize_embeddings=True))[0]
29
+
30
+ @torch.no_grad()
31
+ def moe_generate(q, max_new_tokens=250):
32
+ expert = route(q)
33
+ model.set_adapter(expert)
34
+ msgs = [{"role":"system","content":SYS}, {"role":"user","content":q}]
35
+ enc_in = tok.apply_chat_template(msgs, add_generation_prompt=True,
36
+ return_tensors="pt", return_dict=True).to(model.device)
37
+ in_len = enc_in["input_ids"].shape[1]
38
+ out = model.generate(**enc_in, max_new_tokens=max_new_tokens, do_sample=False)
39
+ return expert, tok.decode(out[0, in_len:], skip_special_tokens=True)
40
+
41
+ if __name__ == "__main__":
42
+ for q in ["What is 34 times 57?", "Convert 1994 to Roman numerals"]:
43
+ expert, ans = moe_generate(q)
44
+ print(f"[{expert}] {q}\n -> {ans}\n")