Translate

Guide UGAIA Audit FinOps Étape par Étape

 

Guide Complet - Audit FinOps Étape par Étape

Table des matières

  1. Première exécution
  2. Exemples concrets
  3. Interprétation des résultats
  4. Post-audit et validation
  5. 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: