Sur cette page : sources de panne · configuration de la boucle d’événements · taille des lots et mémoire · tableau timeouts / disjoncteur · métriques d’observabilité · seuils de coût · matrice de décision · étapes HowTo · FAQ
Croisez les traces avec le guide OpenTelemetry GenAI sur Mac, les quotas de chunks avec la matrice RAG locale (chunks, embeddings), et les pics d’index avec USearch, FAISS-CPU et sqlite-vec avant de figer l’ingestion.
Où ça casse sur une pile agent M4
1. Boucle bloquée. Un outil HTTP synchrone ou un parseur lourd sur la boucle asyncio principale fige toutes les étapes en aval : la symptômatique est une queue de latence, pas une erreur d’outil lisible.
2. Falaise mémoire. Augmenter le lot de retrieval ou le fan-out d’enfants sans mesurer le RSS consomme la mémoire unifiée dont le LLM a encore besoin pour la croissance du cache KV.
3. Optimisme financier. On cite le tarif catalogue du modèle en oubliant loyer horaire, minutes GPU au ralenti et fenêtres de refroidissement disjoncteur qui allongent l’horloge murale.
Configuration de la boucle d’événements
Une politique asyncio par processus, documentée dans le runbook. Gardez les étapes LlamaIndex Workflows non bloquantes : E/S fichiers, outils subprocess et parseurs CPU passent dans des executors ; limitez la concurrence des workflows avec un sémaphore pour qu’un pic de retrieval n’affame pas l’orchestration.
Sérialisez les embeddings GPU derrière le même « portillon » que les appels LLM. Laissez les expériences nest_asyncio dans les carnets, pas dans l’entrée de production.
Taille des lots de retrieval et mémoire
Balayez conjointement lot d’embedding, lot de nœuds et top_k : chaque levier déplace le RSS sur Apple Silicon. Montez jusqu’à swap ou compression, reculez d’un cran, figez le triplet.
- Conservez environ quinze pour cent de marge mémoire unifiée pour l’OS, le tokenizer et les métadonnées de workflow.
- Privilégiez des index compatibles mmap sur SSD rapide ; voyez le tutoriel Haystack 2 sur Mac distant si vous mixez pipelines.
- Journalisez le RSS pic par balayage pour des comparaisons hebdomadaires côté finance.
Tableau timeouts et disjoncteur (fusibles)
Publiez ce tableau à côté du graphe de workflow. Les délais client doivent dépasser légèrement les plafonds serveur pour obtenir des échecs structurés, pas des attentes infinies.
| Étape | Fusible initial | Règle disjoncteur |
|---|---|---|
| Appel HTTP outil | Huit à douze secondes pour HTTP lecture lourde. | Ouverture après trois timeouts, refroidissement trente secondes. |
| Outil subprocess | Limite d’arborescence + chien de garde vingt secondes. | Échec fermé sur code retour non nul ; pas de retry silencieux. |
| Premier jeton LLM | Budget préremplissage distinct du plafond total, propre au modèle. | Dépassement préremplissage = signal infrastructure, pas prompt. |
| Requête vectorielle | Deux à quatre fois la latence médiane du shard. | Demi-disjoncteur si la p95 dérive au-delà du garde-fou. |
Métriques d’observabilité
Émettez des spans avec workflow_name, step_id, tool_name, retrieval_batch, cache_hit, jetons, queue_depth, breaker_state. Comptabilisez timeouts par outil, ouvertures de disjoncteur et minutes de refroidissement. Joignez les attributs aux identifiants d’éval hors ligne pour un seul tableau de bord — en cohérence avec la matrice OTel GenAI.
Seuils de coût
Avant de monter en charge, plafonnez dollars par million de jetons, loyer horaire, egress et minutes GPU inactives pendant les outils lents.
- Faites échouer le soak si la latence de bout en bout p95 franchit le seuil, sauf signature produit d’un nouvel objectif.
- Inscrivez côte à côte heures de loyer et dépenses API dans le paquet d’acceptation.
- Comparez le débit à la matrice llama.cpp vs Ollama sur M4 pour les modèles partagés.
Matrice de décision
| Profil | Portable M4 local | Mac mini distant loué |
|---|---|---|
| Conception interactive | Traces courtes, faible concurrence. | Optionnel pour alimenter stable une démo. |
| Balayages nocturnes | Veille et GUI déforment les queues. | Préféré : soak non surveillé validable finance. |
| Éval parallèle | Pression mémoire unifiée partagée. | Cœurs dédiés, files isolées. |
# Variables d’environnement illustratives — secrets hors dépôt
export WORKFLOW_MAX_CONCURRENCY=2
export RETRIEVAL_BATCH_SIZE=32
export EMBED_BATCH_SIZE=16
export HTTP_TOOL_TIMEOUT_S=10
export VECTOR_QUERY_TIMEOUT_S=4
export BREAKER_THRESHOLD=3
export BREAKER_COOLDOWN_S=30
export P95_LATENCY_MS_MAX=4500
export REMOTE_SOAK_MIN_HOURS=4Étapes HowTo (résumé opérable)
- Contractualiser la boucle. Politique asyncio, exécuteurs, nombre max de workflows concurrents.
- Profiler les lots. Balayer retrieval et embeddings sur M4 jusqu’au dernier triplet RSS stable.
- Câbler les fusibles. Mapper le tableau vers outils, subprocess, premier jeton, vecteurs ; aligner les clients.
- Instrumenter. Clés stables pour disjoncteurs, timeouts, jetons.
- Noter les garde-fous coût. Somme dollars/Mjetons, loyer, egress ; échec si dépassement.
- Soak distant. Rejouer l’environnement sur Mac loué ≥ quatre heures ; archiver empreintes de manifeste.
Retour d’expérience terrain : freelance et location Mac mini M4. Pour des nuits de charge sans surprise thermique, louez un Mac distant via LlmMac plutôt que de saturer votre machine de design.
FAQ
Une seule boucle pour les embeddings ? Oui — une boucle asyncio par processus ; sérialisez le GPU ; évitez les SDK bloquants sur la boucle principale.
Taille de lot universelle ? Non — mesurez poids, index, concurrence ; transportez le dernier triplet « vert » vers l’hôte distant.
Sans compte : parcourez la page tarifs et la page d’achat, l’index du blog technique, ou le centre d’aide.
Synthèse : stabilisez asyncio, dimensionnez les lots face à la mémoire unifiée, publiez l’échelle timeouts / disjoncteur, instrumentez les spans GenAI, imposez garde-fous loyer + jetons, puis signez l’acceptation sur un soak Mac distant pour une preuve longue durée honnête.