Spaces:
Runtime error
Runtime error
File size: 3,820 Bytes
42f072b d994b45 42f072b 9d1ac35 42f072b 9d1ac35 42f072b d994b45 42f072b 9d1ac35 42f072b 9d1ac35 42f072b d994b45 42f072b d994b45 42f072b 9d1ac35 42f072b d994b45 42f072b 9d1ac35 42f072b |
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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
import torch
from nltk import sent_tokenize
import nltk
from tqdm import tqdm
import gradio as gr
from transformers import T5ForConditionalGeneration, T5Tokenizer
nltk.download("punkt")
# autodetect the available device
GPU_IDX = 1 # which GPU to use
if torch.cuda.is_available():
num_gpus = torch.cuda.device_count()
print(f"Number of available GPUs: {num_gpus}")
assert GPU_IDX < num_gpus, f"GPU index {GPU_IDX} not available."
device = torch.device(f"cuda:{GPU_IDX}")
print(f"Using GPU: {GPU_IDX}")
else:
print("CUDA is not available. Using CPU instead.")
device = torch.device("cpu")
# Configuration for models and their adapters
model_config = {
"Base Model": "polygraf-ai/poly-humanizer-base",
"Large Model": "polygraf-ai/poly-humanizer-large",
# "XL Model": {
# "path": "google/flan-t5-xl",
# "adapters": {
# "XL Model Adapter": "polygraf-ai/poly-humanizer-XL-adapter",
# "XL Law Model Adapter": "polygraf-ai/poly-humanizer-XL-law-adapter",
# "XL Marketing Model Adapter": "polygraf-ai/marketing-cleaned-13K-grad-acum-4-full",
# "XL Child Style Model Adapter": "polygraf-ai/poly-humanizer-XL-children-adapter-checkpoint-4000",
# },
# },
}
# cache the base models, tokenizers, and adapters
models, tokenizers = {}, {}
for name, config in model_config.items():
path = config if isinstance(config, str) else config["path"]
# initialize model and tokenizer
model = T5ForConditionalGeneration.from_pretrained(path, torch_dtype=torch.bfloat16).to(device)
models[name] = model
tokenizers[name] = T5Tokenizer.from_pretrained(path)
# load all avalable adapters, each being additional roughly 150M parameters
if isinstance(config, dict) and "adapters" in config:
for adapter_name, adapter_path in config["adapters"].items():
model.load_adapter(adapter_path, adapter_name=adapter_name)
print(f"Loaded adapter: {adapter_name}, Num. params: {model.num_parameters()}")
def paraphrase_text(
text,
progress=gr.Progress(),
model_name="Base Model",
temperature=1.2,
repetition_penalty=1.0,
top_k=50,
length_penalty=1.0,
):
progress(0, desc="Starting to Humanize")
progress(0.05)
# select the model, tokenizer and adapter
if "XL" in model_name: # dynamic adapter load/unload for XL models
# all adapter models use the XL model as the base
tokenizer, model = tokenizers["XL Model"], models["XL Model"]
# set the adapter if it's not already set
if model.active_adapters() != [f"{model_name} Adapter"]:
model.set_adapter(f"{model_name} Adapter")
print(f"Using adapter: {model_name} Adapter")
else:
tokenizer = tokenizers[model_name]
model = models[model_name]
# paraphrase each chunk of text
sentences = sent_tokenize(text) # sentence boundary detection
paraphrases = []
for sentence in progress.tqdm(sentences, desc="Humanizing"):
sentence = sentence.strip()
if len(sentence) == 0:
continue
inputs = tokenizer("Please paraphrase this sentence: " + sentence, return_tensors="pt").to(device)
outputs = model.generate(
**inputs,
do_sample=True,
temperature=temperature,
repetition_penalty=repetition_penalty,
max_length=128,
top_k=top_k,
length_penalty=length_penalty,
)
paraphrased_sentence = tokenizer.decode(outputs[0], skip_special_tokens=True)
paraphrases.append(paraphrased_sentence)
print(f"\nOriginal: {sentence}")
print(f"Paraphrased: {paraphrased_sentence}")
combined_paraphrase = " ".join(paraphrases)
return combined_paraphrase |