Spaces:
Runtime error
Runtime error
| 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() |