
Ollama : installation et configuration avancée de LLM en local
Guide technique complet pour déployer Ollama, configurer des modèles de langage locaux, optimiser les performances GPU/CPU et intégrer l'API REST.
Architecture et prérequis système
Ollama encapsule des modèles LLM via llama.cpp, offrant une abstraction unifiée pour l'exécution locale. Comprendre les contraintes matérielles est essentiel avant le déploiement.
Configuration minimale recommandée
| Ressource | Minimum | Recommandé | Optimal |
|—————-|————-|——————|————-|
| CPU | x86_64 AVX2 | x86_64 AVX512 | ARM64/Apple Silicon |
| RAM | 8 Go | 16 Go | 32 Go+ |
| GPU | Aucune | GTX 1060 6Go | RTX 4060+ / M3 Pro |
| Stockage | SSD 20 Go | NVMe 100 Go | NVMe 500 Go+ |
| OS | Linux 5.4+ | Ubuntu 22.04 LTS | macOS 14+ / Arch Linux |
Les modèles sont stockés dans ~/.ollama/models/ sous format GGUF (GGML Universal Format). Chaque modèle inclut les tensors quantifiés et les métadonnées de configuration.
Installation automatisée et manuelle
Installation rapide (tous systèmes)
## Linux et macOS
curl -fsSL https://ollama.com/install.sh | sh
## Windows PowerShell (administrateur)
irm https://ollama.com/install.ps1 | iexLe script d'installation détecte automatiquement l'architecture, télécharge le binaire approprié, configure le service système et initialise le répertoire de modèles.
Installation manuelle Linux (sans script)
Pour les environnements restreints ou la conteneurisation :
## Téléchargement du binaire
OLLAMA_VERSION=$(curl -s https://api.github.com/repos/ollama/ollama/releases/latest | grep tag_name | cut -d'"' -f4)
curl -L "https://github.com/ollama/ollama/releases/download/${OLLAMA_VERSION}/ollama-linux-amd64" -o /usr/local/bin/ollama
chmod +x /usr/local/bin/ollama
## Création du service systemd
cat > /etc/systemd/system/ollama.service << 'EOF'
[Unit]
Description=Ollama Service
After=network-online.target
[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=$PATH"
[Install]
WantedBy=default.target
EOF
## Création de l'utilisateur et démarrage
useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama
usermod -aG ollama $(whoami)
systemctl daemon-reload
systemctl enable ollama
systemctl start ollamaDéploiement Docker
## Exécution conteneurisée avec support GPU NVIDIA
docker run -d \
—gpus all \
-v ollama:/root/.ollama \
-p 11434:11434 \
—name ollama \
ollama/ollama
## Avec runtime ROCm pour AMD GPU
docker run -d \
—device /dev/kfd \
—device /dev/dri \
-v ollama:/root/.ollama \
-p 11434:11434 \
—name ollama \
ollama/ollama:rocmGestion des modèles et quantification
Comprendre les tags de quantification
Les modèles Ollama utilisent différents niveaux de quantification GGUF :
| Tag | Bits | Précision | Usage recommandé |
|——-|———|—————-|—————————|
| q4_0 | 4 | FP16 → Q4_0 | Production, ressources limitées |
| q4_K_M | 4 | Mixed | Équilibre qualité/performance |
| q5_K_M | 5 | Mixed | Qualité supérieure |
| q8_0 | 8 | FP16 → Q8 | Qualité proche du FP16 |
| fp16 | 16 | Pleine précision | Recherche, max qualité |
## Pull d'un modèle spécifique avec quantification
ollama pull gemma3:4b
ollama pull gemma3:27b
ollama pull qwen2.5:14b-q5_K_M
## Lister les modèles locaux avec détails
ollama list
ollama show gemma3:4b —modelfileCréation de Modelfiles personnalisés
Les Modelfiles permettent de créer des dérivés avec paramètres personnalisés :
## Modelfile - Assistant Code Review
FROM codellama:13b
## Paramètres d'inférence
PARAMETER temperature 0.2
PARAMETER top_p 0.9
PARAMETER top_k 40
PARAMETER num_ctx 4096
PARAMETER repeat_penalty 1.1
## Template de conversation
TEMPLATE """[INST] {{ if .System }}{{ .System }}\n\n{{ end }}{{ .Prompt }} [/INST]"""
## Message système
SYSTEM """Tu es un relecteur de code expérimenté. Analyse le code fourni selon ces critères :
1. Bugs potentiels et race conditions
2. Violations des principes SOLID
3. Problèmes de sécurité (injection, XSS, etc.)
4. Optimisations possibles
5. Conformité PEP8/style guide
Réponds avec une liste structurée et des suggestions de refactoring."""## Construction et test
ollama create code-reviewer -f Modelfile
ollama run code-reviewerConfiguration avancée et variables d'environnement
## Fichier de configuration ~/.ollama/config.json ou variables d'environnement
## Spécifier le répertoire de modèles (utile pour NAS ou disque externe)
export OLLAMA_MODELS=/mnt/storage/ollama-models
## Hôte d'écoute (0.0.0.0 pour accès réseau, sécuriser avec firewall)
export OLLAMA_HOST=0.0.0.0:11434
## Nombre de couches GPU à déléguer (auto-détection si non spécifié)
export OLLAMA_GPU_LAYERS=35
## Limite de mémoire VRAM (Mo)
export OLLAMA_VRAM_SIZE=8192
## Nombre de threads CPU pour le calcul
export OLLAMA_NUM_THREADS=8
## Debug et logging
export OLLAMA_DEBUG=1
export OLLAMA_LOG_LEVEL=debugAPI REST et intégrations
L'API REST d'Ollama expose les endpoints suivants sur http://localhost:11434 :
Chat completion (streaming)
## Requête de chat avec streaming
curl -X POST http://localhost:11434/api/chat \
-H "Content-Type: application/json" \
-d '{
"model": "gemma3",
"messages": [
{"role": "system", "content": "Tu réponds en français."},
{"role": "user", "content": "Explique les transformers"}
],
"stream": true,
"options": {
"temperature": 0.7,
"num_predict": 512
}
}'
## Génération simple (non-streaming)
curl -X POST http://localhost:11434/api/generate \
-H "Content-Type: application/json" \
-d '{
"model": "llama3.2",
"prompt": "Définis l'optimisation LLM en 3 phrases",
"stream": false,
"format": "json"
}'Embeddings pour RAG
## Génération d'embeddings
curl -X POST http://localhost:11434/api/embeddings \
-H "Content-Type: application/json" \
-d '{
"model": "nomic-embed-text",
"prompt": "L'intelligence artificielle transforme l'industrie"
}'Intégration Python et JavaScript
Client Python officiel
import ollama
from ollama import Client
## Client avec timeout et hôte personnalisé
client = Client(host='http://localhost:11434', timeout=120)
## Chat avec historique
response = client.chat(
model='gemma3',
messages=[
{'role': 'user', 'content': 'Quelle est la capitale de la France ?'},
{'role': 'assistant', 'content': 'La capitale de la France est Paris.'},
{'role': 'user', 'content': 'Et sa population ?'}
],
options={
'temperature': 0.5,
'top_p': 0.95,
'num_ctx': 8192
}
)
## Streaming
for chunk in client.chat(
model='mistral',
messages=[{'role': 'user', 'content': 'Raconte une histoire'}],
stream=True
):
print(chunk['message']['content'], end='', flush=True)
## Gestion des modèles
client.pull('deepseek-coder:6.7b')
client.delete('ancien-modele')Client JavaScript/TypeScript
import ollama from 'ollama';
// Chat avec gestion d'erreurs
async function generateResponse(prompt: string) {
try {
const response = await ollama.chat({
model: 'qwen2.5',
messages: [{ role: 'user', content: prompt }],
options: {
temperature: 0.3,
num_predict: 1024
}
});
return response.message.content;
} catch (error) {
if (error.statusCode === 404) {
console.error('Modèle non trouvé, exécutez : ollama pull qwen2.5');
}
throw error;
}
}
// Embeddings pour相似ité sémantique
const embedding = await ollama.embeddings({
model: 'nomic-embed-text',
prompt: 'Texte à vectoriser'
});Optimisation des performances
Profiling et monitoring
## Surveillance de l'utilisation GPU
watch -n 1 nvidia-smi
## Monitoring du serveur Ollama
curl http://localhost:11434/api/ps
## Logs en temps réel
journalctl -u ollama -fConfiguration pour faible latence
## Préchargement d'un modèle en mémoire
curl -X POST http://localhost:11434/api/generate \
-d '{"model": "gemma3", "prompt": "", "keep_alive": "24h"}'
## Garder le modèle chargé entre les requêtes
export OLLAMA_KEEP_ALIVE=24hOptimisation contexte et mémoire
## Réduire le contexte pour les modèles massifs
options = {
'num_ctx': 2048, # Limite la fenêtre de contexte
'num_gpu': 20, # Couches offload GPU
'num_thread': 4, # Threads CPU
'batch_size': 512 # Taille de batch
}Sécurité et hardening
Restrictions réseau
## UFW - Autoriser uniquement le réseau local
ufw allow from 192.168.1.0/24 to any port 11434
ufw deny 11434
## Nginx reverse proxy avec authentification
location /ollama/ {
auth_basic "Ollama API";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://localhost:11434/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}Isolation avec namespaces
## Exécution dans un namespace réseau isolé
unshare —net —fork /usr/local/bin/ollama serve
## systemd hardening (extrait)
[Service]
PrivateTmp=yes
PrivateDevices=yes
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yesDépannage avancé
Erreur : CUDA out of memory
## Réduire les couches GPU
export OLLAMA_GPU_LAYERS=20
## Ou utiliser uniquement le CPU
export OLLAMA_GPU_LAYERS=0
ollama serveErreur : modèle incompatible architecture
## Vérifier la compatibilité AVX
cat /proc/cpuinfo | grep flags | head -1
## Si pas d'AVX2, compiler llama.cpp avec flags adaptés
## ou utiliser les builds spécifiques ollama-legacyDebugging des requêtes API
## Activer le mode debug
OLLAMA_DEBUG=1 ollama serve 2>&1 | tee ollama.log
## Test avec verbose
curl -v -X POST http://localhost:11434/api/generate \
-d '{"model": "gemma3", "prompt": "test"}'Scripts d'automatisation
#!/bin/bash
## warm-up-models.sh - Préchargement des modèles fréquents
MODELS=("gemma3:4b" "nomic-embed-text" "deepseek-coder:6.7b")
for model in "${MODELS[@]}"; do
echo "Préchauffage de $model..."
ollama pull "$model"
curl -s -X POST http://localhost:11434/api/generate \
-d "{\"model\": \"$model\", \"prompt\": \"\", \"keep_alive\": \"1h\"}" > /dev/null
done
echo "Modèles prêts"#!/usr/bin/env python3
## benchmark.py - Évaluation des performances
import time
import ollama
import statistics
def benchmark_model(model_name, prompt, iterations=5):
times = []
tokens = []
for _ in range(iterations):
start = time.time()
response = ollama.generate(
model=model_name,
prompt=prompt,
options={'num_predict': 256}
)
elapsed = time.time() - start
times.append(elapsed)
tokens.append(response['eval_count'])
avg_time = statistics.mean(times)
avg_tokens = statistics.mean(tokens)
tps = avg_tokens / avg_time
print(f"{model_name}: {avg_time:.2f}s, {tps:.1f} tokens/s")
return tps
benchmark_model('gemma3:4b', 'Explique la récursivité')À lire aussi
GPT-5.4 mini débarque sur ChatGPT gratuit : ce que ça change...
OpenAI rend GPT-5.4 mini accessible aux utilisateurs gratuits de ChatGPT. Plus rapide, plus intelligent et capable de rivaliser avec le modèle phare, voici ce que cet...
Apple bloque le « vibe coding » sur l'App Store : Replit et ...
Apple empêche Replit et Vibecode de publier des mises à jour sur l'App Store. En cause : des règles anciennes sur l'exécution de code dynamique qui s'appliquent dÃ...
Le Pentagone qualifie Anthropic de menace pour la sécurité n...
Le département de la Défense américain classe Anthropic comme risque inacceptable pour la sécurité nationale, une première pour une entreprise américaine. Les e...