File size: 6,080 Bytes
fb45e67
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#!/usr/bin/env python3
"""
Script de test pour le chargement du modèle Gemma 3n E4B IT
Teste différentes stratégies de chargement pour éviter l'erreur de disk_offload
"""

import torch
import sys
import os

def test_memory_availability():
    """Teste la disponibilité de la mémoire"""
    print("🔍 Vérification de la mémoire disponible...")
    
    if torch.cuda.is_available():
        gpu_memory = torch.cuda.get_device_properties(0).total_memory / 1024**3
        print(f"✅ GPU disponible : {gpu_memory:.1f} GB")
        return gpu_memory
    else:
        print("⚠️ GPU non disponible, utilisation du CPU")
        return 0

def test_model_loading():
    """Teste le chargement du modèle avec différentes stratégies"""
    print("\n🚀 Test de chargement du modèle Gemma 3n E4B IT...")
    
    try:
        from transformers import AutoProcessor, Gemma3nForConditionalGeneration
        
        model_id = "google/gemma-3n-E4B-it"
        
        # Charger le processeur
        print("📥 Chargement du processeur...")
        processor = AutoProcessor.from_pretrained(
            model_id,
            trust_remote_code=True
        )
        print("✅ Processeur chargé avec succès")
        
        # Stratégies de chargement
        strategies = [
            ("CPU Conservateur", lambda: Gemma3nForConditionalGeneration.from_pretrained(
                model_id,
                device_map="cpu",
                torch_dtype=torch.float32,
                trust_remote_code=True,
                low_cpu_mem_usage=True,
                max_memory={"cpu": "8GB"}
            )),
            ("4-bit Quantization", lambda: Gemma3nForConditionalGeneration.from_pretrained(
                model_id,
                device_map="auto",
                torch_dtype=torch.float16,
                trust_remote_code=True,
                low_cpu_mem_usage=True,
                load_in_4bit=True,
                bnb_4bit_compute_dtype=torch.float16
            )),
            ("8-bit Quantization", lambda: Gemma3nForConditionalGeneration.from_pretrained(
                model_id,
                device_map="auto",
                torch_dtype=torch.float16,
                trust_remote_code=True,
                low_cpu_mem_usage=True,
                load_in_8bit=True
            )),
            ("Gestion mémoire personnalisée", lambda: Gemma3nForConditionalGeneration.from_pretrained(
                model_id,
                device_map="auto",
                torch_dtype=torch.float16,
                trust_remote_code=True,
                low_cpu_mem_usage=True,
                max_memory={0: "4GB", "cpu": "8GB"}
            ))
        ]
        
        # Tester chaque stratégie
        for name, strategy in strategies:
            print(f"\n🔄 Test de la stratégie : {name}")
            try:
                model = strategy()
                print(f"✅ {name} : SUCCÈS")
                
                # Test rapide de génération
                print("🧪 Test de génération...")
                test_input = processor.apply_chat_template(
                    [{"role": "user", "content": [{"type": "text", "text": "Hello"}]}],
                    add_generation_prompt=True,
                    tokenize=True,
                    return_dict=True,
                    return_tensors="pt"
                ).to(model.device)
                
                with torch.inference_mode():
                    output = model.generate(
                        **test_input,
                        max_new_tokens=10,
                        do_sample=False
                    )
                
                print("✅ Génération réussie")
                return model, processor, name
                
            except Exception as e:
                error_msg = str(e)
                print(f"❌ {name} : ÉCHEC")
                print(f"   Erreur : {error_msg}")
                
                if "disk_offload" in error_msg:
                    print("   → Erreur de disk_offload détectée")
                elif "out of memory" in error_msg.lower():
                    print("   → Erreur de mémoire insuffisante")
                elif "bitsandbytes" in error_msg.lower():
                    print("   → Erreur de bitsandbytes (quantization)")
                
                continue
        
        print("\n❌ Toutes les stratégies ont échoué")
        return None, None, None
        
    except Exception as e:
        print(f"❌ Erreur générale : {e}")
        return None, None, None

def main():
    """Fonction principale"""
    print("🌱 Test de chargement du modèle AgriLens AI")
    print("=" * 50)
    
    # Vérifier les dépendances
    print("📦 Vérification des dépendances...")
    try:
        import transformers
        import accelerate
        print(f"✅ Transformers : {transformers.__version__}")
        print(f"✅ Accelerate : {accelerate.__version__}")
    except ImportError as e:
        print(f"❌ Dépendance manquante : {e}")
        return
    
    # Tester la mémoire
    gpu_memory = test_memory_availability()
    
    # Tester le chargement du modèle
    model, processor, strategy_name = test_model_loading()
    
    if model and processor:
        print(f"\n🎉 SUCCÈS ! Modèle chargé avec la stratégie : {strategy_name}")
        print("✅ L'application devrait fonctionner correctement")
        
        # Nettoyer la mémoire
        del model
        del processor
        torch.cuda.empty_cache() if torch.cuda.is_available() else None
        
    else:
        print("\n❌ ÉCHEC ! Aucune stratégie n'a fonctionné")
        print("\n💡 Recommandations :")
        print("1. Vérifiez que vous avez suffisamment de mémoire RAM (8GB minimum)")
        print("2. Si vous utilisez Hugging Face Spaces, essayez un runtime avec plus de mémoire")
        print("3. Installez les dépendances : pip install bitsandbytes")
        print("4. Redémarrez l'application")

if __name__ == "__main__":
    main()