Spaces:
Sleeping
Sleeping
from transformers import AutoModelForCausalLM | |
import torch | |
import gradio as gr | |
import re | |
model = AutoModelForCausalLM.from_pretrained("Manuel2011/addition_model") | |
class NumberTokenizer: | |
def __init__(self, numbers_qty=10): | |
vocab = ['+', '=', '-1', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] | |
self.numbers_qty = numbers_qty | |
self.pad_token = '-1' | |
self.encoder = {str(v):i for i,v in enumerate(vocab)} | |
self.decoder = {i:str(v) for i,v in enumerate(vocab)} | |
self.pad_token_id = self.encoder[self.pad_token] | |
def decode(self, token_ids): | |
return ' '.join(self.decoder[t] for t in token_ids) | |
def __call__(self, text): | |
return [self.encoder[t] for t in text.split()] | |
tokenizer = NumberTokenizer(13) | |
def generate_solution(input, solution_length=6, model=model): | |
try: | |
parsed_input = re.search(r'(\d)\s*\+\s*(\d)', input) | |
first_number = int(parsed_input.group(1)) | |
second_number = int(parsed_input.group(2)) | |
except: | |
return 'Invalid input' | |
model.eval() | |
input = f'{first_number} + {second_number} =' | |
input = torch.tensor(tokenizer(input)) | |
input = input | |
solution = [] | |
for i in range(solution_length): | |
output = model(input) | |
predicted = output.logits[-1].argmax() | |
input = torch.cat((input, predicted.unsqueeze(0)), dim=0) | |
solution.append(predicted.cpu().item()) | |
return tokenizer.decode(solution) | |
def solve(input): | |
return generate_solution(input, solution_length=2) | |
demo = gr.Interface(fn=solve, inputs=[gr.Textbox(label="Addition exercise", lines=1, info="The input must be of the form '1 + 2 =', with a single space between each character, and only single-digit numbers are allowed.")], | |
outputs=[gr.Textbox(label="Result", lines=1)], | |
title="Simple addition with a GPT-like model", | |
description="Perform addition of two single-digit numbers using a GPT-like model trained on a small dataset.", | |
examples=["1 + 2 =", "5 + 7 ="]) | |
demo.launch() |