File size: 1,394 Bytes
61790a1 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import argparse,json
from pathlib import Path
import torch
from tokenizers import Tokenizer
from model import Config,CodeSprout
def load(root,device):
config=Config(**json.loads((root/'config.json').read_text()));model=CodeSprout(config)
model.load_state_dict(torch.load(root/'model.pt',map_location='cpu',weights_only=True));model=model.to(device).eval();tok=Tokenizer.from_file(str(root/'tokenizer.json'));return model,tok
def complete(model,tok,prompt,language,tokens=120,temperature=.7):
normalized=prompt.rstrip();trailing=prompt[len(normalized):]
ids=torch.tensor([tok.encode('<|'+language+'|>\n'+normalized).ids],device=next(model.parameters()).device)
result=model.generate(ids,steps=tokens,temperature=temperature,eos=tok.token_to_id('<|endoftext|>'))
text=tok.decode(result[0,ids.shape[1]:].tolist())
return text[len(trailing):] if trailing and text.startswith(trailing) else text
if __name__=='__main__':
p=argparse.ArgumentParser();p.add_argument('--checkpoint',type=Path,required=True);p.add_argument('--language',choices=['html','javascript','python','typescript'],default='python');p.add_argument('--prompt',default='def add(a, b):\n');p.add_argument('--tokens',type=int,default=120);a=p.parse_args();device='cuda' if torch.cuda.is_available() else 'cpu';model,tok=load(a.checkpoint,device);print(complete(model,tok,a.prompt,a.language,a.tokens))
|