razmanitra's picture
Create app.py
e4fd642 verified
import gradio as gr
import os
import subprocess
from huggingface_hub import login
# Interface pour l'entraînement
def train_model(token, username, model_name, dataset_name, epochs, batch_size, learning_rate):
# Authentification
login(token=token)
# Cloner le dépôt du modèle
repo_id = f"{username}/{model_name}"
os.system(f"git clone https://huggingface.co/{repo_id}")
os.chdir(model_name)
# Installer les dépendances
os.system("pip install transformers datasets torch numpy tqdm wandb matplotlib pandas scikit-learn huggingface_hub accelerate evaluate tensorboard")
# Créer un script d'entraînement
train_script = f"""
from transformers import Trainer, TrainingArguments
from datasets import load_dataset
import torch
import torch.nn as nn
import os
import sys
import logging
# Configuration du logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Importer les modules nécessaires
from modeling_recipe_generator import RecipeGeneratorForHF, RecipeGeneratorConfig
def main():
logger.info("Chargement du dataset depuis Hugging Face...")
# Charger le dataset depuis Hugging Face
dataset = load_dataset("{username}/{dataset_name}")
logger.info("Chargement de la configuration du modèle...")
# Charger la configuration
config = RecipeGeneratorConfig.from_pretrained("{username}/{model_name}")
logger.info("Création du modèle...")
# Créer le modèle
model = RecipeGeneratorForHF(config)
logger.info("Configuration des arguments d'entraînement...")
# Définir les arguments d'entraînement
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs={epochs},
per_device_train_batch_size={batch_size},
per_device_eval_batch_size={batch_size},
warmup_steps=500,
weight_decay=0.01,
logging_dir="./logs",
logging_steps=100,
evaluation_strategy="steps",
eval_steps=500,
save_steps=1000,
save_total_limit=2,
learning_rate={learning_rate},
fp16=True, # Utiliser la précision mixte
gradient_accumulation_steps=4,
push_to_hub=True,
hub_model_id="{username}/{model_name}",
hub_strategy="every_save"
)
# Définir la fonction de calcul des métriques
def compute_metrics(eval_pred):
predictions, labels = eval_pred
# Calculer la perplexité
loss = torch.nn.functional.cross_entropy(
torch.tensor(predictions).view(-1, predictions.shape[-1]),
torch.tensor(labels).view(-1)
)
perplexity = torch.exp(loss)
return {{
"perplexity": perplexity.item()
}}
logger.info("Initialisation du Trainer...")
# Initialiser le trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset["train"],
eval_dataset=dataset["test"],
compute_metrics=compute_metrics
)
logger.info("Démarrage de l'entraînement...")
# Lancer l'entraînement
trainer.train()
logger.info("Entraînement terminé. Sauvegarde du modèle final...")
# Sauvegarder le modèle final
trainer.save_model("./final_model")
logger.info("Envoi du modèle final vers Hugging Face Hub...")
# Pousser le modèle final vers Hugging Face
trainer.push_to_hub()
logger.info("Processus d'entraînement terminé avec succès!")
if __name__ == "__main__":
main()
"""
with open("train_custom.py", "w") as f:
f.write(train_script)
# Lancer l'entraînement
result = subprocess.run(["python", "train_custom.py"], capture_output=True, text=True)
return result.stdout + "\n\n" + result.stderr
# Créer l'interface
iface = gr.Interface(
fn=train_model,
inputs=[
gr.Textbox(label="Token Hugging Face", type="password"),
gr.Textbox(label="Nom d'utilisateur Hugging Face"),
gr.Textbox(label="Nom du modèle", value="recettes-generator"),
gr.Textbox(label="Nom du dataset", value="recettes-dataset"),
gr.Slider(minimum=1, maximum=10, value=3, step=1, label="Nombre d'époques"),
gr.Slider(minimum=1, maximum=32, value=8, step=1, label="Taille du batch"),
gr.Slider(minimum=1e-6, maximum=1e-3, value=5e-5, step=1e-6, label="Taux d'apprentissage")
],
outputs="text",
title="Entraînement du modèle de génération de recettes",
description="Entraînez votre modèle directement sur l'infrastructure de Hugging Face"
)
iface.launch()