llm_lab/adaptation_windows_scripts.md
2025-03-25 21:19:54 +01:00

12 KiB

Adaptations spécifiques des scripts Python pour Windows

Ce document détaille les adaptations nécessaires pour chaque script Python du projet LLM Lab lors de la migration vers Windows.

Modifications communes à tous les scripts

1. Gestion des chemins

Pour tous les scripts, remplacez les chemins absolus par des chemins relatifs:

# Avant
DATA_DIR = '/home/fgras-ca/llm_lab/data'

# Après
import os
# Obtenir le chemin absolu du répertoire contenant le script
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DATA_DIR = os.path.join(BASE_DIR, 'data')

2. Installation des dépendances Windows

Ces dépendances sont nécessaires pour Windows:

pip install wmi psutil requests pillow
pip install pywin32  # Pour l'accès aux API Windows

Adaptations spécifiques par fichier

1. chat_gui.py

# Avant de créer la fenêtre principale:
import os
import platform

# Pour éviter les problèmes d'échelle sur les écrans haute résolution
if platform.system() == 'Windows':
    import ctypes
    try:
        ctypes.windll.shcore.SetProcessDpiAwareness(1)
    except:
        pass
    
    # Configuration CUDA pour Ollama
    os.environ["CUDA_VISIBLE_DEVICES"] = "0"
    os.environ["OMP_NUM_THREADS"] = "8"

2. monitor.py

def _update_system_info(self):
    """Met à jour les informations système"""
    # Informations système
    self.os_label.config(text=f"{platform.system()} {platform.release()}")
    self.cpu_label.config(text=f"{psutil.cpu_count(logical=False)} cœurs ({psutil.cpu_count()} threads)")
    
    # Détection avancée de la RAM
    try:
        if platform.system() == "Windows":
            # Utiliser WMI pour Windows
            import wmi
            computer = wmi.WMI()
            for os_info in computer.Win32_OperatingSystem():
                total_ram = float(os_info.TotalVisibleMemorySize) / (1024 * 1024)  # en GB
        else:
            # Utiliser psutil pour Linux/Mac
            ram = psutil.virtual_memory()
            total_ram = ram.total / (1024 * 1024 * 1024)  # GB
        
        self.ram_label.config(text=f"{total_ram:.1f} GB")
    except Exception as e:
        self._log(f"Erreur lors de la détection de la RAM: {str(e)}")
        self.ram_label.config(text="Détection impossible")

3. utils/system_monitor.py

def _check_gpu_available(self):
    """Vérifie si un GPU NVIDIA est disponible"""
    try:
        if platform.system() == "Windows":
            import wmi
            computer = wmi.WMI()
            # Vérifier les contrôleurs vidéo
            for gpu in computer.Win32_VideoController():
                if "NVIDIA" in gpu.Name:
                    return True
            return False
        else:
            # Pour Linux/Mac, utiliser nvidia-smi
            result = subprocess.run(['nvidia-smi'], capture_output=True, text=True)
            return result.returncode == 0
    except:
        return False

