์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

NVIDIA Jetson ๊ธฐ๋ฐ˜ DeepStream ํŒŒ์ดํ”„๋ผ์ธ RTSP ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ํ•ด๊ฒฐ ๋ฐ NVMM Zero-Copy ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ๊ฐ€์ด๋“œ

๊ฒŒ์ž„๊ต์ˆ˜ 2026. 9. 4. 10:01
๋ฐ˜์‘ํ˜•

๐ŸŒ English Abstract

This comprehensive technical guide addresses RTSP stream decoding buffer overflow issues and frame drop phenomena in NVIDIA Jetson-based DeepStream SDK pipelines. It explores the internal mechanics of hardware-accelerated video decoding, GStreamer queue dynamics, and network jitter handling. Furthermore, it details memory optimization strategies using NVMM (NVIDIA Video Memory Manager) and Zero-Copy architecture to minimize CPU-GPU memory copy overhead in edge AI applications.

NVIDIA Jetson ์ž„๋ฒ ๋””๋“œ ๋””๋ฐ”์ด์Šค(Embedded Device)์—์„œ ๋ฉ€ํ‹ฐ์ฑ„๋„ RTSP(Real-Time Streaming Protocol) ์นด๋ฉ”๋ผ ์ŠคํŠธ๋ฆผ์„ ์ž…๋ ฅ๋ฐ›์•„ ์‹ค์‹œ๊ฐ„ ๋น„์ „ AI ์ธํผ๋Ÿฐ์Šค(Inference) ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ๋•Œ ๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ์ง๋ฉดํ•˜๋Š” ๋ฌธ์ œ๋Š” ํ”„๋ ˆ์ž„ ์œ ์‹ค(Frame Drop)๊ณผ ๋น„๋””์˜ค ๋””์ฝ”๋”ฉ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(Buffer Overflow)์ž…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๋ณ€๋™์„ฑ์œผ๋กœ ์ธํ•œ ์ง€ํ„ฐ(Jitter)๋‚˜ ๋””์ฝ”๋”ฉ ๋ฐ ํ”„๋ ˆ์ž„ ์ „์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ณ‘๋ชฉ์€ ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์˜ ํŒŒ์ดํ”„๋ผ์ธ ๋ ˆ์ดํ„ด์‹œ(Latency)๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ๊ณ ํ™”์งˆ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ์‹œ ์‹œ์Šคํ…œ ๋‹ค์šด์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

๋ณธ ํฌ์ŠคํŒ…์—์„œ๋Š” NVIDIA DeepStream SDK ํŒŒ์ดํ”„๋ผ์ธ ๋‚ด์—์„œ ๋””์ฝ”๋”ฉ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‹ฌ์ธต ๋ถ„์„ํ•˜๊ณ , NVIDIA ๋น„๋””์˜ค ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์ž(NVMM, NVIDIA Video Memory Manager)๋ฅผ ํ™œ์šฉํ•œ **Zero-Copy(์ œ๋กœ ์นดํ”ผ)** ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ๊ธฐ๋ฒ• ๋ฐ ์„ค์ • ํŒŒ๋ผ๋ฏธํ„ฐ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์„ ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค.



1. RTSP ์ŠคํŠธ๋ฆผ ๋””์ฝ”๋”ฉ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ์˜ ์›์ธ๊ณผ ์ฆ์ƒ

์—ฃ์ง€ ์ปดํ“จํŒ…(Edge Computing) ํ™˜๊ฒฝ์—์„œ IP ์นด๋ฉ”๋ผ๋Š” ๋„คํŠธ์›Œํฌ ์ƒํƒœ์— ๋”ฐ๋ผ ํŒจํ‚ท ๋„๋‹ฌ ์‹œ๊ฐ„์ด ๋ถˆ๊ท ์ผํ•ด์ง€๋Š” ์ง€ํ„ฐ(Jitter) ํ˜„์ƒ์„ ๊ฒช์Šต๋‹ˆ๋‹ค. DeepStream ํŒŒ์ดํ”„๋ผ์ธ ๋‚ด๋ถ€์—์„œ ์ด๋Ÿฌํ•œ ์‹ค์‹œ๊ฐ„ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์„ ์ ์ ˆํžˆ ์ œ์–ดํ•˜์ง€ ๋ชปํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€. GStreamer ํ(Queue) ์š”์†Œ์˜ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ

