Знакът на КАГАМИ КАГАМИ
kagami.bg/academy · lesson · machine-readable viewUPDATED 2026-10-03
IDENTITY
module
GX10-04-123 · Multi-camera video analytics with NVIDIA DeepStream 9.1 in a container
series
GX10 (local AI server class: NVIDIA GB10, e.g. ASUS Ascent GX10 / DGX Spark)
level
Advanced
duration
about 2 h
prerequisites
A GB10-class machine with DGX OS (Ubuntu, Arm64), shell access, Docker with the NVIDIA container runtime (preinstalled on DGX Spark per NVIDIA), the gettext envsubst tool, optional RTSP cameras (the first test uses the sample video files shipped in the container)
trust_label
UPDATED 2026-10-03 (rewritten against the NVIDIA DeepStream 9.1 documentation, last updated by NVIDIA on 2026-07-28) · NOT TESTED (no GB10 machine available during the update; no command in this lesson was run by the authors)
versions
DeepStream 9.1 · container image nvcr.io/nvidia/deepstream:9.1-triton-sbsa-dgx-spark (Ubuntu 24.04; driver 580.159.03 required for DGX Spark and bundled with the image per NVIDIA) · reference application deepstream-app · Python bindings pyds are deprecated, new Python development uses pyservicemaker
license
DeepStream is governed by the NVIDIA DeepStream End User License Agreement: read it before commercial use
language
human view: bg · english edition: /en/academy/gx10/ (same file name)
previous / next
04-122_Monitoring_Center_Dashboard.html / 04-126_Access_Control_GDPR.html
PURPOSE

Run several video streams through one GPU-accelerated DeepStream pipeline on a GB10-class server: sources are batched by nvstreammux, detected by nvinfer (TensorRT), tracked by nvtracker and reported as metadata messages through nvmsgconv and nvmsgbroker. The lesson drives the reference application deepstream-app from a configuration file, starts with the sample streams, then moves to RTSP cameras whose addresses are injected from environment variables. No capacity figures are claimed: the reader measures their own. Processing video of people has legal requirements (GDPR): a lawyer must be consulted before production use.

KEY CONCEPTS
COMMANDS / PATHS
CHECKLIST
NEXT MODULE

04-126 · Face access control and GDPR (04-126_Access_Control_GDPR.html) · series index: kagami.bg/academy/gx10/ · offer: Quick experiment (kagami.bg/stalbata/)

SOURCES
TAGS
gx10nvidia-gb10arm64deepstreamgstreamertensorrtrtspmessage-brokervideo-analytics
ОБНОВЕНО · 03.10.2026

DeepStream: много камери на GX10

Когато камерите са повече от една-две, обработката им един по един не върви. NVIDIA DeepStream събира кадрите от всички потоци в пакет и ги праща към видеокартата наведнъж. Тук го пускаме в контейнер на локален AI сървър от класа GB10, първо с примерни видеа, после с камери, а резултатите излизат като съобщения.

⏱ 2 ч Напреднали GX10 NVIDIA GB10 · ARM64 · 128 GB обща памет DeepStream 9.1 · Docker · RTSP
NVIDIA DeepStream 9.1 (контейнер)🔒 локално Брокер на съобщения (по избор)🔒 локално
🔄
ОБНОВЕНО · 03.10.2026 — какво
Урокът е преработен по документацията на NVIDIA за DeepStream 9.1. Най-важната поправка: на машина от класа GB10 DeepStream не се инсталира направо в системата — NVIDIA поддържа само контейнера. Старата версия описваше JetPack 6, DeepStream 7.0 и пакет .deb: това е за Jetson, не за тази машина. Махнахме още: инструмента tegrastats (той е за Jetson), програмирането с pyds (NVIDIA го обявява за остаряло), библиотеката за запис „направо в PostgreSQL“ (такъв адаптер не съществува — има Kafka, AMQP, Azure IoT, Redis и MQTT), ключа config-file-path (в групата за основния детектор е config-file), примерните адреси на камери, паролата в конфигурацията, пътя към модел в системна папка, таблицата с капацитет (32 или „60+“ потока), числата „~8 ms“, „18 GB“, „60 W“ и „450 FPS“ и твърдението, че 16 потока са „лесни“ — нямаха източник и измерване. Добавихме: контейнера и командата на NVIDIA, тест с примерните потоци, адреси на камери през променливи на средата, правила за пакета (batch), изпращане на съобщения към брокер, как да измериш сам и кутия за правната рамка.
⚠️
Какво не сме пускали сами
При проверката нямахме машина от класа GB10. Нито една команда от този урок не е пусната от нас — сверени са с документацията на NVIDIA, но няма етикет „ТЕСТВАНО“. Непроверени са още: пълният конфигурационен файл със списък от източници върху твоя модел и камери, наличието на библиотеката за твоя брокер вътре в контейнера и скоростта при твоя брой потоци.

