Upload moe.py with huggingface_hub
Browse files
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")
|