DeepStream์€ ๊ธฐ๋ณธ์ ์œผ๋กœ GStreamer ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์Šคํƒ์—์„œ ๋ฐ์ดํ„ฐ ํŒจํ‚ท์„ ์ˆ˜์‹ ํ•˜๋Š” rtspsrc ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ˆ˜์‹ ๋œ RTP ํŒจํ‚ท์„ ๋‚ด๋ถ€ ๋ฒ„ํผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋ฐฑ์—”๋“œ์˜ ๋””์ฝ”๋”(nvv4l2decoder)๋‚˜ ์ถ”๋ก  ์—”์ง„(nvinfer)์ด ํ”„๋ ˆ์ž„์„ ์†Œ๋น„ํ•˜๋Š” ์†๋„๋ณด๋‹ค ๋„คํŠธ์›Œํฌ ์ˆ˜์‹  ์†๋„๊ฐ€ ์ผ์ • ์ˆœ๊ฐ„ ๋นจ๋ผ์ง€๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ง€์—ฐ๋˜๋ฉด Queue ๋‚ด๋ถ€์— ํŒจํ‚ท์ด ์Œ“์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ ๋ฒ„ํผ ํ•œ๊ณ„ ๋„๋‹ฌ: Queue์˜ max-size-buffers, max-size-bytes, max-size-time ํ•œ๊ณ„์— ๋„๋‹ฌํ•˜๋ฉด ์‹ ๊ทœ ๋“ค์–ด์˜ค๋Š” ํŒจํ‚ท์ด ๊ฐ•์ œ๋กœ ๋ฒ„๋ ค์ง‘๋‹ˆ๋‹ค.
  • ์ฆ์ƒ: ํ™”๋ฉด ๊นจ์ง(Artifacts), ๋น„๋””์˜ค ํŠธ๋ž˜ํ‚น ์—ฐ์‡„ ํŒŒ์†, GST_WARNING ๋กœ๊ทธ ๋ฐ ํ”„๋ ˆ์ž„ ๋“œ๋กญ ๋ฐœ์ƒ.

๋‚˜. nvv4l2decoder์™€ hardware Surface ํ• ๋‹น ๋ฌธ์ œ

Jetson์˜ ํ•˜๋“œ์›จ์–ด ๋น„๋””์˜ค ๋””์ฝ”๋”(NVDEC)๋Š” ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ๊ณ ์ •๋œ ์ˆ˜์˜ NVMM ์บก์ฒ˜ ๋ฒ„ํผ(Capture Buffers)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. downstream ํ”Œ๋Ÿฌ๊ทธ์ธ(์˜ˆ: nvstreammux)์ด ์ด์ „ ํ”„๋ ˆ์ž„์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์„œํ”ผ์Šค(Surface)๋ฅผ ์ ์‹œ์— ํ•ด์ œ(Release)ํ•˜์ง€ ์•Š๊ณ  ์˜ค๋žซ๋™์•ˆ ์ฅ๊ณ  ์žˆ์œผ๋ฉด, ๋””์ฝ”๋”๋Š” ์ƒˆ ํ”„๋ ˆ์ž„์„ ๋ณตํ˜ธํ™”ํ•  ๋นˆ ๋ฒ„ํผ๋ฅผ ํ™•๋ณดํ•˜์ง€ ๋ชปํ•ด ๊ฒฐ๊ตญ ํ”„๋ ˆ์ž„์„ ๋ฒ„๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

2. NVMM(NVIDIA Video Memory Manager) ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์™€ Zero-Copy ์›๋ฆฌ

Jetson ๋ชจ๋“ˆ(Jetson Orin, Xavier ๋“ฑ)์€ CPU์™€ GPU๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋™์ผํ•œ LPDDR DRAM์„ ๊ณต์œ ํ•˜๋Š” ํ†ตํ•ฉ ๋ฉ”๋ชจ๋ฆฌ ์•„ํ‚คํ…์ฒ˜(Unified Memory Architecture)๋ฅผ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์†Œํ”„ํŠธ์›จ์–ด ๋ ˆ์ด์–ด์—์„œ๋Š” Linux OS ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ(System RAM)์™€ NVIDIA ํ•˜๋“œ์›จ์–ด ๊ฐ€์†๊ธฐ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” NVMM ์˜์—ญ์œผ๋กœ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

๊ฐ€. ์ผ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ vs NVMM Zero-Copy ๋น„๊ต

