import argparse,hashlib,json,struct,sys from pathlib import Path import numpy as np, torch ROOT=Path(__file__).resolve().parents[1];sys.path.insert(0,str(ROOT)) from src.model import EXLLM,EXLLMConfig MAGIC=b'EXLLM8\0\0' def quant_row(t): a=t.detach().float().cpu().numpy();mx=np.max(np.abs(a),axis=1);sc=np.where(mx>0,mx/127.0,1.0).astype(np.float32);q=np.clip(np.rint(a/sc[:,None]),-127,127).astype(np.int8);return q,sc def main(): ap=argparse.ArgumentParser();ap.add_argument('--checkpoint',default='weights/EXLLM-ONI5M-v1.0.pt');ap.add_argument('--out',default='weights/EXLLM-ONI5M-v1.0-int8.bin');a=ap.parse_args() c=torch.load(ROOT/a.checkpoint,map_location='cpu',weights_only=False);m=EXLLM(EXLLMConfig(**c['config']));m.load_state_dict(c['model']);m.eval();recs=[] for name,t in m.state_dict().items(): if name=='lm_head.weight':continue if name.endswith('.weight') and 'norm' in name: x=t.detach().cpu().numpy().astype(np.float16);recs.append((name,2,list(x.shape),np.array([],dtype=np.float32),x.tobytes())) elif t.ndim==2: q,sc=quant_row(t);recs.append((name,1,list(q.shape),sc,q.tobytes())) else: x=t.detach().cpu().numpy().astype(np.float16);recs.append((name,2,list(x.shape),np.array([],dtype=np.float32),x.tobytes())) out=ROOT/a.out;out.parent.mkdir(parents=True,exist_ok=True) with out.open('wb') as f: f.write(MAGIC);f.write(struct.pack('