gpt2_chat / main.py
HoneyTian's picture
update
ee399db
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import argparse
from collections import defaultdict
import json
import os
import platform
import re
import string
from typing import List
from project_settings import project_path
os.environ["HUGGINGFACE_HUB_CACHE"] = (project_path / "cache/huggingface/hub").as_posix()
import gradio as gr
from threading import Thread
from transformers.models.gpt2.modeling_gpt2 import GPT2LMHeadModel
from transformers.models.bert.tokenization_bert import BertTokenizer
from transformers.generation.streamers import TextIteratorStreamer
import torch
def get_args():
parser = argparse.ArgumentParser()
parser.add_argument("--max_new_tokens", default=512, type=int)
parser.add_argument("--top_p", default=0.9, type=float)
parser.add_argument("--temperature", default=0.35, type=float)
parser.add_argument("--repetition_penalty", default=1.0, type=float)
parser.add_argument('--device', default="cuda" if torch.cuda.is_available() else "cpu", type=str)
parser.add_argument(
"--examples_json_file",
default="examples.json",
type=str
)
args = parser.parse_args()
return args
def repl1(match):
result = "{}{}".format(match.group(1), match.group(2))
return result
def repl2(match):
result = "{}".format(match.group(1))
return result
def remove_space_between_cn_en(text):
splits = re.split(" ", text)
if len(splits) < 2:
return text
result = ""
for t in splits:
if t == "":
continue
if re.search(f"[a-zA-Z0-9{string.punctuation}]$", result) and re.search("^[a-zA-Z0-9]", t):
result += " "
result += t
else:
if not result == "":
result += t
else:
result = t
if text.endswith(" "):
result += " "
return result
def main():
args = get_args()
description = """
## GPT2 Chat
"""
# example json
with open(args.examples_json_file, "r", encoding="utf-8") as f:
examples = json.load(f)
if args.device == 'auto':
device = 'cuda' if torch.cuda.is_available() else 'cpu'
else:
device = args.device
input_text_box = gr.Text(label="text")
output_text_box = gr.Text(lines=4, label="generated_content")
def fn_stream(text: str,
max_new_tokens: int = 200,
top_p: float = 0.85,
temperature: float = 0.35,
repetition_penalty: float = 1.2,
model_name: str = "qgyd2021/lip_service_4chan",
is_chat: bool = True,
):
tokenizer = BertTokenizer.from_pretrained(model_name)
model = GPT2LMHeadModel.from_pretrained(model_name)
model = model.eval()
text_encoded = tokenizer.__call__(text, add_special_tokens=False)
input_ids_ = text_encoded["input_ids"]
input_ids = [tokenizer.cls_token_id]
input_ids.extend(input_ids_)
if is_chat:
input_ids.append(tokenizer.sep_token_id)
input_ids = torch.tensor([input_ids], dtype=torch.long)
input_ids = input_ids.to(device)
streamer = TextIteratorStreamer(tokenizer=tokenizer)
generation_kwargs = dict(
inputs=input_ids,
max_new_tokens=max_new_tokens,
do_sample=True,
top_p=top_p,
temperature=temperature,
repetition_penalty=repetition_penalty,
eos_token_id=tokenizer.sep_token_id if is_chat else None,
pad_token_id=tokenizer.pad_token_id,
streamer=streamer,
)
thread = Thread(target=model.generate, kwargs=generation_kwargs)
thread.start()
output: str = ""
first_answer = True
for output_ in streamer:
if first_answer:
first_answer = False
continue
output_ = output_.replace("[UNK] ", "")
output_ = output_.replace("[UNK]", "")
output_ = output_.replace("[CLS] ", "")
output_ = output_.replace("[CLS]", "")
output += output_
if output.startswith("[SEP]"):
output = output[5:]
output = output.lstrip(" ,.!?")
output = remove_space_between_cn_en(output)
# output = re.sub(r"([,。!?\u4e00-\u9fa5]) ([,。!?\u4e00-\u9fa5])", repl1, output)
# output = re.sub(r"([,。!?\u4e00-\u9fa5]) ", repl2, output)
output = output.replace("[SEP] ", "\n")
output = output.replace("[SEP]", "\n")
yield output
model_name_choices = [
"trained_models/lip_service_4chan",
"trained_models/chinese_porn_novel"
] if platform.system() == "Windows" else \
[
"qgyd2021/lip_service_4chan", "qgyd2021/chinese_chitchat",
"qgyd2021/chinese_porn_novel", "qgyd2021/few_shot_intent_gpt2_base",
"qgyd2021/similar_question_generation",
]
# model_name_choices = [
# "qgyd2021/lip_service_4chan", "qgyd2021/chinese_chitchat",
# "qgyd2021/chinese_porn_novel", "qgyd2021/few_shot_intent_gpt2_base",
# "qgyd2021/similar_question_generation",
# ]
demo = gr.Interface(
fn=fn_stream,
inputs=[
input_text_box,
gr.Slider(minimum=0, maximum=512, value=512, step=1, label="max_new_tokens"),
gr.Slider(minimum=0, maximum=1, value=0.85, step=0.01, label="top_p"),
gr.Slider(minimum=0, maximum=1, value=0.35, step=0.01, label="temperature"),
gr.Slider(minimum=0, maximum=2, value=1.2, step=0.01, label="repetition_penalty"),
gr.Dropdown(choices=model_name_choices, value=model_name_choices[0], label="model_name"),
gr.Checkbox(value=True, label="is_chat")
],
outputs=[output_text_box],
examples=examples,
cache_examples=False,
examples_per_page=50,
title="GPT2 Chat",
description=description,
)
demo.queue().launch()
return
if __name__ == '__main__':
main()