Modèle de Vision Import DeepStream
Quand cette skill est active, lisez le document de référence pertinent avant de commencer chaque phase. Ne vous fiez pas à la mémoire — les documents de référence contiennent les chemins de scripts exacts, les conventions de variables bash, les contrats de noms de fichiers journaux, et les règles d'analyse critiques.
Portée actuelle : Modèles de détection d'objets uniquement. Échouez rapidement sur la classification, la segmentation ou autres architectures détectées dans config.json.
Aperçu du Pipeline
| Étape | Phase | Référence | Ce qu'elle fait |
|---|---|---|---|
| 1–3 | Model Acquire | references/model-acquire.md | Parcourir HF/NGC, détecter le format, télécharger ONNX ou exporter SafeTensors |
| 4–5 | Engine Build | references/engine-build.md | Construire un moteur TRT dynamique, exécuter trtexec BS=1 et BS=MAX_BS |
| 6–7 | DS Pipeline | references/pipeline-run.md | Parseur bbox personnalisé, config nvinfer, benchmarks monoflux + multiflux |
| 8 | Report | references/report-generation.md | 5 graphiques, rapport de benchmark HTML, PDF |
Exécutez le pipeline complet de manière autonome sans pause pour confirmation à chaque étape.
Contrôles de Pré-vol
À exécuter avant de commencer :
# 1. GPU et pilotes
nvidia-smi
# 2. Correspondance de version TensorRT (doit correspondre entre le builder et le runtime DS)
trtexec 2>&1 | head -3
dpkg -l | grep libnvinfer-bin
# 3. Venv Python partagé — créer une fois, réutiliser sur tous les modèles
mkdir -p build
VENV=build/.venv_optimum
if [ ! -x "$VENV/bin/python3" ]; then
python3 -m venv "$VENV"
"$VENV/bin/pip" install --upgrade pip -q
"$VENV/bin/pip" install "optimum[exporters]>=1.20,<2.0" "torch<2.12" \
transformers onnxruntime matplotlib numpy markdown -q
fi
# 4. Outils système
which wkhtmltopdf || apt-get install -y wkhtmltopdf
which mediainfo || apt-get install -y mediainfo
which deepstream-app # obligatoire pour dump KITTI (Étape 6g) et mesure perf benchmark (Étape 7c); livré avec SDK DeepStream
# 5. Vidéo d'exemple — vérifier uniquement le chemin par défaut si l'utilisateur n'a pas fourni de DS_VIDEO personnalisé
if [ -z "$DS_VIDEO" ]; then
[ -f /opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.mp4 ] || \
echo "ATTENTION : sample_720p.mp4 non trouvé. Installez les exemples DeepStream ou définissez DS_VIDEO=/path/to/your.mp4"
fi
Structure de Sortie Obligatoire
Créer une fois que MODEL_NAME est connu (Étape 1). Ne jamais mettre les fichiers à plat.
models/{model_name}/
model/ <- Fichier(s) ONNX
parser/ <- .cpp, Makefile, .so
config/ <- config nvinfer, config ds-app, labels.txt
scripts/ <- scripts d'aide à l'exécution
benchmarks/
engines/ <- _dynamic_b{MAX_BS}.engine, timing.cache, logs de build
b1/ <- log trtexec BS=1
b{MAX_BS}/ <- log trtexec BS=MAX_BS
ds/ <- logs benchmark DS
reports/ <- benchmark_report.md, .html, .pdf, benchmark_data.json
charts/ <- chart_*.png (5 graphiques)
samples/ <- sortie .mp4 ou .ogv (fallback theoraenc), frames de test
kitti_output/ <- fichiers .txt détection KITTI
mkdir -p models/$MODEL_NAME/{model,parser,config,scripts,benchmarks/engines,benchmarks/ds,reports/charts,samples/kitti_output}
Règles Critiques
- Nommage du moteur — toujours
{model}_dynamic_b{MAX_BS}.engine. Jamaismodel_dynamic.engineseul. - batch_size == num_streams — dans les exécutions DS,
batch-sizeet le nombre de flux sont toujours égaux. - Les noms de fichiers journaux sont fixes —
trtexec_b1.log,trtexec_b${MAX_BS}.log,ds_s${N}_run1.log,ds_s${N}_run2.log. Pas d'horodatages. La génération de rapport lit les chemins exacts. - Parser zéro-init — toujours
NvDsInferObjectDetectionInfo obj = {};. Obligatoire pour le support OBB DS 9.0 ; un bareobj;laisserotation_anglenon initialisé, causant des boîtes englobantes inclinées. - Porte de validation KITTI — ne PAS procéder à l'Étape 7 si le nombre de frames KITTI est zéro ou taux de détection < 90%.
- Venv partagé —
build/.venv_optimumréutilisé sur tous les modèles. Ne jamais créer de venvs par modèle. - trtexec
--noDataTransfers— le calcul GPU seul correspond au flux de données GPU-vers-GPU de DeepStream. - Rapport HTML+PDF — toujours utiliser
skills/deepstream-import-vision-model/scripts/report/md-to-html-pdf.py. Ne jamais écrire un générateur HTML personnalisé ni appelerwkhtmltopdfdirectement. - Détection d'objets uniquement — rejeter les architectures non-détection de
config.jsonavant de construire quoi que ce soit. - Fallback encodeur (OBLIGATOIRE) —
x264encetopenh264encsont interdits. Sur les systèmes où NVENC n'est pas disponible, utilisertheoraenc + oggmux(LGPL ; livré dans gst-plugins-base ; sortie est.ogv). Sitheoraenc/oggmuxsont absents, sauter la création vidéo (DS_SINGLE_STREAM_MODE=skipped). Rapporter quel mode a été utilisé :nvv4l2h264enc/theoraenc-fallback/skipped. - Source vidéo (OBLIGATOIRE) — la valeur par défaut est toujours
sample_720p.mp4(1280×720). Ne jamais remplacer de manière autonome parsample_1080p_h264.mp4ou tout autre fichier. Utiliser une vidéo différente uniquement quand l'utilisateur fournit explicitement un chemin (via variable d'environnementDS_VIDEOou argument de script).
Chronométrage du Pipeline
Encapsuler chaque étape :
STEP_START=$(date +%s.%N)
# ... commandes d'étape ...
STEP_END=$(date +%s.%N)
STEP_DURATION=$(echo "$STEP_END - $STEP_START" | bc)
echo "[Étape N] complétée en ${STEP_DURATION}s"
Suivre PIPELINE_START (avant Étape 1) et PIPELINE_END (après Étape 8). Rapporter toutes les durées dans le rapport de benchmark.
Sortie Rapport (OBLIGATOIRE — les 3 formats)
benchmark_report.md— source markdown (12 sections obligatoires)benchmark_report.html— HTML stylisé (graphiques base64-inlined, pas d'accès fichier local)benchmark_report_{model_name}.pdf— viamd-to-html-pdf.py; vérifier que les graphiques sont intégrés en comptant les occurrences dedata:image/pngdans la sortie HTML :grep -o 'data:image/png' benchmark_report.html | wc -ldoit égaler 5
Exécuter les scripts de graphiques et rapport avec le venv partagé actif : source build/.venv_optimum/bin/activate.
Documents de Référence
IMPORTANT : Lisez la référence pertinente avant de commencer chaque phase. NE PAS générer de code de mémoire.
| Document | Utiliser quand |
|---|---|
| references/model-acquire.md | Étapes 1–3 : analyse URL HF/NGC, détection de format, téléchargement ONNX, export SafeTensors, extraction de labels |
| references/engine-build.md | Étapes 4–5 : build moteur trtexec, benchmarks, dérivation PEAK_GPU_STREAMS, scaling itératif |
| references/pipeline-run.md | Étapes 6–7 : parseur bbox personnalisé, config nvinfer, validation monoflux, dump KITTI, benchmark multiflux |
| references/report-generation.md | Étape 8 : benchmark_data.json, 5 graphiques, rapport markdown 12-sections, HTML + PDF |
Scripts
Situés dans scripts/.
| Script | Phase | Objectif |
|---|---|---|
model/hf-list-files.sh |
1–3 | Lister fichiers repo HuggingFace |
model/hf-download-config.sh |
1–3 | Télécharger config.json depuis HF |
model/ngc-list-files.sh |
1–3 | Lister fichiers modèle NGC |
model/ngc-download.sh |
1–3 | Télécharger archive modèle NGC |
model/safetensors-to-onnx.sh |
1–3 | Exporter SafeTensors → ONNX via optimum-cli |
model/inspect-onnx.py |
1–5 | Inspecter formes entrée/sortie ONNX |
model/make-static-batch-onnx.py |
4–5 | Bake dimension batch dans ONNX |
model/cleanup.sh |
Quelconque | Supprimer répertoires staging, préserver venv partagé |
engine/benchmark-trtexec.sh |
4–5 | Exécuter trtexec avec flags standard |
deepstream/ds-single-stream.sh |
6–7 | Validation visuelle monoflux (NVENC principal ; fallback theoraenc+oggmux ; ignorer si aucun) |
deepstream/ds-sweep.sh |
6–7 | Sweep taille batch 2-phases |
deepstream/benchmark-ds.sh |
6–7 | Benchmark DS flux fixe |
deepstream/ds-kitti-dump.sh |
6–7 | Dump détection KITTI via deepstream-app |
deepstream/ds-perf-run.sh |
7 | Benchmark deux-runs Étape 7c — encapsule deepstream-app avec enable-perf-measurement=1, écrit log nom-fixe pour parser rapport |
deepstream/extract-frame.sh |
6–7 | Extraire frames exemple de vidéo sortie (chemin NVENC .mp4 ou fallback theoraenc .ogv) |
report/generate-benchmark-charts.py |
8 | Générer 5 graphiques benchmark PNG |
report/md-to-html-pdf.py |
8 | Markdown → HTML stylisé → PDF (chemin rapport benchmark canonique) |
report/md-to-pdf.sh |
Quelconque | Markdown → PDF via pandoc/pdflatex — pour docs design et références uniquement, NON pour rapports benchmark (utiliser md-to-html-pdf.py pour ceux-ci) |
report/report-style.css |
8 | CSS pour rapport HTML |
report/render-mermaid-for-pdf.py |
8 | Diagramme Mermaid → PNG |
report/mermaid-puppeteer.json |
8 | Config Puppeteer Mermaid validée (sandboxed ; non-root) |
report/mermaid-puppeteer-root.json |
8 | Config Puppeteer Mermaid validée (utilisée au lancement en root) |
Référence Rapide Erreurs
| Erreur | Correction |
|---|---|
| Boîtes englobantes inclinées/diagonales | Struct parser non zéro-initialisée — utiliser NvDsInferObjectDetectionInfo obj = {}; |
| Zéro fichier KITTI | gie-kitti-output-dir non lu par nvinfer — utiliser ds-kitti-dump.sh (encapsule deepstream-app) |
| Rebuilds moteur à chaque run DS | Chemin model-engine-file erroné — vérifier chemin relatif depuis répertoire config/ |
setDimensions dims négatifs |
Ajouter infer-dims=3;H;W à config nvinfer pour modèles ONNX dynamiques |
--memPoolSize workspace 0,03 MiB |
Utiliser suffixe M pas MiB — ex. --memPoolSize=workspace:32768M |
| Échec build ForeignNode (DETR) | Utiliser chemin export dynamo ou exécuter onnxsim — voir references/engine-build.md |
| Zéro détections | Mauvais net-scale-factor — vérifier tableau famille modèles dans references/pipeline-run.md |
No module named 'pyservicemaker' |
Installer dans venv : pip install /opt/nvidia/deepstream/.../pyservicemaker*.whl |