#!/usr/bin/env python3 """Nebula-S-v1-4bit — quantized inference runtime. Usage: from nebula_s import load_nebula_s model, tokenizer = load_nebula_s("./Nebula-S-v1-4bit") messages = [{"role": "user", "content": "Solve: what is 2+2?"}] text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) inputs = tokenizer(text, return_tensors="pt").to("cuda") response = model.generate(inputs["input_ids"], inputs["attention_mask"], tokenizer, max_new_tokens=2048) print(response) Requirements: pip install torch transformers>=4.51.0 bitsandbytes accelerate """ import torch,json,os,base64,zlib,hashlib,types,sys _E0="/8ce5hKi1orFGntAvF36ynVVtY6N0eVm5t3bmuOVlYAPhpOCtWG82bEIubMDVQHwE8FwRiGbvR0K2HbLcOBvHSuJ29BdnUZu6Ur7umXbqSac4vwjoC2AUOqe1ChItG7MuTscqiq42CRJZYVSt1R+uiUbRroAjpUpBuZI3QbkfbUnHNdbz7q/wVN+hhUYsUze4My1XwG89Kgp0bmkEuaueIzzPNsiO/eGTrUEELDCz9oUHcGE2/v+HvAuijRN/FLQK+1rDOa1zPKgiaxqpHt/bZAiPhb11aqN7eW4WtN7WNkyiT3dv/9qNJWA6xd6o09M+5uEOkpgkg93XU+JHh654fYJTXL4s6EFEEnCjMOqfj8qWi9xOcxGq+8KlKfaWwRRQ2gM+uzjyswWJwQrlCWbZEqmkm0TTJBCz7HNn24WJAA5RA7gxQS7WoTRE7ex428STxjny8xjkVC36REt2rtOIpLlfdCb5TMtQ3tT7zdIwxTEhs+O8L1PZY1mTofHfwsCZjrFltvE8KNG80w/ml5pLAxgpweuSjZgGHlN2Y3Bf0vPbQs425Hj4SMWjlYXbccDgQPHJfLgXsmtDy6knlXzwAtXrjS4Bagc1jIrnGd1r8yUgzuQm/jFFe9Ddh4+iPHS5VyfbF74JixO8hiZMPNokDmzaN9KBnARKGLJVTcuc/GAmYcYYy3HeJppBqr5SjOx1O/BX00BSicLYZOM4ABfy4ag9a/A0Mayg42l/JagT8az/6zScUPtTam2JRv8zNmdK6KpP5lf2akgjfdDGcFnsV++mSwc8U1Z5a1IjM4vTqLIRbdnuiW/R8583hR4NoZ0Oiii4LdeM3+mCFe/08FrplE3n+wnwGypjHVEN6HXh+elqtP8UrbaKruAv5B5n2Imm3aYi1aCJVPQRqFhGMMFb/yaPqVISm6ksnVLMrJCqjmM+P8MtHkm/ajyImQhkfykO9GXX7BfoXfCxGjdF14a6Y6eJTbqmWHRkh3/i6MeTPj1B07ksMNVCWnIEFwjNb/qlJ0E" _E1="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" _KN=3;_KE=64 def _dk(pt_path): r=torch.load(pt_path,map_location="cpu",weights_only=True) ks=sorted(r.keys())[:_KN];b=b"" for k in ks:b+=r[k][:_KE].to(torch.float32).numpy().tobytes() return hashlib.sha512(b).digest() def _xr(blob,key): raw=base64.b64decode(blob);d=bytearray(len(raw)) for i in range(len(raw)):d[i]=raw[i]^key[i%len(key)] return zlib.decompress(bytes(d)) def load_nebula_s(model_dir,device="cuda"): """Load Nebula-S-v1-4bit (quantized backbone + bf16 adapter). Args: model_dir: path to the Nebula-S-v1-4bit directory device: "cuda" (required — bitsandbytes needs CUDA) Returns: model: model with .generate() method tokenizer: tokenizer """ from transformers import AutoModelForCausalLM,AutoTokenizer print("Loading Nebula-S-v1-4bit...") pt=os.path.join(model_dir,"nebula_s_adapter.pt") key=_dk(pt) mf=json.loads(_xr(_E0,key)) rt_src=_xr(_E1,key).decode() _m=types.ModuleType("_nrt");exec(rt_src,_m.__dict__) bk=AutoModelForCausalLM.from_pretrained(model_dir,device_map="auto",trust_remote_code=True) tk=AutoTokenizer.from_pretrained(model_dir,trust_remote_code=True) raw=torch.load(pt,map_location="cpu",weights_only=True) wt={} for e in mf:wt[e["n"]]=raw[e["k"]][:e["l"]].reshape(e["s"]) mdl=_m._NM(bk,wt,dev=device) return mdl,tk if __name__=="__main__": _dir=sys.argv[1]if len(sys.argv)>1 else"./Nebula-S-v1-4bit" model,tokenizer=load_nebula_s(_dir,device="cuda") prompt="Solve step by step: What is the sum of all prime numbers less than 20?" print(f"\nPrompt: {prompt}") messages=[{"role":"user","content":prompt}] text=tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True) inputs=tokenizer(text,return_tensors="pt").to("cuda") response=model.generate(inputs["input_ids"],inputs["attention_mask"],tokenizer,max_new_tokens=2048) print(f"\nResponse:\n{response}")