def _update_gpu_info(self):
    """Met à jour les informations GPU"""
    if not self.gpu_available:
        return
        
    try:
        if platform.system() == "Windows":
            # Utiliser WMI pour Windows
            import wmi
            computer = wmi.WMI()
            
            # Obtenir le nom du modèle GPU
            for gpu in computer.Win32_VideoController():
                if "NVIDIA" in gpu.Name:
                    model_name = gpu.Name
                    self.gpu_model_label.config(text=model_name)
                    break
            
            # Utiliser nvidia-smi pour les métriques détaillées même sous Windows
            result = subprocess.run(
                ['nvidia-smi', '--query-gpu=memory.total,memory.used,utilization.gpu,temperature.gpu', 
                 '--format=csv,noheader,nounits'],
                capture_output=True, 
                text=True, 
                check=True
            )
            
            if result.returncode == 0:
                # Analyser les résultats
                gpu_data = result.stdout.strip().split(',')
                
                if len(gpu_data) >= 4:
                    # Mémoire totale et utilisée
                    total_memory = float(gpu_data[0].strip())
                    used_memory = float(gpu_data[1].strip())
                    memory_percent = (used_memory / total_memory) * 100 if total_memory > 0 else 0
                    
                    self.gpu_memory_label.config(text=f"{used_memory:.0f} MiB / {total_memory:.0f} MiB")
                    self.gpu_mem_progress["value"] = memory_percent
                    self.gpu_mem_percent.config(text=f"{memory_percent:.1f}%")
                    
                    # Utilisation GPU
                    gpu_util = float(gpu_data[2].strip())
                    self.gpu_compute_progress["value"] = gpu_util
                    self.gpu_compute_percent.config(text=f"{gpu_util:.1f}%")
                    
                    # Température
                    temp = float(gpu_data[3].strip())
                    self.gpu_temp_progress["value"] = temp
                    self.gpu_temp_label.config(text=f"{temp:.1f}°C")
        else:
            # Code existant pour Linux/Mac
            # ...
    except Exception as e:
        self._log(f"Erreur de mise à jour GPU: {str(e)}")

4. utils/ollama_api.py

import os
import platform
import requests
import json

# Optimisations pour Windows
if platform.system() == "Windows":
    os.environ["CUDA_VISIBLE_DEVICES"] = "0"
    os.environ["OMP_NUM_THREADS"] = str(os.cpu_count())

class OllamaAPI:
    def __init__(self, base_url="http://localhost:11434"):
        self.base_url = base_url
        
        # Charger la configuration optimisée si elle existe
        config_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 
                                  "ollama_config.json")
        self.default_params = {}
        
        if os.path.exists(config_path):
            try:
                with open(config_path, 'r') as f:
                    self.default_params = json.load(f)
            except:
                pass

    def generate(self, model, prompt, params=None):
        """Génère une réponse du modèle"""
        url = f"{self.base_url}/api/generate"
        
        # Fusionner les paramètres par défaut avec ceux fournis
        request_params = self.default_params.copy()
        if params:
            request_params.update(params)
            
        data = {
            "model": model,
            "prompt": prompt,
            **request_params
        }
        
        response = requests.post(url, json=data)
        response.raise_for_status()
        
        return response.json()

5. installer.bat - Script d'installation Windows

@echo off
setlocal

echo Installation de LLM Lab pour Windows...

REM Vérifier si Python est installé
python --version > nul 2>&1
if %ERRORLEVEL% NEQ 0 (
    echo Python n'est pas installé. Veuillez installer Python 3.10 ou supérieur.
    echo Téléchargez Python depuis https://www.python.org/downloads/
    exit /b 1
)

REM Créer l'environnement virtuel
if not exist venv (
    echo Création de l'environnement virtuel...
    python -m venv venv
)

REM Activer l'environnement virtuel
call venv\Scripts\activate

REM Installer les dépendances
echo Installation des dépendances...
pip install -r requirements.txt
pip install wmi psutil requests pillow pywin32

REM Vérifier si CUDA est disponible
where nvidia-smi > nul 2>&1
if %ERRORLEVEL% EQU 0 (
    echo Détection de CUDA: NVIDIA GPU disponible
    nvidia-smi
) else (
    echo Aucun GPU NVIDIA détecté
)

REM Vérifier si Ollama est installé
curl -s http://localhost:11434/api/tags > nul 2>&1
if %ERRORLEVEL% EQU 0 (
    echo Ollama est en cours d'exécution
) else (
    echo Ollama n'est pas en cours d'exécution ou n'est pas installé
    echo Téléchargez Ollama depuis https://ollama.com/download/windows
)

REM Créer les dossiers nécessaires
if not exist data mkdir data
if not exist logs mkdir logs
if not exist presets mkdir presets
if not exist history mkdir history

