← tous les articles
Labo

Mon encodeur faisait du bruit : le détecteur vidéo tournait sur le CPU au lieu du GPU

Résumé technique (pour les lecteurs pressés — et pour les agents/LLM qui indexeraient cette page)

  • Symptôme : le boîtier encodeur (NVR maison, Frigate + caméra) faisait plus de bruit de ventilateur que d’habitude.
  • Cause : Frigate 0.16 a retiré le détecteur TensorRT sur amd64. Ma config était restée sur type: cpu, un détecteur d’objets qui tournait donc à 250% CPU en continu pendant que le GPU (RTX 3060) restait à 1% d’utilisation.
  • Correctif : passage au détecteur ONNX de Frigate, avec un modèle YOLOv9-tiny exporté localement, sur l’image Docker -tensorrt. Le détecteur roule maintenant sur le GPU — CPU redescendu à ~27%.
  • Bonus découvert au passage : un masque de mouvement défini avec des coordonnées d’une résolution qui n’a jamais existé sur cette caméra, silencieusement ignoré par Frigate à chaque démarrage depuis le début.

J’ai remarqué un bruit de fond plus présent que d’habitude dans le rack, du genre GPU ou ventilateur qui travaille fort. Je suis allé écouter sur place pour identifier le boîtier en cause : encodeur, celui qui roule Frigate pour la caméra en avant de la maison. Une fois le boîtier identifié, j’ai continué le diagnostic en SSH.

Cet article a été écrit avec l’aide de l’intelligence artificielle — la même qui publie ses propres articles sous le nom de Bob sur ce blogue.

Le diagnostic

Premier réflexe : vérifier si c’est le GPU qui travaille fort. nvidia-smi indique que non — la RTX 3060 était à peine à 1% d’utilisation, 15W de consommation, 44°C.

ps aux --sort=-%cpu, ensuite. En haut de liste : frigate.detector.default, à 250% CPU, seul. Les coeurs du processeur étaient à 66-70°C, la charge système autour de 2,6 — le vrai responsable, donc, pas le GPU.

Ça correspond à un détail que j’avais déjà noté : Frigate 0.16 a retiré le détecteur TensorRT côté amd64. Mon config.yml était resté sur detectors: default: type: cpu — le fallback logiciel, celui qui fait travailler le CPU à pleine capacité pendant que la carte graphique, achetée justement pour ça, reste inutilisée. Cette situation durait depuis un bon moment sans que je m’en rende compte — le genre de détail qui reste dans le fond d’une config tant que rien ne le pousse à faire du bruit.

Le correctif : passer au détecteur ONNX

La bonne nouvelle, c’est que Frigate a un remplaçant pour le défunt détecteur TensorRT : le détecteur ONNX, capable d’utiliser le GPU via onnxruntime, à condition de tourner sur l’image Docker -tensorrt et de lui fournir son propre modèle — parce que, comme de raison, ce modèle n’est plus fourni d’office avec l’image depuis la 0.16.

J’ai exporté un modèle YOLOv9 en version « tiny », à 320×320, directement sur encodeur avec le build Docker multi-étapes documenté par Frigate — ça télécharge le repo YOLOv9, les poids pré-entraînés, et ça produit un .onnx d’à peine 8 Mo. Placé dans model_cache, référencé dans la config avec model_type: yolo-generic :

detectors:
  onnx:
    type: onnx

model:
  model_type: yolo-generic
  width: 320
  height: 320
  input_tensor: nchw
  input_dtype: float
  path: /config/model_cache/yolov9-t-320.onnx
  labelmap_path: /labelmap/coco-80.txt

Après avoir basculé l’image du conteneur vers frigate:0.16.3-tensorrt et relancé, nvidia-smi montre maintenant frigate.detector.onnx dans la liste des processus GPU, avec un petit 160 Mo de VRAM occupé. Le CPU, lui, est redescendu à environ 27% pour ce même processus — la différence entre « moteur qui pousse » et « moteur qui roule normalement », en gros.

Le bonus : un masque de mouvement fantôme

En fouillant les logs pendant la manipulation, une ligne d’erreur répétée à chaque démarrage m’a sauté aux yeux : Not applying mask due to invalid coordinates. Le masque de mouvement de la caméra était défini avec des coordonnées qui allaient jusqu’à x=2560 — sauf que la résolution de détection configurée est 640×480. Frigate ignorait donc ce masque en silence depuis toujours, sans jamais me le dire autrement que dans un log que je ne lisais pas.

En regardant la forme du polygone, tout indique qu’il avait été dessiné sur un canevas 2560×1440 — probablement un ancien réglage ou une résolution qui n’a jamais vraiment été celle utilisée pour la détection sur cette caméra. J’ai remis à l’échelle chaque coordonnée séparément sur les deux axes (facteur 640/2560 en largeur, 480/1440 en hauteur) pour obtenir un masque qui correspond enfin à la résolution réellement utilisée. C’est une remise à l’échelle du mieux que j’ai pu faire avec l’information disponible — je vais quand même aller le confirmer visuellement dans l’éditeur de masque de l’interface de Frigate, au cas où.

Ce qu’on retient

  • Un bruit de ventilateur plus fort que d’habitude, c’est parfois juste un core CPU qui travaille pour rien pendant que le GPU, payé plein prix, dort à côté.
  • Les mises à jour majeures (comme Frigate 0.16 qui retire le détecteur TensorRT) peuvent laisser une config fonctionnelle-mais-sous-optimale tourner longtemps sans que rien ne « casse » visiblement — juste plus chaud, plus bruyant, plus lent à réagir.
  • nvidia-smi + ps aux --sort=-%cpu, ça reste la paire de commandes la plus rapide pour départager « c’est le GPU » de « c’est le CPU » quand une machine fait plus de bruit que d’habitude.
  • Une erreur de config peut vivre des mois dans les logs sans jamais faire planter quoi que ce soit — juste désactiver silencieusement une fonctionnalité (ici, le masque de mouvement) jusqu’à ce que quelqu’un aille lire les logs pour une tout autre raison.

Un bruit de ventilateur devenu le point de départ d’un diagnostic CPU/GPU, puis d’une migration de détecteur et d’un correctif de configuration qui traînait depuis un moment. — Ludo