01Какво ще научиш

02Преди да започнеш

💡
Защо тази машина
Процесорът ѝ е Arm с 20 ядра, видеокартата е Blackwell, а 128 GB памет са обща за двете. „1 PFLOP“ е мощност при FP4 с разреждане и не е скоростта на този урок.

03Стъпки

  1. Какво е DeepStream и как е устроен

    Защо пакети? Видеокартата върви най-добре, когато върши една голяма работа, а не много малки. DeepStream взема по един кадър от всеки поток, слага ги в пакет и ги праща наведнъж. Затова „много камери“ не означава „много програми“, а един конвейер.

    ЧастЗа какво е
    Източници (source)Приемат и декодират потоците — RTSP камери или видеофайлове
    nvstreammuxСъбира кадрите от всички източници в един пакет
    nvinferПуска модела (TensorRT) върху целия пакет
    nvtrackerДава на обектите номера, за да се знае, че е същият човек или кола от кадър на кадър
    nvmsgconv + nvmsgbrokerПревръщат резултата в съобщение и го пращат към брокер
    deepstream-appГотовото примерно приложение: целият конвейер се описва с един конфигурационен файл
    ⚠️
    Само в контейнер
    По документацията на NVIDIA инсталирането на DeepStream директно в системата на DGX Spark не се поддържа — ползва се Docker контейнерът. Ако в стар материал виждаш .deb пакет, JetPack или „DeepStream 7.0“, това е за друга машина (Jetson).
  2. Образ и контейнер

    Изтегляме образа на NVIDIA за DGX Spark. Командата за стартиране е взета от документацията; махнахме само опциите за показване на екран (машината ни е без монитор) и добавихме работна папка, в която ще слагаме своите файлове.

    bash · на машината
    mkdir -p ~/ds-work
    sudo docker pull nvcr.io/nvidia/deepstream:9.1-triton-sbsa-dgx-spark
    
    sudo docker run -it --rm --runtime=nvidia --network=host \
      -e NVIDIA_DRIVER_CAPABILITIES=compute,utility,video,graphics \
      --gpus all \
      -v "$HOME/ds-work:/work" \
      nvcr.io/nvidia/deepstream:9.1-triton-sbsa-dgx-spark

    Първото стартиране може да отнеме няколко минути — контейнерът изгражда кеш за видеокартата (по NVIDIA). Вътре системата е Ubuntu 24.04. Опцията --network=host е от документацията: контейнерът ползва мрежата на машината. Това е удобно за проба; за постоянна работа реши с кого да я делиш. Драйверът: NVIDIA изисква версия 580.159.03 за DGX Spark и казва, че е включен в образа — ⚠️ провери с nvidia-smi какво показва твоята машина.

    💡
    Особености на контейнера за DGX Spark (по NVIDIA)
    За показване на картина се поддържа само nv3dsink, а nveglglessink — не. Блокът VIC не се поддържа, затова ако включиш [tiled-display], задай compute-hw=1 (видеокартата). Ние ще работим без картина, така че нито едното не ни трябва.
  3. Първа проба с примерните потоци

    Вътре в контейнера има готови конфигурации и видеа. Ползваме примера с четири потока и го пускаме без картина: така се измерва само работата на видеокартата. (Тези две промени са от раздела на NVIDIA за измерване на производителността.)

    bash · в контейнера
    cd /opt/nvidia/deepstream/deepstream-9.1/samples/configs/deepstream-app
    cp source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display.txt my_test.txt

    Отвори my_test.txt (например с nano) и в копието задай:

    ini · my_test.txt · промените
    [tiled-display]
    enable=0
    
    [sink0]
    enable=1
    type=1
    sync=0

    Тип 1 е „фалшив“ изход (fakesink): кадрите се обработват, но не се рисуват никъде. Пусни приложението:

    bash · в контейнера
    deepstream-app -c my_test.txt

    Първия път моделът обикновено се компилира за видеокартата и това отнема време. После приложението печата кадрите в секунда за всеки поток. Спри го с Ctrl+C. ⚠️ Точните имена в примерния файл при твоята версия може да са различни — ако редовете ги няма, търси ги по име на групата в документацията на референтното приложение.

  4. Много потоци: свой конфигурационен файл

    Сега описваме потоците сами. В референтното приложение списък от източници се дава в групата [source-list], а общите им настройки — в [source-attr-all]. Две правила от NVIDIA: размерът на пакета (batch-size) в [streammux] и в основния детектор е равен на броя на източниците (по-малък или по-голям размер понякога добавя забавяне), а ширината и височината на мултиплексора са равни на размера на входния кадър.

    Адресите на камерите не са във файла. В шаблона стоят само имената на променливи; истинските адреси се вмъкват при пускане. Файлът ds_multicam.tpl се пише в работната папка на машината (~/ds-work):

    ini · ~/ds-work/ds_multicam.tpl
    [application]
    enable-perf-measurement=1
    perf-measurement-interval-sec=10
    
    [source-list]
    num-source-bins=4
    list=${CAM1_URI};${CAM2_URI};${CAM3_URI};${CAM4_URI}
    
    [source-attr-all]
    enable=1
    type=3
    num-sources=1
    gpu-id=0
    cudadec-memtype=0
    latency=100
    rtsp-reconnect-interval-sec=10
    
    [streammux]
    gpu-id=0
    live-source=1
    batch-size=4
    batched-push-timeout=40000
    width=1280
    height=720
    
    [primary-gie]
    enable=1
    gpu-id=0
    batch-size=4
    config-file=/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/config_infer_primary.txt
    
    [tracker]
    enable=1
    tracker-width=640
    tracker-height=384
    ll-lib-file=/opt/nvidia/deepstream/deepstream/lib/libnvds_nvmultiobjecttracker.so
    ll-config-file=/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/config_tracker_NvDCF_perf.yml
    
    [osd]
    enable=0
    
    [tiled-display]
    enable=0
    
    [sink0]
    enable=1
    type=1
    sync=0

    Основният детектор е примерният модел на NVIDIA от същата папка — за свой модел виж „Какво следва“. rtsp-reconnect-interval-sec=10 казва на приложението да се свърже отново, ако от камера не идват данни 10 секунди (с 0 повторното свързване е изключено). Стойностите на размерите са от примерите на NVIDIA и не са „най-добрите“ — подбират се според входа и модела.

    Първо с видеофайлове (те са вътре в контейнера). За файлове задай в шаблона live-source=0:

    bash · на машината, в ~/ds-work
    V=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
    export CAM1_URI=$V CAM2_URI=$V CAM3_URI=$V CAM4_URI=$V
    
    envsubst < ds_multicam.tpl > ds_multicam.txt
    chmod 600 ds_multicam.txt

    След това в контейнера: deepstream-app -c /work/ds_multicam.txt. Работи ли с файлове, мини към камери: върни live-source=1 и задай променливите с реалните адреси (стойностите вземи от настройките на камерите):

    bash · на машината
    export CAM1_URI='rtsp://<потребител>:<парола>@<адрес-на-камера-1>:554/<път-на-потока>'
    export CAM2_URI='rtsp://<потребител>:<парола>@<адрес-на-камера-2>:554/<път-на-потока>'
    export CAM3_URI='rtsp://<потребител>:<парола>@<адрес-на-камера-3>:554/<път-на-потока>'
    export CAM4_URI='rtsp://<потребител>:<парола>@<адрес-на-камера-4>:554/<път-на-потока>'
    
    envsubst < ds_multicam.tpl > ds_multicam.txt
    chmod 600 ds_multicam.txt
    ⚠️
    Генерираният файл съдържа пароли
    След envsubst файлът ds_multicam.txt вече има истинските адреси. Права 600, не го качвай в Git и не го пращай никому; изтрий го, когато приключиш (rm ds_multicam.txt) — шаблонът остава. За по-постоянна работа пази променливите в защитен файл с права само за теб, а не в историята на терминала.

    Започни с един поток, после два, после четири — и така намираш кой е проблемният. Когато добавяш камера, увеличи броя в num-source-bins, добави CAMn_URI към list и качи batch-size на двете места.

  5. Резултатите като съобщения към брокер

    Конвейерът може да превръща метаданните (клас, рамка, номер, време) в съобщения чрез nvmsgconv и да ги праща с nvmsgbroker. Адаптерите, които идват с DeepStream, са за Kafka, Azure IoT, AMQP 0-9-1, Redis (потоци) и MQTT. За PostgreSQL няма такъв адаптер — затова между брокера и базата стои малък потребител (consumer): програма, която чете темата и пише в таблицата. Например таблицата security_events от урока за таблото; в n8n също има възли за някои брокери (виж документацията му).

    Втори изход в конфигурацията (type=6 е „преобразувател на съобщения + брокер“):

    ini · добавка към ds_multicam.tpl
    [sink1]
    enable=1
    type=6
    msg-conv-config=<път-до-конфигурацията-на-msgconv>
    msg-conv-payload-type=0
    msg-broker-proto-lib=/opt/nvidia/deepstream/deepstream/lib/libnvds_kafka_proto.so
    msg-broker-conn-str=<адрес-на-брокера>;<порт>
    topic=<тема>

    Свържи го с твоя брокер: библиотеката е за Kafka; за Redis или MQTT избери съответната (виж раздела за протоколните адаптери на nvmsgbroker). Адаптерът за Kafka ползва librdkafka, а тя трябва да е инсталирана — ⚠️ не сме проверявали дали е вътре в образа. Файлът със схемата за msg-conv-config идва от примера deepstream-test5 на NVIDIA; пътят зависи от версията, затова не го даваме.

    В съобщението има метаданни (клас, рамка, номер на обект, време), а не кадри. Това е добра практика и за правния преглед: по-малко данни, по-лесно обосноваване.

  6. Измери сам

    Колко потока издържа машината ти зависи от модела, размера на кадъра, кодека, камерите и от това дали рисуваш картина. Затова в урока няма наши числа. Какво да направиш:

    • Остави enable-perf-measurement=1 — приложението печата кадрите в секунда за всеки поток през perf-measurement-interval-sec секунди.
    • Изключи картината ([osd], [tiled-display] и изходен фалшив sink), както по-горе: така NVIDIA прави своите измервания.
    • Добавяй потоци един по един и гледай кога кадрите на всеки поток падат под нужните ти.
    • В друг терминал на машината следи nvidia-smi и docker stats. На GB10 „Memory-Usage: Not Supported“ в nvidia-smi е нормално — паметта е обща. tegrastats е за Jetson и тук не се ползва.
    • При дълго натоварване следи температурата и проветряването — NVIDIA напомня, че пиковата производителност иска добро охлаждане.
    Модел (измерване на NVIDIA на DGX Spark)Вход · точностТракерКадри/сек
    RT-DETR640×640 · FP16няма192
    RT-DETR640×640 · FP16NvDCF190
    PeopleNet 2.6.3640×640 · FP16MV3DT341
    TrafficCamNet Transformer Lite544×960 · FP16NvDCF144

    Това са числа на NVIDIA (цялото приложение, без изобразяване, върху техен тестов видеоклип) — не са брой потоци и не са наши. Те само показват порядъка; твоите данни ще излязат различни.

  7. Хората в кадъра: правна рамка

    ⚖️
    Записът и анализът на хора имат правни изисквания
    Видеонаблюдението, включително автоматичното откриване на хора в много камери, е обработване на лични данни и попада под правилата за защита на личните данни (GDPR) и българското право. Основание, информиране на хората, срок на съхранение, достъп до данните и права на засегнатите зависят от обекта и целта. Препоръка: преди да пуснеш система с реални камери, провери с юрист и запиши решенията му. Този урок е технически и не е правна консултация.
    • Пази само метаданни (клас, рамка, време) — не кадри и не лица.
    • Пази данните колкото е нужно и не повече, и ограничи кой има достъп до брокера и до базата.
    • Информирай хората на обекта по начина, който юристът ти препоръча.

