File size: 4,589 Bytes
1946897
6f5ec4e
 
cbc6f45
 
 
 
 
 
 
 
 
6f5ec4e
cbc6f45
 
 
 
 
 
 
1946897
cbc6f45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6f5ec4e
cbc6f45
 
 
 
 
 
 
 
6f5ec4e
cbc6f45
 
 
 
6f5ec4e
cbc6f45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1946897
cbc6f45
 
 
 
 
 
 
 
6f5ec4e
cbc6f45
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import os
import json
import sys
from datetime import datetime
import traceback
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer
from datasets import load_dataset
import torch
import pandas as pd
from huggingface_hub import login
from connect_huggingface import setup_huggingface
import gradio as gr

class TrainingCallback:
    def __init__(self):
        self.logs = []
        
    def on_log(self, args, state, control, logs=None, **kwargs):
        if logs:
            self.logs.append(logs)
    
    def get_logs(self):
        return "\n".join([str(log) for log in self.logs])

def start_training():
    try:
        # Configuration de Hugging Face
        if not setup_huggingface():
            return "Erreur : Impossible de configurer Hugging Face", "### Logs d'entraînement\nErreur de configuration Hugging Face"
        
        # Initialiser les logs
        status = "Configuration de l'environnement..."
        logs = f"### Logs d'entraînement\nDémarrage à {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n"
        
        # Charger la configuration
        with open('config.json', 'r') as f:
            config = json.load(f)
        
        # Charger le modèle et le tokenizer
        logs += "- Chargement du modèle et du tokenizer...\n"
        tokenizer = AutoTokenizer.from_pretrained(config['model']['tokenizer'])
        model = AutoModelForCausalLM.from_pretrained(
            config['model']['name'],
            torch_dtype=torch.bfloat16 if config['training']['bf16'] else torch.float32,
            device_map="auto"
        )
        
        # Charger le dataset
        status = "Chargement du dataset..."
        logs += f"- Chargement de {config['dataset']['name']}...\n"
        dataset = load_dataset(config['dataset']['name'])
        
        # Configurer l'entraînement
        status = "Configuration de l'entraînement..."
        logs += "- Configuration des paramètres d'entraînement...\n"
        
        training_args = TrainingArguments(
            output_dir="./results",
            num_train_epochs=config['training']['epochs'],
            per_device_train_batch_size=config['training']['batch_size'],
            learning_rate=config['training']['learning_rate'],
            warmup_ratio=config['training']['warmup_ratio'],
            evaluation_strategy=config['training']['evaluation_strategy'],
            eval_steps=config['training']['eval_steps'],
            save_strategy=config['training']['save_strategy'],
            save_steps=config['training']['save_steps'],
            save_total_limit=config['training']['save_total_limit'],
            load_best_model_at_end=config['training']['load_best_model_at_end'],
            metric_for_best_model=config['training']['metric_for_best_model'],
            greater_is_better=config['training']['greater_is_better'],
            gradient_accumulation_steps=config['training']['gradient_accumulation_steps'],
            logging_steps=config['training']['logging_steps'],
            fp16=config['training']['fp16'],
            bf16=config['training']['bf16']
        )
        
        # Créer le callback pour les logs
        callback = TrainingCallback()
        
        # Créer le Trainer
        trainer = Trainer(
            model=model,
            args=training_args,
            train_dataset=dataset[config['dataset']['train_split']],
            eval_dataset=dataset[config['dataset']['eval_split']],
            callbacks=[callback]
        )
        
        # Démarrer l'entraînement
        status = "Entraînement en cours..."
        logs += "- Début de l'entraînement...\n"
        
        trainer.train()
        
        # Ajouter les logs d'entraînement
        logs += "\n### Logs détaillés\n"
        logs += callback.get_logs()
        
        status = "Entraînement terminé avec succès!"
        logs += "\n\nEntraînement terminé avec succès!"
        
        return status, logs
        
    except Exception as e:
        error_msg = f"Erreur pendant l'entraînement : {str(e)}\n{traceback.format_exc()}"
        print(error_msg)
        return "Erreur pendant l'entraînement", f"### Logs d'entraînement\n❌ {error_msg}"

# Interface Gradio
demo = gr.Interface(
    fn=start_training,
    inputs=[],
    outputs=[gr.Textbox(label="Statut de l'entraînement"), gr.Markdown(label="Logs de l'entraînement")],
    title="AUTO Training Space",
    description="Cliquez sur le bouton pour lancer l'entraînement du modèle."
)

if __name__ == "__main__":
    demo.launch()