Spaces:
Sleeping
Sleeping
#!/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() |