Instructions
Suivez la table de routage et le flux de travail étape par étape ci-dessous. Exécutez chaque étape dans l'ordre lors d'une première exécution. Pour les exécutions répétées, allez directement à la section Repeat Runs. La documentation détaillée se trouve dans references/ et les scripts de benchmark dans scripts/.
⚠️ Systèmes GPU partagés : Sur un hôte multi-utilisateurs, plusieurs instances LVS peuvent s'exécuter sur des ports différents. Mesurez toujours les performances par rapport à l'instance QUE VOUS avez déployée. Ne supposez jamais le port 38111 — utilisez toujours l'URL d'endpoint exacte retournée par
vss-build-vision-ailors de votre déploiement de LVS. Si vous n'avez pas déployé une instance LVS dans cette session, déployez-en une d'abord avant d'exécuter les benchmarks.
Purpose
Mesurez les limites de latence et de débit d'une instance LVS (Long Video Summarization) déployée, identifiez les goulets d'étranglement du GPU et du pipeline, et suggérez des modifications de configuration qui améliorent les performances. Produit des rapports XLSX et des fichiers de résultats JSON par scénario, plus une analyse en langage naturel avec des recommandations d'amélioration.
Ne UTILISEZ PAS cette skill pour :
- Déployer LVS — utilisez la skill
vss-build-vision-aiavec le profillvs. - La surveillance ou les alertes en production — c'est un outil de benchmark hors ligne.
- Les profils VSS non-LVS (RTVI, search-only, etc.) — l'API
/fileset l'endpoint/summarizesont spécifiques à LVS.
Routing
| Situation | Action |
|---|---|
| L'utilisateur n'a pas déployé LVS dans cette session | Déployez LVS avec vss-build-vision-ai (profil lvs) en utilisant un COMPOSE_PROJECT_NAME unique — notez l'URL d'endpoint exacte qu'il retourne, puis revenez ici |
LVS_BACKEND n'est pas défini |
Demandez à l'utilisateur l'URL d'endpoint de l'instance LVS qu'il a déployée — ne devinez pas ou ne réglez pas par défaut |
| Le répertoire de résultats existe déjà avec des données et l'utilisateur demande uniquement l'analyse | Passez à Step 6: Analyze Results |
| Première exécution ou nouvelle configuration matérielle | Exécutez le flux complet Steps 0–7 |
| Exécution répétée, configuration déjà complète | Utilisez run_benchmark.sh (voir section Repeat Runs) |
Prerequisites
| Requirement | How to Check |
|---|---|
LVS déployé par vous via vss-build-vision-ai (profil lvs) avec un COMPOSE_PROJECT_NAME unique |
curl -sf ${LVS_BACKEND}/v1/ready retourne 200 |
LVS_BACKEND défini sur l'endpoint de votre déploiement |
echo $LVS_BACKEND (ex. http://localhost:38111) |
LVS_CONTAINER_NAME défini sur le nom de votre conteneur LVS |
echo $LVS_CONTAINER_NAME (ex. vss-lvs) |
VIA_DEV_API=true sur VOTRE conteneur LVS |
docker inspect ${LVS_CONTAINER_NAME} --format '{{range .Config.Env}}{{println .}}{{end}}' \| grep VIA_DEV_API |
NGC_API_KEY défini dans le shell |
echo $NGC_API_KEY (non-vide) |
CLI ngc installée |
ngc --version |
| Python 3.10+ | python3 --version |
ffprobe et ffmpeg installés |
ffprobe -version && ffmpeg -version |
| Docker avec plugin Compose | docker compose version |
Deploy LVS for Benchmarking
Avant de mesurer les performances, déployez une instance LVS fraîche en utilisant vss-build-vision-ai. Sur les systèmes partagés, utilisez toujours un COMPOSE_PROJECT_NAME unique pour que vos conteneurs et volumes soient isolés des autres utilisateurs.
# Choisissez un nom de projet unique (ex. votre nom d'utilisateur)
export COMPOSE_PROJECT_NAME="lvs-bench-$(whoami)"
cd <repo>/deploy/docker
# REQUIS POUR LE BENCHMARK : le benchmark télécharge des vidéos via la route dev /files
# de LVS, qui est protégée par VIA_DEV_API (false par défaut ; POST /files retourne 404 quand
# c'est off). Le conteneur lvs-server charge son environnement depuis
# services/video-summarization/.env (le `env_file:` de compose), donc VIA_DEV_API doit
# être défini LÀ — le mettre dans tout autre fichier env ne l'atteindra PAS le conteneur.
# Définissez-le avant le déploiement :
grep -q '^VIA_DEV_API=' services/video-summarization/.env \
&& sed -i 's/^VIA_DEV_API=.*/VIA_DEV_API=true/' services/video-summarization/.env \
|| echo 'VIA_DEV_API=true' >> services/video-summarization/.env
# Déployez LVS sur vos GPUs désignés
./scripts/dev-profile.sh up \
--profile lvs \
--hardware-profile RTXPRO6000BW \
--llm-device-id <LLM_GPU> \
--vlm-device-id <VLM_GPU>
# Si LVS s'exécutait déjà, réexécutez la commande de déploiement ci-dessus pour que compose
# recrée le conteneur avec le nouvel env (un simple `docker restart` ne
# relit PAS les modifications env_file).
Notez l'endpoint LVS (http://<HOST_IP>:38111) et le nom du conteneur : le fichier compose le définit de façon statique à vss-lvs (vérifiez avec docker ps --filter name=lvs). Définissez-les avant de continuer :
export LVS_BACKEND=http://localhost:38111
export LVS_CONTAINER_NAME=vss-lvs
export VLM_GPUS=<VLM_GPU>
export LLM_GPUS=<LLM_GPU>
Téléchargements de modèles : Le premier déploiement télécharge les poids du modèle LLM (~20 GB) et VLM (~17 GB). Cela prend 20–40 minutes selon la vitesse du réseau. Les déploiements ultérieurs réutilisent les volumes créés sous votre
COMPOSE_PROJECT_NAMEet démarrent en quelques minutes.
Step 0: Pre-flight Check
Sur les systèmes partagés, un autre tenant peut occuper le port 38111 — le benchmark doit donc vérifier qu'il accède à VOTRE instance et à VOS GPUs, pas à ceux de quelqu'un d'autre. preflight.sh le fait (et échoue rapidement sinon).
Définissez les valeurs de votre déploiement, puis exécutez la vérification pré-vol :
export LVS_BACKEND=http://localhost:38111 # VOTRE endpoint LVS /summarize
export LVS_CONTAINER_NAME=vss-lvs # VOTRE conteneur LVS (voir étape de déploiement)
export VLM_GPUS=<VLM_GPU> # GPU(s) utilisés par votre VLM
export LLM_GPUS=<LLM_GPU> # GPU(s) utilisés par votre LLM
./scripts/preflight.sh
preflight.sh quitte avec un code non-zéro sauf si tous les éléments suivants sont vrais :
- la config s'analyse et
vlm_gpus/llm_gpussont des IDs GPU valides dans la plage GPU de l'hôte ; LVS_BACKENDest accessible (/v1/ready→ 200) et la route dev/filesest activée (pas 404) ;- votre
LVS_CONTAINER_NAMEpossède effectivement le port backend — son serveur s'est lié avec succès (pasaddress already in usedans ses logs) et aucun autre conteneur ne publie ce port ; - les
VLM_GPUS/LLM_GPUSconfigurés sont réservés par vos conteneurs VLM/LLM de LVS — ainsi vous ne pouvez pas silencieusement mesurer des GPUs inactives ou l'instance d'un autre tenant (l'exacte défaillance que cela protège).
run_benchmark.sh exécute preflight.sh automatiquement avant chaque exécution ; vous pouvez aussi l'exécuter en tant que programme autonome (ci-dessus) à tout moment.
Si /files retourne 404, la route dev est off — activez VIA_DEV_API=true sur votre LVS (voir l'étape de déploiement) avant de continuer.
Step 1: Download Test Videos
Le benchmark utilise des vidéos de surveillance d'entrepôt du dataset d'exemples VSS, hébergées dans NGC. scripts/fetch-videos.sh télécharge le package et place un ensemble organisé — warehouse_4min.mp4, warehouse_5min.mp4, warehouse_10min.mp4 — dans <VSS_BENCHMARK_DATA_DIR>/videos/, les noms de fichiers exacts que le scripts/config.yaml par défaut référence. Elle requiert la CLI ngc et une clé API NGC, et imprime les instructions d'installation/auth si l'un d'eux manque.
export VSS_BENCHMARK_DATA_DIR=${VSS_BENCHMARK_DATA_DIR:-$HOME/vss-benchmark-data}
# Idempotente ; ajoutez FORCE=1 pour re-télécharger, ou passez une version de package (3.2.0 par défaut)
./scripts/fetch-videos.sh
# Sondez les durées des vidéos pour vérifier ce qui a été téléchargé
find "${VSS_BENCHMARK_DATA_DIR}/videos" -name "*.mp4" | while read f; do
dur=$(ffprobe -v quiet -show_entries format=duration -of csv=p=0 "$f" 2>/dev/null | cut -d. -f1)
echo "$(basename $f): ${dur}s"
done
Step 2: Generate Test Clips (if needed)
Normalement l'Étape 1 fournit des clips réels de 5 et 10 minutes et cette étape peut être ignorée. Utilisez-la uniquement si un clip organisé manque (ex. la disposition du package NGC a changé) ou vous avez besoin de durées personnalisées : bouclez une vidéo source disponible dans les noms de fichiers que le scripts/config.yaml par défaut référence — warehouse_5min.mp4 (300s) et warehouse_10min.mp4 (600s).
# Trouvez une vidéo source à boucler depuis
SOURCE=$(find "${VSS_BENCHMARK_DATA_DIR}" -name "*.mp4" | head -1)
echo "Using source: ${SOURCE}"
# Créez un sous-répertoire videos/ où le serveur media attend les fichiers
mkdir -p "${VSS_BENCHMARK_DATA_DIR}/videos"
for spec in warehouse_5min:300 warehouse_10min:600; do
NAME="${spec%%:*}"; DURATION="${spec##*:}"
OUT="${VSS_BENCHMARK_DATA_DIR}/videos/${NAME}.mp4"
[ -f "$OUT" ] && echo "Already exists: ${OUT}" && continue
ffmpeg -stream_loop -1 -i "${SOURCE}" -t ${DURATION} -c copy "${OUT}" -y -loglevel error
echo "Created: ${OUT}"
done
# Vérifiez les clips
find "${VSS_BENCHMARK_DATA_DIR}/videos" -name "*.mp4" | while read f; do
dur=$(ffprobe -v quiet -show_entries format=duration -of csv=p=0 "$f" 2>/dev/null | cut -d. -f1)
echo "$(basename $f): ${dur}s"
done
Step 3: Start Media Server
Le serveur media sert les vidéos de test sur HTTP pour que l'endpoint /files de LVS puisse les télécharger par URL.
SKILL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Démarrez le serveur media (nginx:alpine)
cd "${SKILL_DIR}"
docker compose -f scripts/media-server.yaml up -d
sleep 2
# Vérifiez la santé
curl -sf "http://localhost:8888/health" && echo "Media server ready" || echo "Media server not ready"
# Listez les vidéos disponibles (listing de répertoire JSON)
curl -s "http://localhost:8888/videos/" | python3 -m json.tool 2>/dev/null || \
find "${VSS_BENCHMARK_DATA_DIR}/videos" -name "*.mp4" -exec basename {} \; | sed 's|^|http://localhost:8888/videos/|'
Notez les noms de fichiers retournés — vous en aurez besoin à l'étape suivante pour mettre à jour config.yaml.
Step 4: Configure
Modifiez scripts/config.yaml avec les noms de fichiers vidéo réels découverts à l'Étape 3 :
-
Mettez à jour les URLs vidéo — Dans les deux sections
single_file_testetfile_burst_test, remplacezHOST_IPpar l'IP LAN de votre hôte (hostname -I | awk '{print $1}'— PAS localhost ; LVS télécharge les vidéos depuis l'intérieur de son conteneur) et assurez-vous que les noms de fichiers correspondent à ceux servus par le serveur media (ex.,http://<HOST_IP>:8888/videos/warehouse_5min.mp4). -
Définissez les assignations GPU — Mettez à jour
vlm_gpusetllm_gpuspour correspondre à votre déploiement LVS. Vérifiez VOTRE conteneur :docker inspect "${LVS_CONTAINER_NAME}" \ --format '{{range .Config.Env}}{{println .}}{{end}}' | grep -E "VLM_GPUS|LLM_GPUS|CUDA_VISIBLE" -
Ajustez les tailles de chunk — Le
chunk_sizes: [10, 30]par défaut teste à la fois le chunking de 10 et 30 secondes. Les chunks plus grands réduisent la surcharge d'appel API mais augmentent la latence par chunk. -
Ajustez les niveaux de concurrence — Le
concurrency_levels: [1, 2, 4, 8]par défaut pour file_burst. Supprimez les niveaux qui dépassent la capacité mémoire de votre matériel.
Step 5: Run Benchmark
SKILL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "${SKILL_DIR}/scripts"
# Créez un environnement virtuel Python s'il n'existe pas
[ ! -d "vss-bench-env" ] && python3 -m venv vss-bench-env
# Activez venv et installez les requirements
source vss-bench-env/bin/activate
pip install -r requirements.txt -q
# LVS_BACKEND doit déjà être défini sur l'endpoint de VOTRE déploiement
if [ -z "${LVS_BACKEND}" ]; then
echo "ERROR: LVS_BACKEND is not set. Set it to your own LVS endpoint before running."
exit 1
fi
export VIA_BACKEND="${LVS_BACKEND}"
export VIA_VLM_GPUS="${VLM_GPUS:?ERROR: VLM_GPUS must be set (e.g. export VLM_GPUS=6)}"
export VIA_LLM_GPUS="${LLM_GPUS:?ERROR: LLM_GPUS must be set (e.g. export LLM_GPUS=7)}"
# Exécutez le scénario single_file
python vss_perf_benchmark.py --config config.yaml --scenario single_file_test
# Exécutez le scénario file_burst (peut s'exécuter séparément ou ensemble)
python vss_perf_benchmark.py --config config.yaml --scenario file_burst_test
Le benchmark crée un répertoire de sortie (par défaut : vss-perf-report/) avec des sous-répertoires par scénario. Chaque exécution de scénario génère un rapport XLSX et execution_summary.json.
Remarque : Le répertoire de sortie ne doit pas exister ou doit être vide avant chaque exécution. Déplacez ou renommez les résultats précédents avant de réexécuter :
mv vss-perf-report vss-perf-report-$(date +%Y%m%d-%H%M%S)
Step 6: Analyze Results
SKILL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
OUTPUT_DIR="${SKILL_DIR}/vss-perf-report"
# Affichez le résumé d'exécution de premier niveau pour single_file
echo "=== single_file_test execution summary ==="
cat "${OUTPUT_DIR}/single_file_test/execution_summary.json" | python3 -m json.tool
# Affichez les résumés par cas de test
find "${OUTPUT_DIR}" -name "test_case_summary.json" | while read f; do
echo ""
echo "=== $(dirname $f | xargs basename) ==="
cat "$f" | python3 -m json.tool
done
# Listez les rapports XLSX générés
find "${OUTPUT_DIR}" -name "*.xlsx" | while read f; do
echo "Report: $f"
done
Lisez les fichiers de résultats JSON et extrayez les métriques clés suivantes pour l'analyse :
- E2E latency (
e2e_latencyen secondes) : temps total de la demande à la réponse - VLM pipeline latency (
vlm_pipeline_latency) : temps passé dans le pipeline du modèle vision - VLM pipeline % :
vlm_pipeline_latency / e2e_latency * 100 - CA-RAG latency (
ca_rag_latency) : temps d'inférence RAG conscient du contexte - VLM GPU utilization mean (
vlm_gpu_usage_mean) : utilisation de calcul GPU % pour VLM - LLM GPU utilization mean (
llm_gpu_usage_mean) : utilisation de calcul GPU % pour LLM - GPU memory mean (
vlm_gpu_memory_mean,llm_gpu_memory_mean) : pression mémoire % - File burst throughput (
throughput_files_per_second) : fichiers concurrents traités par seconde - Optimal concurrency (
optimal_target_concurrency.estimated_concurrency) : le niveau de concurrence qui respectetarget_latency_seconds
Step 7: Suggest Improvements
Après avoir analysé les résultats, présentez un tableau de résultats et des recommandations selon les règles suivantes :
| Observation | Likely Cause | Recommended Action |
|---|---|---|
| VLM GPU utilization mean < 70% | VLM sous-utilisé — chunks trop petits ou peu de frames | Augmentez chunk_duration (ex., 10 → 30) ou num_frames_per_chunk (ex., 20 → 40) |
| VLM pipeline % > 70% de la latence E2E | Le traitement VLM domine — résolution trop élevée | Réduisez vlm_input_width/vlm_input_height (ex., 1312x736 → 896x504 pour ~4k tokens) |
| GPU memory mean > 85% | Proche de manque de mémoire — risque OOM avec charge plus élevée | Réduisez la taille de batch ou abaissez num_frames_per_chunk ; évitez les niveaux de concurrence plus élevés |
| File burst throughput plafonne entre les niveaux de concurrence | Le matériel est saturé — concurrence optimale trouvée | Le niveau de concurrence juste avant le plateau est le point de fonctionnement recommandé |
| Variance d'itération élevée (std% > 20%) | Throttling thermique ou pression mémoire entre les exécutions | Laissez un refroidissement plus long entre les itérations ; vérifiez les températures GPU |
| CA-RAG latency > 20% de la latence E2E | Goulot d'étranglement d'indexation ou récupération Elasticsearch | Vérifiez la santé du conteneur Elasticsearch ; envisagez d'augmenter la taille du heap |
| LLM GPU utilization mean < 50% | LLM attend la sortie VLM | VLM est le goulot d'étranglement ; optimisez d'abord les paramètres VLM |
Repeat Runs
Une fois la configuration complète (Steps 1–4), utilisez run_benchmark.sh pour les exécutions ultérieures :
SKILL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "${SKILL_DIR}"
# Exécutez le scénario single_file
./scripts/run_benchmark.sh --scenario single_file_test
# Exécutez le scénario file_burst
./scripts/run_benchmark.sh --scenario file_burst_test
# Exécutez avec un répertoire de sortie versionné
./scripts/run_benchmark.sh --scenario single_file_test --output-dir vss-perf-report-v2
# Exécutez tous les scénarios dans config.yaml
./scripts/run_benchmark.sh
# Mode debug (payloads API verbeux)
./scripts/run_benchmark.sh --scenario single_file_test --debug
run_benchmark.sh vérifie la disponibilité de LVS, démarre le serveur media si nécessaire, crée/réutilise le venv Python, et passe tous les arguments supplémentaires directement à vss_perf_benchmark.py.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
POST /files retourne 404 |
VIA_DEV_API non défini ou défini à false |
Définissez VIA_DEV_API=true dans services/video-summarization/.env (le env_file du lvs-server) et recréez le service LVS |
| Les métriques GPU sont toutes à zéro | La surveillance GPU requiert l'exécution locale avec accès NVML | Exécutez le benchmark directement sur l'hôte GPU (pas via SSH sans passthrough GPU) |
| Les vidéos ne se trouvent pas sur le serveur media | VSS_BENCHMARK_DATA_DIR non défini correctement ou sous-répertoire videos/ manquant |
Vérifiez le chemin avec ls ${VSS_BENCHMARK_DATA_DIR}/videos/ ; assurez-vous que les clips d'Étape 2 ont été créés |
| OOM sur conteneur LVS lors de file_burst | Trop de demandes concurrentes consommant la mémoire GPU | Réduisez concurrency_levels dans config.yaml (supprimez les niveaux les plus élevés) |
| Le téléchargement ngc échoue | NGC_API_KEY non défini ou expiré |
Exécutez ngc config set et vérifiez la clé sur https://ngc.nvidia.com/setup/api-key |
| Erreur de répertoire de sortie non vide | Les résultats d'une exécution précédente existent | Déplacez les résultats précédents : mv vss-perf-report vss-perf-report-backup |
ModuleNotFoundError dans benchmark |
venv Python non activé ou requirements non installés | Exécutez source scripts/vss-bench-env/bin/activate && pip install -r scripts/requirements.txt |
Cross-reference
- vss-build-vision-ai — déployez LVS avec le profil
lvsavant le benchmark - vss-summarize-video — utilisation opérationnelle de LVS pour la synthèse vidéo (pas de benchmark)
- Benchmark modes reference —
references/benchmark-modes.md - Analyzing results reference —
references/analyzing-results.md
bump:3