# Guide complet : IA locale pour le code sur Windows WSL Guide d'installation d'une IA locale performante orientée développement sur Windows avec WSL2 et GPU NVIDIA. ## Prérequis - Windows 10/11 (version 21H2 ou supérieure) - Carte graphique NVIDIA avec 8GB+ VRAM - WSL2 installé - Au moins 50GB d'espace disque libre --- ## Étape 1 : Configuration WSL2 avec support GPU ### 1.1 Installer/Mettre à jour WSL2 Ouvrir PowerShell en **administrateur** : ```powershell # Installer WSL2 avec Ubuntu wsl --install -d Ubuntu-22.04 # Ou mettre à jour WSL si déjà installé wsl --update ``` Redémarrer si nécessaire, puis lancer Ubuntu depuis le menu démarrer. ### 1.2 Installer les drivers NVIDIA pour WSL **Sur Windows** (pas dans WSL) : 1. Télécharger les derniers drivers NVIDIA : https://www.nvidia.com/Download/index.aspx 2. Installer normalement sur Windows 3. Les drivers WSL sont inclus automatiquement **Vérification dans WSL** : ```bash # Lancer WSL Ubuntu wsl # Vérifier que le GPU est détecté nvidia-smi ``` Tu devrais voir ton GPU et la version CUDA. ### 1.3 Configurer WSL pour plus de RAM Créer/éditer le fichier `.wslconfig` dans Windows : **Sur Windows**, créer `C:\Users\VOTRE_NOM\.wslconfig` : ```ini [wsl2] memory=16GB processors=8 swap=8GB localhostForwarding=true [experimental] sparseVhd=true ``` Redémarrer WSL : ```powershell wsl --shutdown wsl ``` --- ## Étape 2 : Installation de Docker dans WSL ```bash # Mise à jour du système sudo apt update && sudo apt upgrade -y # Installer les dépendances sudo apt install -y \ ca-certificates \ curl \ gnupg \ lsb-release # Ajouter le repository Docker sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # Installer Docker sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # Ajouter votre user au groupe docker sudo usermod -aG docker $USER # Activer Docker au démarrage sudo systemctl enable docker sudo systemctl start docker # IMPORTANT : Se déconnecter et reconnecter pour appliquer les permissions exit ``` Relancer WSL et vérifier : ```bash docker --version docker run hello-world ``` ### 2.1 Installer NVIDIA Container Toolkit ```bash # Ajouter le repository NVIDIA distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list # Installer le toolkit sudo apt update sudo apt install -y nvidia-container-toolkit # Configurer Docker pour utiliser le GPU sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker # Tester le GPU dans Docker docker run --rm --gpus all nvidia/cuda:12.0.0-base-ubuntu22.04 nvidia-smi ``` --- ## Étape 3 : Installer Ollama ```bash # Télécharger et installer Ollama curl -fsSL https://ollama.com/install.sh | sh # Démarrer le service Ollama ollama serve & # Attendre 5 secondes que le serveur démarre sleep 5 # Vérifier que Ollama fonctionne ollama list ``` ### 3.1 Télécharger les modèles optimisés pour le code ```bash # Qwen2.5 Coder - Le meilleur rapport qualité/vitesse ollama pull qwen2.5-coder:7b # DeepSeek Coder V2 - Excellente qualité (plus lourd) ollama pull deepseek-coder-v2:16b # Llama 3.1 - Bon généraliste ollama pull llama3.1:8b # Modèle d'embeddings pour le RAG ollama pull nomic-embed-text ``` ### 3.2 Tester un modèle ```bash # Test simple ollama run qwen2.5-coder:7b "Écris une fonction Python pour calculer Fibonacci" ``` --- ## Étape 4 : Installer Open WebUI avec support GPU ```bash # Lancer Open WebUI avec GPU NVIDIA docker run -d \ --gpus all \ -p 3000:8080 \ --add-host=host.docker.internal:host-gateway \ -v open-webui:/app/backend/data \ --name open-webui \ --restart always \ ghcr.io/open-webui/open-webui:cuda # Vérifier que le container tourne docker ps # Voir les logs docker logs open-webui ``` **Accéder à l'interface** : - Ouvrir navigateur Windows : `http://localhost:3000` - Créer un compte (local, pas de cloud) - Les modèles Ollama seront détectés automatiquement --- ## Étape 5 : Créer des modèles personnalisés pour le code ### 5.1 Créer un Modelfile pour assistant code ```bash # Créer un dossier pour les modelfiles mkdir -p ~/ollama-models cd ~/ollama-models # Créer le fichier cat > CodeExpert.modelfile << 'EOF' FROM qwen2.5-coder:7b PARAMETER temperature 0.2 PARAMETER top_p 0.95 PARAMETER top_k 40 PARAMETER num_ctx 8192 PARAMETER repeat_penalty 1.1 SYSTEM """ Tu es un expert en développement logiciel avec 15 ans d'expérience. RÈGLES : - Écris du code propre, lisible et maintenable - Inclus la gestion d'erreurs appropriée - Ajoute des commentaires pour la logique complexe - Suis les conventions du langage utilisé - Propose des optimisations quand pertinent - Utilise les design patterns appropriés - Format : markdown avec syntax highlighting LANGAGES MAÎTRISÉS : Python, JavaScript/TypeScript, Java, C++, Go, Rust, SQL, Shell SPÉCIALITÉS : - Architecture logicielle - Optimisation de performance - Sécurité applicative - Tests unitaires - Clean Code """ TEMPLATE """{{ if .System }}<|im_start|>system {{ .System }}<|im_end|> {{ end }}{{ if .Prompt }}<|im_start|>user {{ .Prompt }}<|im_end|> {{ end }}<|im_start|>assistant """ EOF # Créer le modèle custom ollama create code-expert -f CodeExpert.modelfile # Tester ollama run code-expert "Crée une API REST avec FastAPI pour gérer des utilisateurs" ``` ### 5.2 Modelfile pour code review ```bash cat > CodeReviewer.modelfile << 'EOF' FROM qwen2.5-coder:7b PARAMETER temperature 0.1 PARAMETER top_p 0.9 PARAMETER num_ctx 8192 SYSTEM """ Tu es un expert en code review avec un œil pour les détails. ANALYSE : 1. 🐛 BUGS : Erreurs logiques, edge cases non gérés 2. 🔒 SÉCURITÉ : Injections SQL, XSS, secrets exposés 3. ⚡ PERFORMANCE : Complexité algorithmique, optimisations 4. 📖 LISIBILITÉ : Nommage, structure, commentaires 5. ✅ BEST PRACTICES : Patterns, conventions, maintenabilité FORMAT : - Liste les problèmes par ordre de priorité - Donne des suggestions concrètes - Indique le niveau : CRITIQUE / IMPORTANT / SUGGESTION """ EOF ollama create code-reviewer -f CodeReviewer.modelfile ``` ### 5.3 Modelfile pour debugging ```bash cat > Debugger.modelfile << 'EOF' FROM deepseek-coder-v2:16b PARAMETER temperature 0.1 PARAMETER top_p 0.95 PARAMETER num_ctx 16384 SYSTEM """ Tu es un expert en debugging et résolution de problèmes. MÉTHODOLOGIE : 1. Analyse le code et l'erreur fournie 2. Identifie la cause racine 3. Explique pourquoi le bug se produit 4. Propose une correction avec explication 5. Suggère des tests pour éviter la régression FOCUS : - Stack traces - Erreurs runtime - Memory leaks - Race conditions - Edge cases """ EOF ollama create debugger -f Debugger.modelfile ``` --- ## Étape 6 : Configuration VS Code avec Continue.dev ### 6.1 Installer VS Code (si pas déjà fait) Sur Windows, télécharger depuis : https://code.visualstudio.com/ ### 6.2 Installer l'extension WSL Dans VS Code : 1. Extensions (Ctrl+Shift+X) 2. Chercher "WSL" 3. Installer "WSL" par Microsoft ### 6.3 Se connecter à WSL 1. `Ctrl+Shift+P` → "WSL: Connect to WSL" 2. Ou cliquer sur le bouton vert en bas à gauche → "Connect to WSL" ### 6.4 Installer Continue.dev Dans VS Code (connecté à WSL) : 1. Extensions → Chercher "Continue" 2. Installer "Continue - Codestral, Claude, and more" ### 6.5 Configurer Continue Créer le fichier de config : ```bash mkdir -p ~/.continue cat > ~/.continue/config.json << 'EOF' { "models": [ { "title": "Code Expert", "provider": "ollama", "model": "code-expert", "apiBase": "http://localhost:11434" }, { "title": "Qwen Coder", "provider": "ollama", "model": "qwen2.5-coder:7b", "apiBase": "http://localhost:11434" }, { "title": "DeepSeek Coder", "provider": "ollama", "model": "deepseek-coder-v2:16b", "apiBase": "http://localhost:11434" } ], "tabAutocompleteModel": { "title": "Qwen Fast Autocomplete", "provider": "ollama", "model": "qwen2.5-coder:7b", "apiBase": "http://localhost:11434" }, "embeddingsProvider": { "provider": "ollama", "model": "nomic-embed-text", "apiBase": "http://localhost:11434" }, "contextProviders": [ { "name": "code", "params": {} }, { "name": "docs", "params": {} }, { "name": "diff", "params": {} }, { "name": "terminal", "params": {} }, { "name": "problems", "params": {} }, { "name": "folder", "params": {} }, { "name": "codebase", "params": {} } ], "slashCommands": [ { "name": "edit", "description": "Edit selected code" }, { "name": "comment", "description": "Write comments for selected code" }, { "name": "share", "description": "Export conversation to markdown" }, { "name": "cmd", "description": "Generate shell command" } ] } EOF ``` ### 6.6 Utiliser Continue dans VS Code **Raccourcis clavier** : - `Ctrl+L` : Ouvrir le chat Continue - `Ctrl+I` : Edit inline (modifier le code sélectionné) - `Ctrl+Shift+L` : Nouveau chat **Commandes slash** : - `/edit` : Modifier le code sélectionné - `/comment` : Ajouter des commentaires - `/fix` : Corriger les erreurs - `/test` : Générer des tests --- ## Étape 7 : Optimisations avancées ### 7.1 Script de démarrage automatique ```bash cat > ~/start-ai-stack.sh << 'EOF' #!/bin/bash echo "🚀 Démarrage de la stack IA..." # Démarrer Ollama en arrière-plan echo "📦 Démarrage Ollama..." ollama serve > /dev/null 2>&1 & sleep 3 # Vérifier que Ollama tourne if curl -s http://localhost:11434/api/tags > /dev/null; then echo "✅ Ollama démarré" else echo "❌ Erreur : Ollama n'a pas démarré" exit 1 fi # Démarrer Open WebUI si pas déjà lancé if ! docker ps | grep -q open-webui; then echo "🌐 Démarrage Open WebUI..." docker start open-webui 2>/dev/null || \ docker run -d \ --gpus all \ -p 3000:8080 \ --add-host=host.docker.internal:host-gateway \ -v open-webui:/app/backend/data \ --name open-webui \ --restart always \ ghcr.io/open-webui/open-webui:cuda echo "✅ Open WebUI démarré sur http://localhost:3000" else echo "✅ Open WebUI déjà actif" fi echo "" echo "🎉 Stack IA prête !" echo "📊 GPU Status:" nvidia-smi --query-gpu=name,memory.total,memory.used --format=csv,noheader,nounits echo "" echo "🔗 Accès:" echo " - Open WebUI: http://localhost:3000" echo " - Ollama API: http://localhost:11434" echo "" echo "📝 Modèles disponibles:" ollama list EOF chmod +x ~/start-ai-stack.sh ``` Utilisation : ```bash ~/start-ai-stack.sh ``` ### 7.2 Créer un alias dans .bashrc ```bash echo "alias ai='~/start-ai-stack.sh'" >> ~/.bashrc echo "alias ai-stop='docker stop open-webui && pkill ollama'" >> ~/.bashrc source ~/.bashrc ``` Maintenant tu peux juste taper `ai` pour tout lancer. ### 7.3 Monitoring GPU en temps réel ```bash # Installer nvtop pour monitoring GPU sudo apt install -y nvtop # Lancer nvtop ``` Ou utiliser : ```bash watch -n 1 nvidia-smi ``` ### 7.4 Script pour tester les performances ```bash cat > ~/benchmark-models.sh << 'EOF' #!/bin/bash echo "🎯 Benchmark des modèles..." PROMPT="Écris une fonction Python qui implémente QuickSort avec commentaires" for MODEL in "qwen2.5-coder:7b" "code-expert" "deepseek-coder-v2:16b"; do echo "" echo "⏱️ Testing $MODEL..." START=$(date +%s) ollama run $MODEL "$PROMPT" > /dev/null 2>&1 END=$(date +%s) DURATION=$((END - START)) echo "✅ $MODEL: ${DURATION}s" done EOF chmod +x ~/benchmark-models.sh ``` --- ## Étape 8 : Utilisation avancée avec API ### 8.1 Script Python pour interagir avec Ollama ```bash # Installer les dépendances Python pip install ollama requests rich ``` ```python # Créer ~/ai_assistant.py cat > ~/ai_assistant.py << 'EOF' #!/usr/bin/env python3 import ollama from rich.console import Console from rich.markdown import Markdown console = Console() def code_review(code: str, language: str = "python"): """Effectue une review de code.""" response = ollama.chat( model='code-reviewer', messages=[{ 'role': 'user', 'content': f'Review ce code {language}:\n\n```{language}\n{code}\n```' }] ) md = Markdown(response['message']['content']) console.print(md) def debug_error(code: str, error: str, language: str = "python"): """Debug une erreur.""" response = ollama.chat( model='debugger', messages=[{ 'role': 'user', 'content': f''' Code {language}: ```{language} {code} ``` Erreur: ``` {error} ``` Trouve et corrige le bug. ''' }] ) md = Markdown(response['message']['content']) console.print(md) def generate_code(description: str, language: str = "python"): """Génère du code.""" response = ollama.chat( model='code-expert', messages=[{ 'role': 'user', 'content': f'Génère du code {language} pour: {description}' }] ) md = Markdown(response['message']['content']) console.print(md) if __name__ == "__main__": import sys if len(sys.argv) < 2: print("Usage:") print(" python ai_assistant.py review ") print(" python ai_assistant.py debug ") print(" python ai_assistant.py generate ''") sys.exit(1) command = sys.argv[1] if command == "review" and len(sys.argv) >= 3: with open(sys.argv[2]) as f: code = f.read() code_review(code) elif command == "generate" and len(sys.argv) >= 3: generate_code(sys.argv[2]) else: print("Commande invalide") EOF chmod +x ~/ai_assistant.py ``` Utilisation : ```bash # Review de code python ~/ai_assistant.py review mon_script.py # Génération de code python ~/ai_assistant.py generate "API REST avec authentification JWT" ``` ### 8.2 API REST custom avec FastAPI ```bash pip install fastapi uvicorn ``` ```python # Créer ~/code_api.py cat > ~/code_api.py << 'EOF' from fastapi import FastAPI, HTTPException from pydantic import BaseModel import ollama app = FastAPI(title="Code AI API") class CodeRequest(BaseModel): code: str language: str = "python" class PromptRequest(BaseModel): prompt: str model: str = "code-expert" @app.post("/review") async def review_code(request: CodeRequest): """Review du code.""" try: response = ollama.chat( model='code-reviewer', messages=[{ 'role': 'user', 'content': f'Review ce code {request.language}:\n\n```{request.language}\n{request.code}\n```' }] ) return {"review": response['message']['content']} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.post("/generate") async def generate_code(request: PromptRequest): """Génération de code.""" try: response = ollama.chat( model=request.model, messages=[{ 'role': 'user', 'content': request.prompt }] ) return {"code": response['message']['content']} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.get("/models") async def list_models(): """Liste les modèles disponibles.""" try: models = ollama.list() return {"models": [m['name'] for m in models['models']]} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000) EOF ``` Lancer l'API : ```bash python ~/code_api.py ``` Tester : ```bash # Review de code curl -X POST http://localhost:8000/review \ -H "Content-Type: application/json" \ -d '{"code": "def add(a,b):\n return a+b", "language": "python"}' # Générer du code curl -X POST http://localhost:8000/generate \ -H "Content-Type: application/json" \ -d '{"prompt": "Fonction pour valider un email", "model": "code-expert"}' ``` --- ## Étape 9 : Intégration RAG (Retrieval Augmented Generation) Pour que l'IA utilise ta documentation/codebase : ```bash pip install chromadb langchain ``` ```python # Créer ~/rag_codebase.py cat > ~/rag_codebase.py << 'EOF' #!/usr/bin/env python3 import chromadb from chromadb.config import Settings import ollama import os from pathlib import Path class CodebaseRAG: def __init__(self, codebase_path: str): self.client = chromadb.Client(Settings( chroma_db_impl="duckdb+parquet", persist_directory="./chroma_db" )) self.collection = self.client.get_or_create_collection("codebase") self.codebase_path = Path(codebase_path) def index_codebase(self): """Indexe tous les fichiers de code.""" extensions = ['.py', '.js', '.ts', '.java', '.cpp', '.go', '.rs'] for ext in extensions: for file_path in self.codebase_path.rglob(f'*{ext}'): try: with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # Générer l'embedding avec Ollama embedding_response = ollama.embeddings( model='nomic-embed-text', prompt=content ) self.collection.add( ids=[str(file_path)], embeddings=[embedding_response['embedding']], documents=[content], metadatas=[{"path": str(file_path), "ext": ext}] ) print(f"✅ Indexé: {file_path}") except Exception as e: print(f"❌ Erreur {file_path}: {e}") def query_codebase(self, question: str, n_results: int = 3): """Recherche dans la codebase.""" # Générer l'embedding de la question query_embedding = ollama.embeddings( model='nomic-embed-text', prompt=question ) # Chercher les documents similaires results = self.collection.query( query_embeddings=[query_embedding['embedding']], n_results=n_results ) return results def ask(self, question: str): """Pose une question sur la codebase.""" # Récupérer les documents pertinents results = self.query_codebase(question) # Construire le contexte context = "\n\n".join([ f"Fichier: {meta['path']}\n```\n{doc}\n```" for doc, meta in zip(results['documents'][0], results['metadatas'][0]) ]) # Générer la réponse avec le contexte response = ollama.chat( model='code-expert', messages=[{ 'role': 'system', 'content': 'Tu es un expert qui répond aux questions sur une codebase. Utilise le contexte fourni.' }, { 'role': 'user', 'content': f'''Contexte:\n{context}\n\nQuestion: {question}''' }] ) return response['message']['content'] if __name__ == "__main__": import sys if len(sys.argv) < 3: print("Usage:") print(" python rag_codebase.py index ") print(" python rag_codebase.py ask ''") sys.exit(1) rag = CodebaseRAG("./chroma_db") if sys.argv[1] == "index": rag.codebase_path = Path(sys.argv[2]) rag.index_codebase() print("✅ Indexation terminée") elif sys.argv[1] == "ask": answer = rag.ask(sys.argv[2]) print(answer) EOF chmod +x ~/rag_codebase.py ``` Utilisation : ```bash # Indexer un projet python ~/rag_codebase.py index /chemin/vers/projet # Poser une question python ~/rag_codebase.py ask "Comment fonctionne l'authentification dans ce projet ?" ``` --- ## Étape 10 : Dépannage et optimisations ### 10.1 Problèmes courants **Ollama ne démarre pas** : ```bash # Vérifier les processus ps aux | grep ollama # Tuer et relancer pkill ollama ollama serve & ``` **GPU non détecté** : ```bash # Vérifier CUDA nvidia-smi # Réinstaller nvidia-container-toolkit sudo apt remove --purge nvidia-container-toolkit sudo apt install nvidia-container-toolkit sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker ``` **Open WebUI ne charge pas** : ```bash # Voir les logs docker logs open-webui # Redémarrer docker restart open-webui # Si problème persistant, recréer docker rm -f open-webui # Puis relancer la commande docker run de l'étape 4 ``` **Manque de mémoire GPU** : ```bash # Lister les processus GPU nvidia-smi # Utiliser des modèles plus petits ou quantizés ollama pull qwen2.5-coder:7b-q4_0 # Version plus légère ``` ### 10.2 Optimiser les performances **Ajuster les paramètres Ollama** : ```bash # Créer un fichier de config Ollama mkdir -p ~/.ollama cat > ~/.ollama/config.json << 'EOF' { "num_gpu": 1, "gpu_layers": 35, "num_thread": 8, "num_ctx": 8192, "batch_size": 512 } EOF ``` **Utiliser la quantization appropriée** : ```bash # Pour 8GB VRAM ollama pull qwen2.5-coder:7b-q5_K_M # Meilleure qualité ollama pull qwen2.5-coder:7b-q4_K_M # Équilibré ollama pull qwen2.5-coder:7b-q3_K_M # Plus rapide, moins précis ``` ### 10.3 Surveillance et monitoring ```bash # Script de monitoring cat > ~/monitor-ai.sh << 'EOF' #!/bin/bash echo "📊 Monitoring de l'IA" echo "====================" echo "" echo "🖥️ GPU:" nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total,temperature.gpu --format=csv,noheader,nounits echo "" echo "🐳 Docker Containers:" docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" echo "" echo "📦 Ollama Service:" if curl -s http://localhost:11434/api/tags > /dev/null; then echo "✅ Running" echo "Modèles chargés:" curl -s http://localhost:11434/api/tags | python3 -m json.tool | grep '"name"' else echo "❌ Not running" fi echo "" echo "💾 Espace disque WSL:" df -h / | tail -1 EOF chmod +x ~/monitor-ai.sh ``` --- ## Récapitulatif des commandes essentielles ```bash # Démarrer tout ai # (alias créé précédemment) # Ou manuellement ollama serve & docker start open-webui # Arrêter tout ai-stop # (alias créé précédemment) # Ou manuellement docker stop open-webui pkill ollama # Lister les modèles ollama list # Utiliser un modèle en CLI ollama run code-expert "ton prompt ici" # Monitoring ~/monitor-ai.sh watch -n 1 nvidia-smi # Nettoyer l'espace disque docker system prune -a ollama rm # Supprimer un modèle non utilisé ``` --- ## Accès et URLs - **Open WebUI** : http://localhost:3000 - **Ollama API** : http://localhost:11434 - **API REST custom** : http://localhost:8000 (si lancée) --- ## Prochaines étapes recommandées 1. **Personnaliser les modèles** avec tes propres Modelfiles 2. **Indexer ta codebase** avec le RAG 3. **Créer des prompts** spécialisés pour tes langages favoris 4. **Intégrer avec Git** pour des commits auto-générés 5. **Automatiser les tests** avec l'IA --- ## Ressources - Documentation Ollama : https://ollama.ai/docs - Open WebUI : https://docs.openwebui.com - Continue.dev : https://continue.dev/docs - Modèles Ollama : https://ollama.ai/library --- **🎉 Félicitations ! Ton IA locale est prête.** Teste-la avec : ```bash ollama run code-expert "Crée une API REST complète avec FastAPI pour gérer des tâches avec authentification JWT" ```