DeepStream ํŒŒ์ดํ”„๋ผ์ธ ์ตœ์ ํ™”์˜ ํ•ต์‹ฌ์€ ๋ฐ์ดํ„ฐ๋ฅผ System RAM์œผ๋กœ ์ฝ์–ด ๋“ค์ธ ํ›„ CUDA ๋ฉ”๋ชจ๋ฆฌ๋กœ cudaMemcpy๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋น„ํšจ์œจ์ ์ธ ์—ฐ์‚ฐ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ ์ผ๋ฐ˜ ๋น„๋””์˜ค ํŒŒ์ดํ”„๋ผ์ธ (Host Memory) NVMM Zero-Copy ํŒŒ์ดํ”„๋ผ์ธ
๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ Host OS Memory (RAM) NVMM (Hardware DPA/DMA Mapped)
๋ฐ์ดํ„ฐ ์ด๋™ Network โ†’ RAM โ†’ GPU VRAM (๋ณต์‚ฌ 2ํšŒ ์ด์ƒ) Network โ†’ NVMM (Zero CPU Copy)
CPU ์ ์œ ์œจ ๋†’์Œ (Memory Copy Overhead) ๊ทน๋„๋กœ ๋‚ฎ์Œ (DMA ๊ธฐ๋ฐ˜ ์ด๋™)
์ฒ˜๋ฆฌ ์ง€์—ฐ (Latency) ๋†’์Œ (์ง€์—ฐ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ) ์ดˆ์ €์ง€์—ฐ (Ultra-low Latency)

๋‚˜. NvBufSurface ๋ฐ NVMM ํฌ์ธํ„ฐ ์ฒ˜๋ฆฌ

NVMM ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ํ”„๋ ˆ์ž„ ๋ฐ์ดํ„ฐ๋Š” NvBufSurface ๊ตฌ์กฐ์ฒด๋กœ ์ถ”์ƒํ™”๋ฉ๋‹ˆ๋‹ค. DeepStream ํŒŒ์ดํ”„๋ผ์ธ ์ƒ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์€ ์‹ค์ œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ(Pixels)๋ฅผ ์ง์ ‘ ์ฃผ๊ณ ๋ฐ›๋Š” ๋Œ€์‹ , NvBufSurface์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ•ธ๋“ค ํฌ์ธํ„ฐ(Pointer)๋งŒ ํ†ต๊ณผ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ”„๋ ˆ์ž„ ๋ณต์‚ฌ ๋น„์šฉ์„ ์™„์ „ํžˆ ์—†์• ๋Š” **Zero-Copy(์ œ๋กœ ์นดํ”ผ)**๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.



3. ์‹ค์ ์šฉ ํ•ด๊ฒฐ์ฑ…: DeepStream ํŒŒ์ดํ”„๋ผ์ธ ์ตœ์ ํ™” ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

RTSP ์ŠคํŠธ๋ฆผ ์œ ์‹ค ๋ฌธ์ œ ๋ฐ ๋””์ฝ”๋” ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ DeepStream ์„ค์ • ๋ฐ ์ฝ”๋“œ ๋ ˆ๋ฒจ ์ตœ์ ํ™” ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค.

๊ฐ€. RTSP ์†Œ์Šค ํŒŒ๋ผ๋ฏธํ„ฐ(rtspsrc) ๋ฏธ์„ธ ์กฐ์ •

RTSP ์ž…๋ ฅ ์ˆ˜์‹ ๋ถ€์ธ rtspsrc ์š”์†Œ์—๋Š” ์ง€ํ„ฐ ๋ฒ„ํผ(Jitter Buffer) ๊ด€๋ จ ์†์„ฑ์„ ํ•„์ˆ˜๋กœ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • latency: ๊ธฐ๋ณธ๊ฐ’(200ms)์ด ๋„ˆ๋ฌด ์ž‘์„ ๊ฒฝ์šฐ ๋„คํŠธ์›Œํฌ ๋ณ€๋™ ์‹œ ํ”„๋ ˆ์ž„์ด ๋Œ€๋Ÿ‰ ๋“œ๋กญ๋ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์— ๋งž์ถ”์–ด 500ms~1000ms ์ˆ˜์ค€์œผ๋กœ ์ƒํ–ฅ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • drop-on-latency: true ์„ค์ • ์‹œ, ์ง€์ •๋œ ์ง€์—ฐ์‹œ๊ฐ„(Latency)์„ ์ดˆ๊ณผํ•œ ์˜ค๋ž˜๋œ ํŒจํ‚ท์„ ์ฆ‰์‹œ ํŒŒ๊ธฐํ•˜์—ฌ ์ „์ฒด ์‹œ์Šคํ…œ ์ถ”๋ก  ์ง€์—ฐ์ด ๋ˆ„์ ๋˜๋Š” ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • protocols: UDP ํŒจํ‚ท ์†์‹ค์ด ์žฆ์€ ํ™˜๊ฒฝ์ด๋ผ๋ฉด ์•ˆ์ •์ ์ธ TCP(0x04) ํ”„๋กœํ† ์ฝœ๋กœ ๊ฐ•์ œ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜. nvstreammux ์š”์†Œ ๋ฐฐ์น˜ ๋ฐ ๋ฒ„ํผ ๊ด€๋ฆฌ ์ตœ์ ํ™”

์—ฌ๋Ÿฌ RTSP ์ฑ„๋„์„ ํ•˜๋‚˜์˜ ๋ฐฐ์น˜๊ฐ€๊ณต(Batching)์œผ๋กœ ํ•ฉ์ณ์ฃผ๋Š” nvstreammux ์„ค์ • ๋˜ํ•œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ์ค„์ด๋Š” ํ•ต์‹ฌ ์ง€์ ์ž…๋‹ˆ๋‹ค.

  • batched-push-timeout: ๋ฐฐ์น˜ ํฌ๊ธฐ(Batch Size)๊ฐ€ ๋‹ค ์ฑ„์›Œ์ง€์ง€ ์•Š๋”๋ผ๋„ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ํ”„๋ ˆ์ž„์„ ๋ฐ€์–ด๋‚ด๋Š” ํƒ€์ž„์•„์›ƒ ์‹œ๊ฐ„(๋งˆ์ดํฌ๋กœ์ดˆ)์ž…๋‹ˆ๋‹ค. RTSP ์ŠคํŠธ๋ฆผ์˜ FPS์— ๋งž์ถฐ ์กฐ์ ˆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: 30fps์ธ ๊ฒฝ์šฐ 1000000 / 30 = 33333 us)
  • live-source: RTSP ๊ฐ™์€ ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ์‹œ ๋ฐ˜๋“œ์‹œ 1(true)๋กœ ์„ค์ •ํ•ด์•ผ ๋””์ฝ”๋” ํƒ€์ž„์Šคํƒฌํ”„ ๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐฉ์ง€๋ฉ๋‹ˆ๋‹ค.
  • nvbuf-memory-type: Jetson ํ™˜๊ฒฝ์—์„œ๋Š” 0 (NVBUF_MEM_DEFAULT / NVBUF_MEM_CUDA_PINNED) ๋˜๋Š” 4 (NVBUF_MEM_SURFACE_ARRAY)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ NVMM ํ• ๋‹น ์œ ํ˜•์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

๋‹ค. Queue ๋ฒ„ํผ ํฌ๊ธฐ์™€ Drop ์†์„ฑ ํŒŒ์ดํ”„๋ผ์ธ ์ ์šฉ ์˜ˆ์‹œ

GStreamer ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ์‹œ rtspsrc ๋’ค์™€ nvv4l2decoder ์•ž์— ์ ์ ˆํ•œ Queue ์†์„ฑ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

rtspsrc location=rtsp://192.168.1.100:554/stream latency=500 drop-on-latency=true protocols=tcp ! \
rtph264depay ! h264parse ! \
queue max-size-buffers=16 max-size-bytes=0 max-size-time=0 leaky=2 ! \
nvv4l2decoder num-extra-surfaces=8 ! \
nvvideoconvert nvbuf-memory-type=0 ! \
nvstreammux name=mux batch-size=4 width=1920 height=1080 batched-push-timeout=33333 live-source=1 ! \
nvinfer config-file-path=config_infer.txt ! \
nvstreamdemux name=demux ...