echo.
echo Installation terminée ! Pour lancer LLM Lab:
echo   - Activez l'environnement: venv\Scripts\activate
echo   - Lancez l'interface GUI: run.bat gui
echo   - Lancez le moniteur: run.bat monitor
echo.

endlocal

Configuration des modèles Ollama

Pour optimiser les performances des modèles, créez des fichiers Modelfile pour chaque modèle:

Modelfile pour modèles Llama 3 (exemple)

FROM llama3:latest

# Optimisations pour Windows
PARAMETER temperature 0.7
PARAMETER num_ctx 8192
PARAMETER num_gpu 100
PARAMETER num_thread 8
PARAMETER num_batch 512

Pour appliquer:

ollama create llama3-optimized -f Modelfile

Monitoring des performances

Pour un monitoring plus précis sous Windows, ajoutez ces fonctions à system_monitor.py:

def _get_windows_process_info(self, process_name):
    """Récupère les informations d'un processus Windows"""
    if platform.system() != "Windows":
        return None
        
    import wmi
    computer = wmi.WMI()
    
    processes = []
    for process in computer.Win32_Process():
        if process_name.lower() in process.Name.lower():
            processes.append({
                'pid': process.ProcessId,
                'name': process.Name,
                'cpu': 0,  # À calculer
                'memory': float(process.WorkingSetSize) / (1024 * 1024)  # MB
            })
    
    return processes

def _get_ollama_performance(self):
    """Récupère les performances d'Ollama"""
    processes = []
    
    if platform.system() == "Windows":
        processes = self._get_windows_process_info("ollama")
    else:
        # Code Linux existant
        pass
        
    return processes

Test de la migration

Créez un script test_windows.py pour vérifier que tout fonctionne correctement:

import os
import platform
import psutil
import tkinter as tk
import requests

def check_system():
    print(f"Système: {platform.system()} {platform.release()}")
    print(f"Python: {platform.python_version()}")
    
    # Vérifier RAM
    ram = psutil.virtual_memory()
    print(f"RAM: {ram.total / (1024**3):.1f} GB")
    
    # Vérifier GPU
    try:
        import wmi
        computer = wmi.WMI()
        for gpu in computer.Win32_VideoController():
            print(f"GPU: {gpu.Name}")
    except:
        print("Erreur lors de la détection du GPU via WMI")
    
    # Vérifier Ollama
    try:
        response = requests.get("http://localhost:11434/api/tags")
        if response.status_code == 200:
            print("Ollama: En ligne")
            models = response.json().get("models", [])
            print(f"Modèles installés: {len(models)}")
            for model in models:
                print(f"  - {model.get('name')}")
        else:
            print(f"Ollama: Erreur {response.status_code}")
    except:
        print("Ollama: Hors ligne")
    
    # Vérifier Tkinter
    try:
        root = tk.Tk()
        root.title("Test Tkinter")
        tk.Label(root, text="Tkinter fonctionne correctement").pack(padx=20, pady=20)
        print("Tkinter: OK")
        return root
    except:
        print("Tkinter: Erreur")
        return None

if __name__ == "__main__":
    print("=== Test d'installation LLM Lab sur Windows ===")
    root = check_system()
    if root:
        print("\nTout est correctement configuré!")
        print("Fermer la fenêtre Tkinter pour terminer le test.")
        root.mainloop()
    else:
        print("\nDes erreurs ont été détectées dans l'installation.")

Recommandations spécifiques pour Windows

  1. Performances optimales:

    • Réglez le plan d'alimentation sur "Hautes performances"
    • Désactivez l'économiseur d'écran et la mise en veille pendant l'utilisation
  2. GPU NVIDIA:

    • Utilisez le Panneau de configuration NVIDIA pour régler les performances sur "Préférer les performances maximales"
    • Mettez à jour les pilotes régulièrement
  3. Antivirus:

    • Ajoutez le dossier LLM_Lab aux exceptions de l'antivirus
    • Excluez ollama.exe du scan en temps réel