File size: 2,155 Bytes
c2302bf d3a07ee c2302bf d3a07ee c2302bf d3a07ee c2302bf d3a07ee c2302bf d3a07ee c2302bf d3a07ee |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
from threading import Thread
from typing import Tuple, Generator, List
from optimum.bettertransformer import BetterTransformer
import streamlit as st
import torch
from torch.quantization import quantize_dynamic
from torch import nn, qint8
from transformers import T5ForConditionalGeneration, T5Tokenizer, TextStreamer, TextIteratorStreamer
@st.cache_resource(show_spinner=False)
def get_resources(quantize: bool = True, no_cuda: bool = False) -> Tuple[T5ForConditionalGeneration, T5Tokenizer]:
"""
"""
tokenizer = T5Tokenizer.from_pretrained("BramVanroy/ul2-base-dutch-simplification-mai-2023", use_fast=False)
model = T5ForConditionalGeneration.from_pretrained("BramVanroy/ul2-base-dutch-simplification-mai-2023")
model = BetterTransformer.transform(model, keep_original_model=False)
model.resize_token_embeddings(len(tokenizer))
if torch.cuda.is_available() and not no_cuda:
model = model.to("cuda")
elif quantize: # Quantization not supported on CUDA
model = quantize_dynamic(model, {nn.Linear, nn.Dropout, nn.LayerNorm}, dtype=qint8)
model.eval()
return model, tokenizer
def batchify(iterable, batch_size=16):
num_items = len(iterable)
for idx in range(0, num_items, batch_size):
yield iterable[idx:min(idx + batch_size, num_items)]
def simplify(
texts: List[str],
model: T5ForConditionalGeneration,
tokenizer: T5Tokenizer,
batch_size: int = 16
) -> List[str]:
"""
"""
for batch_texts in batchify(texts, batch_size=batch_size):
nlg_batch_texts = ["[NLG] " + text for text in batch_texts]
encoded = tokenizer(nlg_batch_texts, return_tensors="pt", padding=True, truncation=True)
encoded = {k: v.to(model.device) for k, v in encoded.items()}
gen_kwargs = {
"max_new_tokens": 128,
"num_beams": 3,
}
with torch.no_grad():
encoded = {k: v.to(model.device) for k, v in encoded.items()}
generated = model.generate(**encoded, **gen_kwargs).cpu()
yield batch_texts, tokenizer.batch_decode(generated, skip_special_tokens=True)
|