Views
No views yet
1git clone https://github.com/LUMIA-Group/MemSFT.git
2cd MemSFT
3
4conda create -n memsft-generate python=3.10 pip -y
5conda activate memsft-generate
6python -m pip install -e .
7python -m pip install \
8 "torch>=2.4,<2.7" \
9 "transformers==4.51.3" \
10 "huggingface-hub==0.35.3" \
11 "accelerate>=0.34,<2"1from pathlib import Path
2
3import torch
4from huggingface_hub import snapshot_download
5from transformers import AutoModelForCausalLM, AutoTokenizer
6
7from memsft.router.adaptive_memdec import AdaptiveMemoryDecoder
8
9device = torch.device("cuda:0")
10base_id = "Qwen/Qwen3-14B"
11memory_id = "Jiarui-Wang/MemSFT-Qwen3-Bio-Memory-1.7B"
12router_repo = "Jiarui-Wang/MemSFT-Qwen3-Routers"
13router_subdir = "Qwen3-14B-Bio-M1.7B-Router"
14
15router_root = snapshot_download(
16 repo_id=router_repo,
17 revision="v1.0.0",
18 allow_patterns=[f"{router_subdir}/*"],
19)
20router_path = str(Path(router_root) / router_subdir)
21
22tokenizer = AutoTokenizer.from_pretrained(
23 base_id,
24 revision="40c069824f4251a91eefaf281ebe4c544efd3e18",
25)
26base = AutoModelForCausalLM.from_pretrained(
27 base_id,
28 revision="40c069824f4251a91eefaf281ebe4c544efd3e18",
29 torch_dtype=torch.bfloat16,
30 low_cpu_mem_usage=True,
31).to(device).eval()
32memory = AutoModelForCausalLM.from_pretrained(
33 memory_id,
34 revision="v1.0.0",
35 torch_dtype=torch.bfloat16,
36 low_cpu_mem_usage=True,
37).to(device).eval()
38
39vocab_size = len(tokenizer)
40base.resize_token_embeddings(vocab_size)
41memory.resize_token_embeddings(vocab_size)
42base.requires_grad_(False)
43memory.requires_grad_(False)
44model = AdaptiveMemoryDecoder(
45 base_lm=base,
46 knn_generator=memory,
47 router_path=router_path,
48 router_device=device,
49).eval()
50model.set_tokenizer(tokenizer)1sequence = (
2 "MKSILIEKPNQLAIVEREIPTPSAGEVRVKVKLAGICGSDSHIYRGHNPFAKYPRVIGHEFFGVIDAV"
3 "GEGVESARVGERVAVDPVVSCGHCYPCSIGKPNVCTTLAVLGVHADGGFSEYAVVPAKNAWKIPEAVA"
4 "DQYAVMIEPFTIAANVTGHGQPTENDTVLVYGAGPIGLTIVQVLKGVYNVKNVIVADRIDERLEKAKE"
5 "SGADWAINNSQTPLGEIFTEKGIKPTLIIDAACHPSILKEAVTLASPAARIVLMGFSSEPSEVIQQGI"
6 "TGKELSIFSSRLNANKFPIVIDWLSKGLIKPEKLITHTFDFQHVADAISLFEQDQKHCCKVLLTFSE"
7)
8prompt = (
9 r"<PROTEIN> "
10 + sequence
11 + r" </PROTEIN> What is the EC number associated with the enzymatic "
12 r"function of this protein? Please put the final enzyme within \boxed{} "
13 r"using an EC number such as ECx.x.x.x, and separate multiple entries "
14 r"with commas."
15)
16
17messages = [{"role": "user", "content": prompt}]
18prompt_text = tokenizer.apply_chat_template(
19 messages,
20 tokenize=False,
21 add_generation_prompt=True,
22 enable_thinking=False,
23)
24inputs = tokenizer(prompt_text, return_tensors="pt").to(device)
25
26with torch.inference_mode():
27 output_ids = model.generate(
28 **inputs,
29 do_sample=False,
30 max_new_tokens=32,
31 eos_token_id=tokenizer.eos_token_id,
32 pad_token_id=tokenizer.eos_token_id,
33 )
34
35answer = tokenizer.decode(
36 output_ids[0, inputs["input_ids"].shape[1]:],
37 skip_special_tokens=True,
38)
39print(answer)\boxed{EC1.1.1.-}1.1.1.-. For comparison, using the same prompt and deterministic generation
configuration, Qwen3-14B alone predicts EC 4.2.1.22. The outputs were
reproduced in BF16 on NVIDIA A800 80GB GPUs.| Configuration | Memory size | Biology-Instructions ↑ |
|---|---|---|
| Qwen3-14B | — | 6.64 |
| Qwen3-14B + MemSFT | 1.7B | 30.38 |
Qwen/Qwen3-14BJiarui-Wang/MemSFT-Qwen3-Bio-Memory-1.7BJiarui-Wang/MemSFT-Qwen3-Routers/Qwen3-14B-Bio-M1.7B-Router.safetensors router checkpoints. Legacy .pt
checkpoints should be loaded only from trusted sources; the MemSFT loader uses
PyTorch's restricted weights_only=True mode for compatibility.1@misc{wang2026memsftmitigatingalignmenttax,
2 title={MemSFT: Mitigating Alignment Tax with an External Parametric Memory},
3 author={Jiarui Wang and Xiang Shi and Jiaqi Cao and Rubin Wei and Xiquan Wang and Hao Sun and Jingzhi Wang and Zhiqi Yang and Qipeng Guo and Bowen Zhou and Zhouhan Lin},
4 year={2026},
5 eprint={2607.25614},
6 archivePrefix={arXiv},
7 primaryClass={cs.LG},
8 url={https://arxiv.org/abs/2607.25614},
9}