Guide Complet - Audit FinOps Étape par Étape
Table des matières
- Première exécution
- Exemples concrets
- Interprétation des résultats
- Post-audit et validation
- Troubleshooting
Première exécution
Étape 1: Vérifiez les prérequis (5 min)
# Clonez ou téléchargez les scripts
cd /mon/projet/audit-finops
# Setup automatique
bash setup.sh
# Output attendu:
# ✓ Python 3 trouvé: 3.10.x
# ✓ curl trouvé: 7.x
# ! Ollama non trouvé (installez Ollama d'abord)
Étape 2: Installez Ollama + Gemma4 (15 min, first-time only)
# Option A: Installation auto (Linux/macOS)
bash setup.sh --all
# Option B: Installation manuelle
# 1. Téléchargez Ollama: https://ollama.ai
# 2. Lancez: ollama serve &
# 3. Dans un autre terminal:
ollama pull gemma4
# Vérifiez:
curl http://localhost:11434/api/tags | jq '.models[].name'
# Doit afficher: "gemma4:latest"
Étape 3: Lancez votre premier audit (20 min)
# Audit du repo courant
python3 audit_finops_complete.py --repo .
# Output:
# 🚀 Audit FinOps - Système d'IA Générative
# ────────────────────────────────────────────
# 🔍 Découverte du repo: .
# → Scan structure... (28 fichiers Python)
# → Scan appels modèles... (5 appels détectés)
# → Scan config...
# → Scan infrastructure... (2 containers)
# → Scan logs...
# ✅ Découverte complétée
#
# ────────────────────────────────────────────
# PHASE 1
# ────────────────────────────────────────────
# ⏳ phase1_discovery...
# 📡 Appel Ollama #1 (Phase 1)...
# ✅ 1247 chars reçus
# ✅ phase1.md
#
# [phases 2-6...]
#
# ✨ AUDIT TERMINÉ
# 📁 Résultats dans: audit_finops_output/
# - phase1.md, phase2.md, ..., phase6.md
# - RAPPORT_FINAL.md
# - context.json
Étape 4: Consultez le rapport (5 min)
# Ouvrir le rapport final
cat audit_finops_output/RAPPORT_FINAL.md | less
# Ou extraire la synthèse exécutive
head -100 audit_finops_output/phase6.md
# Ou en HTML (avec pandoc)
pandoc audit_finops_output/RAPPORT_FINAL.md -o rapport.html
open rapport.html
Exemples concrets
Exemple 1: FastAPI + Ollama (classique)
Repo structure:
my_api/
├── main.py # FastAPI + routes Ollama
├── models/
│ ├── classification.py # Appels Ollama
│ └── rag.py # RAG avec embeddings
├── docker-compose.yml # Ollama, Redis, Grafana
└── .env # Config modèles
Commande audit:
python3 audit_finops_complete.py \
--repo /path/to/my_api \
--output ./audit_api_jan2025 \
--verbose
Résultats attendus:
- Phase 1: 3 appels Ollama détectés (classification, RAG, chat)
- Phase 2: Baseline ~€500/mois (estimé)
- Phase 3: Top poste = tokens entrée RAG (60% du coût)
- Phase 4: Quick wins = reranking RAG, routage modèles
- Phase 5: Priorisation 1) RAG reranking (1j, -30% coût), 2) Routage (2j, -15%)
- Phase 6: Plan d'action = implémenter semaine 1-2
Exemple 2: LLM Agent multi-tour (complexe)
Stack:
ai_agent/
├── agent.py # LangChain + Claude + tools
├── tools/
│ ├── search.py # API externe
│ ├── database.py # SQL
│ └── llm.py # Anthropic Claude
├── config/
│ └── prompts.yaml # Système prompt, few-shot
└── metrics/
└── logs.json # Usage stats
Commande audit:
python3 audit_finops_complete.py \
--repo . \
--model gemma4 \
--timeout 400 # Agent peut être lent
Résultats attendus:
- Phase 1: 2 providers détectés (Anthropic Claude + LangChain)
- Phase 2: Baseline ~€800/mois (cher: beaucoup de tokens contexte)
- Phase 3: Top poste = tokens entrée (74%), system prompt trop gros
- Phase 4:
- Levier 1: Réduire system prompt (-20% tokens)
- Levier 2: Cache prompt (-40% cache hits)
- Levier 3: Réduire historique (+30% gain tokens)
- Phase 5: Quick wins toutes faisables semaine 1 = -$300/mois potentiel
- Phase 6: Implém immédiate recommandée
Exemple 3: RAG documentaire (volumétrique)
Stack:
rag_app/
├── app.py # Flask + Chroma/Pinecone
├── indexing/
│ ├── embeddings.py # SentenceTransformers
│ └── chunking.py # Text chunking
├── retrieval/
│ ├── bm25.py # Sparse retrieval
│ └── reranker.py # CrossEncoder
└── llm/
└── generate.py # Ollama Mistral
Commande audit:
python3 audit_finops_complete.py --repo .
Résultats attendus:
- Phase 1: Embeddings détectés (SentenceTransformers), retrieval Ollama
- Phase 2: Baseline €1200/mois (coût GPU embeddings non négligeable)
- Phase 3: Top = embeddings (re-indexation fréquente), retrieval tokens (top_k trop haut)
- Phase 4:
- Reranking = -20% contexte injecté
- Métadonnées filter = -30% retrieval
- Quantization embeddings = -15% latence GPU
- Phase 5: Reranking (quick win, 2j, -$150/mois), puis quantization (1 week)
- Phase 6: Plan chiffré
Interprétation des résultats
Phase 1 - Découverte: Ce qu'on cherche
Bon output:
## Appels IA détectés
- **Ollama** in app/rag.py
Modèles: mistral, neural-chat
Max tokens: 2048
- **Anthropic** in app/agent.py
Modèles: claude-opus
Red flags:
- "Aucun appel IA détecté" → Repo est un client/wrapper, cherchez ailleurs
- Modèles multiples sans pattern clair → Possibilité de consolidation
Phase 2 - Baseline: Ce qu'on cherche
Bon output:
## Coût estimé (€/mois)
| Poste | Baseline | Confiance |
|-------|----------|-----------|
| Tokens entrée | €400 | Haut |
| Tokens sortie | €150 | Haut |
| Infrastructure | €100 | Moyen |
| Embeddings | €50 | Faible |
| **TOTAL** | **€700** | - |
Red flags:
- Confiance "Inconnu" → Instrumentez (ajouter logs)
- Écart énorme entrée vs sortie → Vérifiez max_tokens
Phase 3 - Pareto: Ce qu'on cherche
Bon output:
## Top 3 postes (80% du coût)
1. Tokens entrée RAG: €420 (60%)
2. Tokens sortie generation: €150 (21%)
3. Infrastructure GPU: €100 (14%)
Autres: €30 (4%) → ignorer
Implication: Concentration sur RAG pour 80% du gain potentiel.
Phase 4 - Quantification: Ce qu'on cherche
Bon tableau:
| Levier | Gain €/mois | Effort | Risque | Confiance |
|--------|-------------|--------|--------|-----------|
| Reranking RAG | €150 (20%) | 2j | Faible | Moyen |
| Prompt cache | €100 (15%) | 1j | Faible | Faible |
| Routage modèles | €200 (25%) | 5j | Moyen | Moyen |
| Quantization | €50 (7%) | 3j | Moyen | Faible |
Interprétation:
- Reranking = best bet (bon gain, effort modéré, peu de risque)
- Quantization = risqué (qualité incertaine)
Phase 5 - Priorisation: Ce qu'on cherche
Bon plan:
## Quick Wins (Semaine 1-2)
[ ] Reranking RAG (2j, €150)
- Intégrer CrossEncoder
- Test sur 100 requêtes
[ ] Historique élagué (1j, €50)
- Limiter contexte conversationnel
## Chantiers (Semaine 3+)
[ ] Routage modèles (5j, €200)
- Classifier requête avant appel
- Route simple → phi4, complexe → mistral
Implication:
- Semaine 1: €200 d'économie de façon sure
- Semaine 4: €200+ additionnels (si qualité OK)
Phase 6 - Livrable: Ce qu'on cherche
Synthèse exécutive:
## Résumé exécutif
Coût actuel: €700/mois
Économie potentielle: €300-400/mois (42-57%)
3 actions prioritaires:
1. RAG reranking (€150, semaine 1-2)
2. Prompt caching (€100, semaine 1)
3. Routage modèles (€200, semaine 3)
ROI: 4 semaines implementation pour >€400/mois
Post-audit et validation
Étape 1: Mesurez la baseline (jour 1)
python3 validate_finops.py baseline --output baseline_day1.json
# Output:
# 📊 Mesure BASELINE (avant optimisation)...
# ⏱️ Duration: 30s
#
# ✅ Baseline sauvegardée → baseline_day1.json
#
# {
# "tokens": {
# "avg_input_tokens": 512,
# "avg_output_tokens": 256,
# "estimated_cost_usd_per_month": 500.0
# },
# "latency": {
# "p50_ms": 100,
# "p95_ms": 300,
# "p99_ms": 600
# },
# ...
# }
Étape 2: Implémentez les recommandations
Basé sur Phase 5, implémentez dans cet ordre:
Quick wins (jour 2-5):
# Si RAG reranking était recommandé:
from sentence_transformers import CrossEncoder
reranker = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')
def get_relevant_docs(query, candidates, top_k=5):
# Avant: prenez top 20 avec BM25, envoyez tous au LLM (coûteux)
# Après: rerank top 20, envoyez top 5 (économie tokens)
scores = reranker.predict([[query, doc] for doc in candidates])
reranked = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)
return [doc for doc, score in reranked[:top_k]]
Mesurez l'impact:
# Avant: 600 tokens contexte (20 docs × 30 tokens)
# Après: 150 tokens contexte (5 docs × 30 tokens)
# → -75% = Gain
# Mais vérifiez: qualité pas dégradée?
# Testez manuellement 10 requêtes
Chantiers (semaine 3+):
# Si routage modèles était recommandé:
from sklearn.svm import SVC
classifier = SVC(kernel='linear')
# Entraîner sur: simple_query → phi4, complex_query → mistral
def smart_route(query):
if classifier.predict([query])[0] == "simple":
return "phi4" # Fast, cheap
else:
return "mistral" # Powerful, expensive
Mesurez:
# Avant: tout via Mistral 7B = $0.50/1M tokens
# Après: 60% via Phi4 ($0.20), 40% via Mistral
# → Économie 36% sur coûts modèles
Étape 3: Mesurez l'optimisé (jour 14+)
python3 validate_finops.py measure --output optimized_day14.json
# Sauvegarde mesure post-implémentation
Étape 4: Comparez
python3 validate_finops.py compare baseline_day1.json optimized_day14.json
# Output:
# 📊 Comparaison baseline vs optimisé...
#
# | Métrique | Baseline | Optimisé | Gain | % |
# |----------|----------|----------|------|---|
# | Tokens entrée | 512 | 384 | 128 | 25% |
# | Coût ($/mois) | 500 | 325 | 175 | 35% |
# | Latence P95 | 300ms | 280ms | -20ms | -7% |
# | Quality | 97% | 96% | -1% | OK |
#
# ✅ Gain solide (35%), Latence stable, Qualité préservée
#
# Rapport → comparison_day14.md
Checklist finale
## Validation Post-Optimisation
- [ ] **Coût:** Réduit de X% (cible: >20%)?
- Baseline: €500/mois
- Optimisé: €325/mois
- ✓ 35% = Dépassé!
- [ ] **Latence:** ≤ SLA (cible: <300ms P95)?
- Baseline: 300ms P95
- Optimisé: 280ms P95
- ✓ Amélioré!
- [ ] **Qualité:** ≥ 95% success rate?
- Baseline: 97%
- Optimisé: 96%
- ✓ Acceptable (dégradation 1%)
- [ ] **Pas de hallucinations augmentées?**
- Baseline: 2%
- Optimisé: 2.2%
- ⚠ Stable, monitoring continue
## Conclusion
✅ **Optimisations validées**: 35% économie, qualité préservée
📈 **ROI**: 4 semaines implementation → €175/mois savings
🎯 **Prochaines étapes**: Monitorer 1 mois, puis relancer Phase 4-5
Troubleshooting
Ollama timeout sur Phase X
Symptôme:
⏳ phase4_levers...
📡 Appel Ollama #4 (Phase 4)...
❌ Timeout (300s)
Solution:
# Vérifiez que Ollama tourne bien
docker ps | grep ollama
ollama ps # Vérifiez GPU load
# Relancez avec timeout augmenté
python3 audit_finops_complete.py \
--repo . \
--timeout 600 \
--skip-phases 1 2 3 # Reprendre à phase 4
Gemma4 envoie réponses courtes / inutilisables
Symptôme:
phase1.md contient juste "Cartographie complète..."
Solution:
# Testez directement Ollama
curl -X POST http://localhost:11434/api/generate \
-H "Content-Type: application/json" \
-d '{
"model": "gemma4",
"prompt": "Tu es un ingénieur. Énumère 5 points clés.",
"stream": false,
"temperature": 0.3,
"num_predict": 2000
}' | jq .response
# Si réponse courte: augmentez num_predict
# Si vide: Gemma4 overloaded, attendez 10 min
GPU memory overflow
Symptôme:
Out of memory error Ollama
Solution:
# Vérifiez mémoire dispo
nvidia-smi
# Basculez vers petit modèle (plus rapide aussi)
ollama pull mistral # 7B vs 13B Gemma4
python3 audit_finops_complete.py \
--repo . \
--model mistral
context.json vide ou incomplet
Symptôme:
cat audit_finops_output/context.json
# {"structure": {}, "modeles": [], ...}
Solution:
# Vérifiez que repo est correct
ls -la /chemin/vers/repo
find /chemin/vers/repo -name "*.py" | wc -l
# Re-run avec verbose
python3 audit_finops_complete.py \
--repo /chemin/vers/repo \
--verbose
# Cherchez "Erreur lecture" dans les logs
Python imports manquants
Symptôme:
ModuleNotFoundError: No module named 'yaml'
Solution:
pip install pyyaml
# ou complet:
pip install pyyaml psutil
Questions fréquentes
Q: Puis-je auditer plusieurs repos?
A: Oui, lancez audit_finops_complete.py pour chacun avec --output différent.
Q: Puis-je modifier les prompts des phases? A: Les PHASE_PROMPTS sont dans le script (function PHASES). Modifiez + relancez.
Q: Puis-je exporter le rapport en PDF?
A: Oui, install pandoc: apt-get install pandoc, puis:
pandoc audit_finops_output/RAPPORT_FINAL.md -o rapport.pdf
Q: Combien ça coûte en credits Ollama? A: Gratuit! Ollama tourne locally. Si Anthropic Claude utilisé: ~$10-20 d'API calls pour l'audit lui-même (phases 1-6).
Q: Puis-je utiliser Claude à la place de Gemma4? A: Oui, mais modifiez le script pour utiliser l'API Anthropic au lieu de Ollama.
Q: Quelle est la cadence de ré-audit recommandée? A: Tous les 3-6 mois ou après major changement architecture (nouveau provider, gros chantier implémenté).
Dernière mise à jour: Janvier 2025 Version: 1.0
Aucun commentaire:
Enregistrer un commentaire