์œ„ ์˜ˆ์‹œ์—์„œ leaky=2 (downstream/downstream leaky) ์†์„ฑ์€ Queue ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“ ์ฐจ๋ฉด ์˜ค๋ž˜๋œ ํŒจํ‚ท์„ ๋ฒ„๋ฆผ์œผ๋กœ์จ ๋””์ฝ”๋” ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ ์ธํ•ด ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์ด ๋ฉˆ์ถ”๋Š” ๋ฐ๋“œ๋ฝ(Deadlock) ์ƒํƒœ๋ฅผ ์˜ˆ๋ฐฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ num-extra-surfaces=8 ์†์„ฑ์„ ํ†ตํ•ด ๋””์ฝ”๋” ๋‚ด๋ถ€ ๋น„๋””์˜ค ๋ฉ”๋ชจ๋ฆฌ ๋ฒ„ํผ ๊ฐœ์ˆ˜๋ฅผ ๋Š˜๋ ค ์ˆœ๊ฐ„์ ์ธ ๋ณ‘๋ชฉ ์‹œ ๋“œ๋กญ์„ ์™„ํ™”ํ•ฉ๋‹ˆ๋‹ค.

4. Custom Plugin ๋ฐ C/C++ Python ํ”„๋กœ๋ธŒ์—์„œ์˜ NVMM ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๊ทœ์น™

GStreamer ๋ฒ„์Šค ํ”„๋กœ๋ธŒ(Probe)๋‚˜ ์ปค์Šคํ…€ C/C++ ๋˜๋Š” Python ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐœ๋ฐœํ•  ๋•Œ Zero-Copy ์ตœ์ ํ™” ์›์น™์„ ๊นจ๋œจ๋ฆฌ๋Š” ์‹ค์ˆ˜๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€. ์ ˆ๋Œ€ ํ•˜์ง€ ๋ง์•„์•ผ ํ•  ์ ‘๊ทผ (Anti-Pattern)

ํ”„๋กœ๋ธŒ ํ•จ์ˆ˜ ์•ˆ์—์„œ NvBufSurfaceMap์„ ํ˜ธ์ถœํ•œ ๋’ค, CPU ํ˜ธ์ŠคํŠธ ๋ฉ”๋ชจ๋ฆฌ(System RAM)๋กœ ๋ฐ์ดํ„ฐ๋ฅผ memcpy ํ•˜์—ฌ OpenCV cv::Mat์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋™์ž‘์€ Zero-Copy ๊ตฌ์กฐ๋ฅผ ๋ฌด๋„ˆ๋œจ๋ฆฝ๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ์ฑ„๋„ 1080p ํ™˜๊ฒฝ์—์„œ ์ด ์ž‘์—…์€ ์ฆ‰๊ฐ์ ์ธ CPU ๋ณ‘๋ชฉ๊ณผ ํ•จ๊ป˜ ๋””์ฝ”๋” ๋ฒ„ํผ ๋น„์›Œ์ง ์ง€์—ฐ์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

๋‚˜. ์˜ฌ๋ฐ”๋ฅธ NVMM ๊ธฐ๋ฐ˜ GPU ์ง์ ‘ ์ฒ˜๋ฆฌ (Correct Pattern)

์ด๋ฏธ์ง€ ๋ณ€ํ™˜์ด๋‚˜ ์ „์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ˜ธ์ŠคํŠธ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ ๋Œ€์‹ , NVMM ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ(Device Pointer)๋ฅผ ๊ทธ๋Œ€๋กœ ์ปค์Šคํ…€ CUDA ์ปค๋„(CUDA Kernel)์ด๋‚˜ VPI(Video Processing Interface) ๋˜๋Š” OpenCV CUDA ๋ชจ๋“ˆ(cv::cuda::GpuMat)์— ์ง์ ‘ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

// C++ DeepStream Probe ์˜ˆ์‹œ
static GstPadProbeReturn
crop_probe_callback(GstPad *pad, GstPadProbeInfo *info, gpointer u_data) {
    GstBuffer *buf = (GstBuffer *)info->data;
    NvBufSurface *surface = NULL;
    GstMapInfo in_map_info;

    gst_buffer_map(buf, &in_map_info, GST_MAP_READ);
    surface = (NvBufSurface *)in_map_info.data;

    // Zero-Copy: CUDA ๋ฉ”๋ชจ๋ฆฌ ํฌ์ธํ„ฐ ์ง์ ‘ ์ฐธ์กฐ
    void *cuda_dev_ptr = surface->surfaceList[0].dataPtr;
    
    // ํ˜ธ์ŠคํŠธ ๋ณต์‚ฌ(memcpy) ์—†์ด CUDA ์ปค๋„ ์ง์ ‘ ์‹คํ–‰
    launch_custom_cuda_kernel(cuda_dev_ptr, surface->surfaceList[0].width, surface->surfaceList[0].height);

    gst_buffer_unmap(buf, &in_map_info);
    return GST_PAD_PROBE_OK;
}