04Проверка

Тест

1. Как се пуска DeepStream 9.1 на машина от класа GB10 според NVIDIA?

2. Защо задаваме batch-size равен на броя на източниците?

3. Може ли DeepStream да пише съобщенията направо в PostgreSQL чрез готов адаптер?

4. Къде е правилно да стои адресът на камерата с паролата?

5. Какво е най-разумното преди пускането на система с реални камери?

05Какво следва

Свързани: съобщенията от тази стъпка могат да захранят таблото със Grafana, а основите на откриването — урокът за YOLO11. За свой модел в DeepStream виж раздела „Using a Custom Model“ в документацията на NVIDIA. Ако пишеш на Python, NVIDIA насочва новата разработка към pyservicemaker, а не към остарелия pyds.

06Източници

  1. NVIDIA DeepStream: инсталиране 🔒 локално — раздел „DGX Spark“: само Docker, образът, особености.
  2. DeepStream: бърз старт · контейнери · примерни конфигурации и потоци.
  3. DeepStream: референтно приложение deepstream-app — групи и ключове на конфигурацията.
  4. Gst-nvmsgbroker — протоколни адаптери (Kafka, Azure IoT, AMQP, Redis, MQTT).
  5. DeepStream: производителност — таблицата за DGX Spark и настройките за измерване.
  6. Python привързвания (остарели) · Service Maker за Python.
  7. DeepStream: лицензно споразумение (EULA).
  8. NVIDIA DGX Spark: хардуер · ASUS Ascent GX10: технически данни — процесор, обща памет, 1 PFLOP при FP4.