deepstream-import-vision-model

Par nvidia · skills

Utilisez cette skill pour intégrer n'importe quel modèle de vision depuis HuggingFace ou NVIDIA NGC dans un pipeline NVIDIA DeepStream avec une automatisation de bout en bout : téléchargement ONNX, export SafeTensors, compilation du moteur TRT, parser bbox nvinfer personnalisé, benchmark multi-flux et rapport PDF. Modèles de détection d'objets uniquement.

npx skills add https://github.com/nvidia/skills --skill deepstream-import-vision-model

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

  1. Nommage du moteur — toujours {model}_dynamic_b{MAX_BS}.engine. Jamais model_dynamic.engine seul.
  2. batch_size == num_streams — dans les exécutions DS, batch-size et le nombre de flux sont toujours égaux.
  3. Les noms de fichiers journaux sont fixestrtexec_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.
  4. Parser zéro-init — toujours NvDsInferObjectDetectionInfo obj = {};. Obligatoire pour le support OBB DS 9.0 ; un bare obj; laisse rotation_angle non initialisé, causant des boîtes englobantes inclinées.
  5. 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%.
  6. Venv partagébuild/.venv_optimum réutilisé sur tous les modèles. Ne jamais créer de venvs par modèle.
  7. trtexec --noDataTransfers — le calcul GPU seul correspond au flux de données GPU-vers-GPU de DeepStream.
  8. 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 appeler wkhtmltopdf directement.
  9. Détection d'objets uniquement — rejeter les architectures non-détection de config.json avant de construire quoi que ce soit.
  10. Fallback encodeur (OBLIGATOIRE)x264enc et openh264enc sont interdits. Sur les systèmes où NVENC n'est pas disponible, utiliser theoraenc + oggmux (LGPL ; livré dans gst-plugins-base ; sortie est .ogv). Si theoraenc/oggmux sont absents, sauter la création vidéo (DS_SINGLE_STREAM_MODE=skipped). Rapporter quel mode a été utilisé : nvv4l2h264enc / theoraenc-fallback / skipped.
  11. Source vidéo (OBLIGATOIRE) — la valeur par défaut est toujours sample_720p.mp4 (1280×720). Ne jamais remplacer de manière autonome par sample_1080p_h264.mp4 ou tout autre fichier. Utiliser une vidéo différente uniquement quand l'utilisateur fournit explicitement un chemin (via variable d'environnement DS_VIDEO ou 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)

  1. benchmark_report.md — source markdown (12 sections obligatoires)
  2. benchmark_report.html — HTML stylisé (graphiques base64-inlined, pas d'accès fichier local)
  3. benchmark_report_{model_name}.pdf — via md-to-html-pdf.py ; vérifier que les graphiques sont intégrés en comptant les occurrences de data:image/png dans la sortie HTML : grep -o 'data:image/png' benchmark_report.html | wc -l doit é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

Skills similaires