5. ์—ฃ์ง€ ์ผ€์ด์Šค ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋ฒ•

๊ฐ€. Tegrastat ๋ฐ DeepStream SDK ๋„๊ตฌ๋ฅผ ํ†ตํ•œ ๋ฌธ์ œ ๊ฐ์ง€

ํŒŒ์ดํ”„๋ผ์ธ ์ƒ์˜ ๋””์ฝ”๋” ๋ณ‘๋ชฉ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด Jetson CLI ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์ธ tegrastat ๋ช…๋ น์–ด๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • NVDEC ์‚ฌ์šฉ๋ฅ  ํ™•์ธ: NVDEC 0% ๋˜๋Š” ์ง€์†์ ์ธ 100% ์œ ์ง€๋Š” ๋””์ฝ”๋” ์ž…๋ ฅ ๋ถ€์กฑ ๋˜๋Š” ์ฒ˜๋ฆฌ ํ•œ๊ณ„ ๋„๋‹ฌ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • RAM vs RAM_NVM ๋ถ„์„: SWAP ๋ฉ”๋ชจ๋ฆฌ ์ ์œ ๊ฐ€ ๋Š˜์–ด๋‚˜๊ฑฐ๋‚˜ RAM ์‚ฌ์šฉ๋Ÿ‰์ด ์ง€์† ์ƒ์Šนํ•˜๋ฉด NVMM Surface ํ•ด์ œ ๋ˆ„์ˆ˜(Memory Leak)๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

๋‚˜. ๋„คํŠธ์›Œํฌ ์žฌ์—ฐ๊ฒฐ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€

RTSP ๋‹จ์„  ๋ฐ ์žฌ์—ฐ๊ฒฐ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ๊ธฐ์กด ํŒŒ์ดํ”„๋ผ์ธ์˜ rtspsrc ์š”์†Œ๋ฅผ ์ •์ƒ์ ์œผ๋กœ GST_STATE_NULL๋กœ ์ „ํ™˜ํ•œ ํ›„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. NVMM ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ƒˆ๋กœ์šด RTSP ์ ‘์†์„ ์‹œ๋„ํ•˜๋ฉด HW ๋””์ฝ”๋”์˜ ๋ฒ„ํผ ํ’€(Buffer Pool)์ด ๊ณ ๊ฐˆ๋˜์–ด ๋””์ฝ”๋”ฉ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฌดํ•œ ๋ฐ˜๋ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



๊ฒฐ๋ก 

NVIDIA Jetson ๊ธฐ๋ฐ˜ DeepStream ํŒŒ์ดํ”„๋ผ์ธ์˜ ์‹ค์‹œ๊ฐ„์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ํ”„๋ ˆ์ž„ ์œ ์‹ค์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋„คํŠธ์›Œํฌ ๋ ˆ์ด์–ด์˜ ์ง€ํ„ฐ ์™„ํ™”์™€ GPU ๊ฐ€์† ๋””์ฝ”๋” ๋ฒ„ํผ ๊ด€๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  **NVMM Zero-Copy ๋ฉ”๋ชจ๋ฆฌ ์•„ํ‚คํ…์ฒ˜**์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์ดํ•ด๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

๋ณธ ๊ฐ€์ด๋“œ์—์„œ ์ œ์‹œํ•œ rtspsrc ์ง€์—ฐ์‹œ๊ฐ„ ์˜ต์…˜, nvv4l2decoder ๋ฒ„ํผ ํ™•์žฅ, Queue์˜ leaky ์„ค์ •, ๊ทธ๋ฆฌ๊ณ  CUDA Device Pointer ์ง์ ‘ ์—ฐ์‚ฐ ํŒจํ„ด์„ ์ ์šฉํ•˜๋ฉด, ๋‹ค์ค‘ RTSP ์ŠคํŠธ๋ฆผ ํ™˜๊ฒฝ์—์„œ๋„ ์œ ์‹ค ์—†์ด ์•ˆ์ •์ ์ด๊ณ  ํšจ์œจ์ ์ธ ์—ฃ์ง€ AI ๋น„์ „ ํŒŒ์ดํ”„๋ผ์ธ์„ ์šด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•