Fofig's picture
Update app.py
e4b4858 verified
Raw
History Blame Contribute Delete
6.49 kB
import gradio as gr
import json
import os
from datasets import Dataset
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer
import torch
import tempfile
# Глобальные переменные для модели
model = None
tokenizer = None
def load_and_train():
global model, tokenizer
try:
# Читаем данные напрямую из файла
with open('training_data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
# Берем первые 100 примеров для быстрого обучения
sample_data = data[:100]
# Создаем датасет напрямую из данных
texts = [item['text'] for item in sample_data]
dataset = Dataset.from_dict({'text': texts})
# Загружаем модель
model_name = "Salesforce/codegen-350M-mono"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# Устанавливаем pad_token
tokenizer.pad_token = tokenizer.eos_token
# Подготавливаем данные
def preprocess_function(examples):
tokenized = tokenizer(examples["text"], truncation=True, max_length=256, padding="max_length")
tokenized["labels"] = tokenized["input_ids"].copy()
return tokenized
processed_dataset = dataset.map(preprocess_function, batched=True, remove_columns=dataset.column_names)
# Параметры обучения
training_args = TrainingArguments(
output_dir="./model_output",
per_device_train_batch_size=1,
num_train_epochs=2,
save_steps=20,
logging_steps=5,
learning_rate=5e-5,
max_steps=30,
report_to="none",
remove_unused_columns=False,
)
# Обучаем
trainer = Trainer(
model=model,
args=training_args,
train_dataset=processed_dataset,
)
result = trainer.train()
# Сохраняем модель в разрешенную директорию
model.save_pretrained("./trained_model")
tokenizer.save_pretrained("./trained_model")
return f"✅ Модель обучена!\nДанных: {len(sample_data)} примеров\nФинальная потеря: {result.training_loss:.4f}\nМодель сохранена в ./trained_model"
except Exception as e:
return f"❌ Ошибка: {str(e)}"
def generate_code(prompt):
global model, tokenizer
if model is None:
return "❌ Модель не обучена. Нажмите 'Обучить модель' сначала."
try:
# Формируем промпт
full_prompt = f"World of Warcraft addon: {prompt}\n\nCode:\n"
# Токенизация
inputs = tokenizer(full_prompt, return_tensors="pt", padding=True, truncation=True, max_length=256)
# Генерация
with torch.no_grad():
outputs = model.generate(
inputs["input_ids"],
max_length=400,
num_return_sequences=1,
temperature=0.7,
do_sample=True,
pad_token_id=tokenizer.eos_token_id
)
# Декодирование
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
# Извлекаем код
code = generated_text.split("Code:\n")[-1].strip()
return code
except Exception as e:
return f"❌ Ошибка генерации: {str(e)}"
def check_data():
try:
with open('training_data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
return f"✅ Данные доступны\nВсего записей: {len(data)}\nПример:\n{data[0]['text'][:200]}..."
except Exception as e:
return f"❌ Ошибка: {str(e)}"
# Создаем интерфейс
with gr.Blocks() as demo:
gr.Markdown("# 🎮 WoW Addon AI Generator")
with gr.Tabs():
with gr.TabItem("Обучение"):
gr.Markdown("### Обучение модели на ваших данных")
with gr.Row():
check_btn = gr.Button("Проверить данные")
train_btn = gr.Button("Обучить модель", variant="primary")
train_status = gr.Textbox(label="Статус обучения", lines=8)
check_btn.click(fn=check_data, outputs=train_status)
train_btn.click(fn=load_and_train, outputs=train_status)
with gr.TabItem("Генерация кода"):
gr.Markdown("### Генерация кода аддонов")
with gr.Row():
with gr.Column():
prompt_input = gr.Textbox(
label="Опишите аддон:",
placeholder="Например: Аддон для отслеживания здоровья цели",
lines=3
)
generate_btn = gr.Button("Сгенерировать код", variant="primary")
with gr.Column():
code_output = gr.Code(
label="Сгенерированный код (Lua):",
language="lua",
lines=15
)
# Примеры
gr.Examples(
examples=[
"Аддон для отслеживания здоровья цели",
"Аддон для подсчета урона в секунду",
"Аддон для отображения координат",
"Аддон для управления инвентарем"
],
inputs=prompt_input
)
generate_btn.click(fn=generate_code, inputs=prompt_input, outputs=code_output)
demo.launch()