File size: 5,386 Bytes
7c3d6f5
59b6753
 
 
 
 
 
276873f
 
59b6753
 
 
276873f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ba5f972
1603718
7c81ad3
 
 
59b6753
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7c3d6f5
59b6753
 
 
 
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import streamlit as st
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
import random
import pandas as pd

# --- CONFIGURATION ---
st.set_page_config(page_title="FINISHA-F-SCRATCH Local Arena", layout="wide")
st.title("⚔️ SLM FROM SCRATCH Model Arena (Local Loading) ! choissez le SLM le plus unique!")

# Liste des modèles Raana-ia (Assurez-vous qu'ils tiennent en mémoire)
MODELS_LIST = [
    "Finisha-f-scratch/SMCLEM", 
    "Finisha-f-scratch/InutileGheya",
    "Finisha-f-scratch/Gheya-111m",
    "Finisha-f-scratch/Gheya-Nacid-instruct-v1",
    "Finisha-f-scratch/Mini-mistral-v1",
    "Finisha-f-scratch/Charlotte-amity",
    "Finisha-f-scratch/Charlotte-amity-v2",
    "Finisha-f-scratch/Tiny-charlotte",
    "Finisha-f-scratch/mini-gamia",
    "Finisha-f-scratch/SoraNova",
    "Finisha-f-scratch/Expedia-LLM",
    "Clem27-assistants/Learnia-Empathic-Tchat",
    "Finisha-F-scratch/Learnia-tchat-v1",
    "Finisha-F-scratch/Neko-charlotte",
    "Finisha-F-scratch/Sala",
    "Finisha-F-scratch/Charlotte-gheya",
    "Finisha-F-scratch/microBook",
    "Finisha-F-scratch/Chichalia-v1",
    "Finisha-f-scratch/Claire",
    "Finisha-F-scratch/Rosa-4M",
    "Finisha-F-scratch/Nelya",
    "Finisha-F-scratch/Nelya-neko",
    "Finisha-F-scratch/Dona-KITY-10m",
    "Finisha-F-scratch/KLA-SLM-CODING",
    "Finisha-F-scratch/Tiny-DonaKitty",
    "Finisha-F-scratch/Serena",
    "Finisha-F-scratch/Perso-SLM",
    "Finisha-F-scratch/Tiny-Rosa",
    "Finisha-F-scratch/Iris-La-guepe",
    "Finisha-F-scratch/Ilyana-lamina-Nacid",
    "Finisha-F-scratch/Ilyana-pretrain",
    "Finisha-F-scratch/Gheya-63M",
    "Finisha-F-scratch/Copina",
    "Finisha-F-scratch/Ayako-CHINESS",
    "Finisha-F-scratch/Tiny-lamina-English",
    "Finisha-F-scratch/Gheya-Nacid",
    "Finisha-F-scratch/Learnia-business",
    "Finisha-F-scratch/Lam-pest",
    "Finisha-F-scratch/ReeCi",
    "Finisha-F-scratch/melta-english",
    "Finisha-F-scratch/Maya-152M-Flowers",
    "Finisha-F-scratch/Lam-4-zero-F",
    "Finisha-F-scratch/Learnia",
    "Finisha-F-scratch/Qsana-coder-base",
    "Finisha-F-scratch/Coliria",
    "Finisha-F-scratch/Charlotte-2b",
    "Finisha-F-scratch/Natalia-pretrain",
    "Finisha-F-scratch/LilyStory",
    "Finisha-F-scratch/Nephaella"
]

# --- CHARGEMENT DES MODÈLES (CACHÉ) ---
@st.cache_resource
def load_model_pipeline(model_id):
    """Charge le modèle et le tokenizer en mémoire."""
    tokenizer = AutoTokenizer.from_pretrained(model_id)
    # On utilise device_map="auto" pour gérer le GPU si disponible
    model = AutoModelForCausalLM.from_pretrained(
        model_id, 
        torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
        device_map="auto"
    )
    return pipeline("text-generation", model=model, tokenizer=tokenizer)

# --- LOGIQUE DE VOTE ET SCORE ---
if 'scores' not in st.session_state:
    st.session_state.scores = {m: 1200 for m in MODELS_LIST}

if "model_a" not in st.session_state:
    st.session_state.model_a = ""
    st.session_state.model_b = ""
    st.session_state.resp_a = ""
    st.session_state.resp_b = ""
    st.session_state.voted = False

# --- INTERFACE UTILISATEUR ---
user_prompt = st.text_area("Entrez votre question :", placeholder="Écris un poème sur l'intelligence artificielle.")

if st.button("Lancer le duel"):
    if user_prompt:
        # Sélection aléatoire
        sampled = random.sample(MODELS_LIST, 2)
        st.session_state.model_a, st.session_state.model_b = sampled
        
        with st.spinner(f"Chargement et génération en cours..."):
            # Génération Modèle A
            pipe_a = load_model_pipeline(st.session_state.model_a)
            out_a = pipe_a(user_prompt, max_new_tokens=150, do_sample=True, temperature=0.7)
            st.session_state.resp_a = out_a[0]['generated_text'].replace(user_prompt, "")

            # Génération Modèle B
            pipe_b = load_model_pipeline(st.session_state.model_b)
            out_b = pipe_b(user_prompt, max_new_tokens=150, do_sample=True, temperature=0.7)
            st.session_state.resp_b = out_b[0]['generated_text'].replace(user_prompt, "")
            
            st.session_state.voted = False
    else:
        st.error("Le prompt est vide !")

# Affichage des résultats
if st.session_state.resp_a:
    col1, col2 = st.columns(2)
    with col1:
        st.info(f"**Réponse A :**\n\n{st.session_state.resp_a}")
    with col2:
        st.info(f"**Réponse B :**\n\n{st.session_state.resp_b}")

    if not st.session_state.voted:
        c1, c2, c3 = st.columns(3)
        if c1.button("A est meilleur"):
            st.session_state.scores[st.session_state.model_a] += 20
            st.session_state.voted = True
        if c2.button("Égalité"):
            st.session_state.voted = True
        if c3.button("B est meilleur"):
            st.session_state.scores[st.session_state.model_b] += 20
            st.session_state.voted = True

if st.session_state.voted:
    st.success(f"Résultat : A était **{st.session_state.model_a}** | B était **{st.session_state.model_b}**")
    if st.button("Nouveau duel"):
        st.session_state.resp_a = ""
        st.rerun()

# Classement
st.divider()
st.subheader("📊 Leaderboard")
st.table(pd.DataFrame(st.session_state.scores.items(), columns=["Modèle", "ELO"]).sort_values("ELO", ascending=False))