Spaces:
Running on Zero
Running on Zero
Download src/task/inference/extract.py from zeguru/tiny-transformers: direct link, hf CLI and curl.
- Browser
- Download file 2.21 kB
-
https://huggingface.co/spaces/zeguru/tiny-transformers/resolve/main/src/task/inference/extract.py
- Command line
-
hf download hf://spaces/zeguru/tiny-transformers/src/task/inference/extract.py
-
curl -L -o extract.py https://huggingface.co/spaces/zeguru/tiny-transformers/resolve/main/src/task/inference/extract.py
2.21 kB
| from pydoc import text | |
| import torch | |
| from src.task.model import TinyTransformerLM, TinyClassifier, TinyAnsweringModel | |
| class TextExtractor: | |
| def __init__( | |
| self, | |
| model: TinyAnsweringModel, | |
| tokenizer, | |
| context_length, | |
| device=None, | |
| ): | |
| self.model = model | |
| self.tokenizer = tokenizer | |
| self.context_length = context_length | |
| if device is None: | |
| device = ( | |
| "cuda" | |
| if torch.cuda.is_available() | |
| else "cpu" | |
| ) | |
| self.device = torch.device(device) | |
| self.model.to(self.device) | |
| self.model.eval() | |
| def extract( | |
| self, | |
| context_text: str, #context containing the answer | |
| question_text: str #the actual question | |
| ): | |
| input_text = ( | |
| self.tokenizer.CLS_TOKEN | |
| + question_text | |
| + self.tokenizer.SEP_TOKEN | |
| + context_text | |
| + self.tokenizer.SEP_TOKEN | |
| ) | |
| input_ids = self.tokenizer.encode(input_text) | |
| padded_ids, mask_ids = self.tokenizer.pad( | |
| [input_ids], | |
| max_length=self.context_length | |
| ) | |
| token_tensor = torch.tensor( | |
| padded_ids[0], | |
| dtype=torch.long, | |
| device=self.device, | |
| ) | |
| padding_mask = torch.tensor( | |
| mask_ids, | |
| dtype=torch.bool, | |
| device=self.device, | |
| ) | |
| #Typically -> embedding -> transformer -> start,end logits | |
| #Forward pass on the model is refusing :-( | |
| start_logits, end_logits = self.model( | |
| tokens=token_tensor.unsqueeze(0), | |
| padding_mask=padding_mask | |
| ) | |
| # Remove batch dimension: [max_length] | |
| start_logits = start_logits[0] | |
| end_logits = end_logits[0] | |
| start_predictions = torch.argmax( | |
| start_logits, | |
| dim=-1, | |
| ) | |
| end_predictions = torch.argmax( | |
| end_logits, | |
| dim=-1, | |
| ) | |
| return token_tensor, start_predictions.item(), end_predictions.item() | |