detecteur_materiel.py — v3 (marge en pourcentage)

Bienvenue sur CFTPfr.fr Forums detecteur_materiel.py — v3 (marge en pourcentage)

  • Ce sujet est vide.
Affichage de 1 message (sur 1 au total)
  • Auteur
    Messages
  • #269
    Mario Da Conceicao
    Maître des clés

    Version corrigée du 01/08/2026. Retenu : marge de sécurité en pourcentage (plus juste sur les petites configs comme 4 Go) plutôt qu’un chiffre fixe.

    import re
    from pathlib import Path
    import shutil
    
    PALIERS_MODELES = [
        {"ram_min_go": 3,  "nom": "phi-4-mini-q4",   "fichier": "phi-4-mini.Q4_K_M.gguf",    "parametres": "3.8B", "taille_go": 2.5},
        {"ram_min_go": 6,  "nom": "llama-3.3-8b-q4",  "fichier": "llama-3.3-8b.Q4_K_M.gguf",  "parametres": "8B",   "taille_go": 5.0},
        {"ram_min_go": 12, "nom": "qwen-2.5-14b-q4",  "fichier": "qwen-2.5-14b.Q4_K_M.gguf",  "parametres": "14B",  "taille_go": 8.0},
        {"ram_min_go": 24, "nom": "llama-3.3-32b-q4", "fichier": "llama-3.3-32b.Q4_K_M.gguf", "parametres": "32B",  "taille_go": 18.0},
    ]
    
    MODELES_DIR = Path(__file__).resolve().parent / "modeles"
    
    def obtenir_ram_disponible_go():
        try:
            with open("/proc/meminfo", "r") as f:
                for ligne in f:
                    if ligne.startswith("MemTotal:"):
                        kib = int(re.search(r"\d+", ligne).group())
                        return round(kib / 1024 / 1024, 1)
        except Exception:
            pass
        return None
    
    def obtenir_espace_disque_go(dossier=MODELES_DIR):
        try:
            Path(dossier).mkdir(parents=True, exist_ok=True)
            usage = shutil.disk_usage(dossier)
            return round(usage.free / (1024 ** 3), 1)
        except Exception:
            return None
    
    def calculer_marge_ram(ram_go, pourcentage=0.15, minimum_go=0.5):
        """
        NOUVEAU : marge de sécurité proportionnelle plutôt que fixe.
        Sur une petite machine (4 Go), 1 Go fixe était trop pénalisant ;
        ici on prend le plus grand entre un minimum absolu et un pourcentage.
        """
        return max(minimum_go, ram_go * pourcentage)
    
    def choisir_palier_modele(ram_go=None, espace_disque_go=None):
        if ram_go is None:
            ram_go = obtenir_ram_disponible_go()
        if espace_disque_go is None:
            espace_disque_go = obtenir_espace_disque_go()
    
        if ram_go is None:
            return PALIERS_MODELES[0]
    
        marge = calculer_marge_ram(ram_go)
        ram_utilisable = ram_go - marge
        palier_choisi = PALIERS_MODELES[0]
    
        for palier in PALIERS_MODELES:
            ram_ok = ram_utilisable >= palier["ram_min_go"]
            disque_ok = espace_disque_go is None or espace_disque_go >= palier["taille_go"] * 1.5
            if ram_ok and disque_ok:
                palier_choisi = palier
        return palier_choisi
    
    def modele_deja_present(palier):
        return (MODELES_DIR / palier["fichier"]).exists()
    
    def rapport_materiel():
        ram_go = obtenir_ram_disponible_go()
        disque_go = obtenir_espace_disque_go()
        palier = choisir_palier_modele(ram_go, disque_go)
        return (
            f"RAM détectée : {ram_go if ram_go else 'inconnue'} Go\n"
            f"Espace disque disponible : {disque_go if disque_go else 'inconnu'} Go\n"
            f"Modèle sélectionné : {palier['nom']} ({palier['parametres']})\n"
            f"Déjà installé : {'oui' if modele_deja_present(palier) else 'non'}"
        )
Affichage de 1 message (sur 1 au total)
  • Vous devez être connecté pour répondre à ce sujet.
Retour en haut