|
import gradio as gr |
|
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer, DataCollatorForLanguageModeling |
|
from datasets import Dataset |
|
import torch |
|
|
|
MODEL_ID = "TinyLlama/TinyLlama-1.1B-Chat-v0.6" |
|
|
|
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID) |
|
model = AutoModelForCausalLM.from_pretrained(MODEL_ID) |
|
|
|
if torch.cuda.is_available(): |
|
model.to("cuda") |
|
|
|
history = [] |
|
|
|
def chat_fn(message, chat_history): |
|
inputs = tokenizer.encode(message, return_tensors="pt") |
|
if torch.cuda.is_available(): |
|
inputs = inputs.to("cuda") |
|
outputs = model.generate(inputs, max_new_tokens=128, do_sample=True, top_p=0.9) |
|
response = tokenizer.decode(outputs[0], skip_special_tokens=True) |
|
chat_history.append((message, response)) |
|
return "", chat_history |
|
|
|
def train_model(text): |
|
dataset = Dataset.from_dict({"text": [text]}) |
|
tokenized = dataset.map(lambda x: tokenizer(x["text"], truncation=True, padding="max_length", max_length=128), batched=True) |
|
|
|
args = TrainingArguments( |
|
output_dir="./results", |
|
num_train_epochs=1, |
|
per_device_train_batch_size=1, |
|
save_steps=10, |
|
logging_steps=5, |
|
report_to="none", |
|
fp16=torch.cuda.is_available() |
|
) |
|
|
|
trainer = Trainer( |
|
model=model, |
|
args=args, |
|
train_dataset=tokenized, |
|
data_collator=DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False) |
|
) |
|
|
|
trainer.train() |
|
return "✅ Модель донавчена на вашому тексті!" |
|
|
|
chat_ui = gr.ChatInterface(fn=chat_fn) |
|
|
|
train_ui = gr.Interface( |
|
fn=train_model, |
|
inputs=gr.Textbox(lines=10, label="Введіть текст для донавчання"), |
|
outputs="text", |
|
) |
|
|
|
gr.TabbedInterface([chat_ui, train_ui], ["💬 Chat", "🧠 Train"]).launch() |