4862247fe2
Заменяет cudaMalloc + cudaIpcGetMemHandle на cuMemCreate (VMM) +
cuMemExportToShareableHandle(POSIX_FILE_DESCRIPTOR). FDs передаются consumer'у
через sendmsg(SCM_RIGHTS) в handshake. Frigate (s6-overlay не даёт share PID)
и любой другой consumer работают БЕЗ pid namespace share — только volume mount
unix socket'a /run/cuframes и IPC share для /dev/shm header.
Sync: cudaEventRecord+IPC events → cuStreamSynchronize в do_publish.
Producer ждёт ~1 ms что stream flush'нулся, потом atomic_store(seq).
Consumer читает seq через memory_order_acquire и копирует DtoD без
event wait — HW coherence гарантирована на одном GPU.
ABI break (согласован с user'ом):
- magic 0xCC7C1DCC → 0xCC7C1DCE (старые consumers fail cleanly)
- protocol V3 → V4
- libcuframes.so.0 SOVERSION остаётся, но .so.0.3.0 → .so.0.4.0
- EXTERNAL ownership убран (VMM требует cuMemCreate-allocated memory,
нельзя export'нуть произвольный cudaMalloc-pointer как POSIX FD)
- cuframes-rtsp-source переведён на LIBRARY mode + один D2D memcpy
в acquire'нутый slot (overhead малый — публишер всё равно делал такой
D2D из FFmpeg hwframe pool в EXTERNAL pool раньше)
Размер: granularity 2 MB на 5090 → NV12 1920×1080 (~3.1 MB) округляется до
4 MB, +1 MB на slot × 16 × 4 камеры = +64 MB VRAM. Терпимо.
Packet ring (cuframes_packets://) НЕ затронут — отдельный SHM с своим
magic, работает как раньше.
PoC + smoke в spike/:
- vmm_fd_pingpong/ — minimal cuMemCreate+FD round-trip
- smoke_v04/ — full publisher+subscriber, 100/100 frames без pid share
Base image: Dockerfile.runtime → CUDA 12.4 (был 13.0). Matching prod
pipeline + Frigate base, иначе libcudart conflict при load.
Compose stack (localhost-infra repo) — параллельный commit:
- убран pid: container:cuframes-pub-parking из subscribers
- image теги: gx/cuframes:0.4, gx/cuda-grid-pipeline:phase8,
gx/frigate:cuframes-v0.4
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
60 lines
2.5 KiB
Docker
60 lines
2.5 KiB
Docker
# Runtime-образ для cuframes — содержит:
|
|
# - libcuframes.so (built из dev-stage)
|
|
# - cuframes-rtsp-source bin
|
|
# - sub_count example bin
|
|
# - минимальный CUDA runtime + ffmpeg libs (без nvcc и headers)
|
|
#
|
|
# Не для разработки! Для dev — docker/Dockerfile.dev.
|
|
#
|
|
# Build:
|
|
# docker build -f docker/Dockerfile.runtime -t gx/cuframes:0.1 .
|
|
#
|
|
# Run (publisher):
|
|
# docker run --rm -it --runtime=nvidia --ipc=shareable \
|
|
# -v cuframes_sock:/run/cuframes \
|
|
# gx/cuframes:0.1 \
|
|
# /usr/local/bin/cuframes-rtsp-source --rtsp ... --key ...
|
|
|
|
# ─── Build stage ─────────────────────────────────────────────────────────
|
|
# CUDA 12.4 — matching ffmpeg-vf-cuda-grid base + Frigate stable-tensorrt
|
|
FROM nvidia/cuda:12.4.1-devel-ubuntu22.04 AS build
|
|
|
|
ENV DEBIAN_FRONTEND=noninteractive
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
build-essential cmake ninja-build pkg-config \
|
|
libavcodec-dev libavformat-dev libavutil-dev \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
WORKDIR /src
|
|
COPY . /src
|
|
RUN cmake -B build -S . -G Ninja \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DBUILD_TESTING=OFF \
|
|
-DBUILD_EXAMPLES=ON \
|
|
-DBUILD_TOOLS=ON \
|
|
-DBUILD_PYTHON_BINDINGS=OFF \
|
|
-DBUILD_FFMPEG_FILTER=OFF \
|
|
&& cmake --build build --parallel
|
|
|
|
# ─── Runtime stage ────────────────────────────────────────────────────────
|
|
FROM nvidia/cuda:12.4.1-runtime-ubuntu22.04 AS runtime
|
|
|
|
ENV DEBIAN_FRONTEND=noninteractive
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
libavcodec58 libavformat58 libavutil56 \
|
|
ca-certificates \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# libcuframes.so → /usr/local/lib (стандартный путь для ldconfig)
|
|
COPY --from=build /src/build/libcuframes/libcuframes.so* /usr/local/lib/
|
|
COPY --from=build /src/include/cuframes /usr/local/include/cuframes
|
|
COPY --from=build /src/build/tools/cuframes-rtsp-source/cuframes-rtsp-source \
|
|
/usr/local/bin/
|
|
COPY --from=build /src/build/examples/sub_count/sub_count \
|
|
/usr/local/bin/
|
|
|
|
RUN ldconfig
|
|
|
|
# Default — print help, чтобы случайный `docker run` показал что это
|
|
CMD ["/usr/local/bin/cuframes-rtsp-source", "--help"]
|